基於Pierre Dellacherie的俄羅斯方塊-05Pierre Dellacherie演演算法

2023-03-16 12:00:58

基於Pierre Dellacherie的俄羅斯方塊-05Pierre Dellacherie演演算法

  1. Pierre Dellacherie演演算法感覺上像是一個遍歷演演算法,給與各個引數不同的權重,使得更加合理的擺放方塊

  2. 評估主要是6個引數:

    1. LandingHeight:下落後的高度,方塊最後不能下落之後,方塊的重心(也就是中心點的高度),相當於高度越低越安全,我這裡並沒有記錄每一個圖形的中心點,統一為高度減去1,如圖小方塊Z下落之後高度為4,我這裡需要重心,我就選擇重心 - 1 = 3

    2. ErodedPieceCellsMetric:消除貢獻值=消除行數該方塊參與消除的格子數。
      例如,該情況下消除了2行,該方塊提供了2個單位的格子。那麼貢獻值=2*2=4

    3. RowTransitions:行變換數。按行遍歷,從哪一行有方塊開始計算,邊界定義為有方塊,從方塊到空記作一次變換,從空到有方塊在記作一次變化,如圖
      從有方塊開始計算從上到下一次是4 + 4+2+4

    4. BoardColTransitions:列變換數:同行變換數,只不過換成了按列遍歷。(上下兩側算做邊界)

    5. BoardBuriedHoles:空洞數,空洞指的是,每列中某個方塊下面沒有方塊的空白位置,該空白可能由 1 個單位或多個單位組成,但只要沒有被方塊隔斷,都只算一個空洞。注意,空洞的計算以列為單位,若不同列的相鄰空格連在一起,不可以將它們算作同一個空洞。如圖所示

    6. BoardWells:井數,就像是水井一樣,空白的個數。井指的是某一列中,兩邊都有方塊的連續空格,(左右兩邊看做實體)一定要注意兩邊都有方塊才能看做是井。還需要注意井深度,井的深度是連續累加的。如圖所示最右邊深度為2,就是1+2,需要把井的深度做累加,如圖所示已經標識的很清楚

    權重的話,有人用小數,我這裡為了方便計算全部乘以10作為整數計算了

#define LANDINGHEIGHT		-45
#define ROWSELIMINATED		34
#define ROWTRANSITIONS		-32
#define COLUMNTRANSITIONS	-93 
#define NUMBEROFHOLES		-79
#define WELLSUMS			-34

  1. 函數為:nValue = -45 × landingHeight + 34 × erodedPieceCellsMetric - 32 × boardRowTransitions - 93 × boardColTransitions - 79 × boardBuriedHoles - 34 × boardWells

  2. 即使所有數都會是負數,nValue 值大的為最優位置

  3. 如果出現兩個局面評分相同那怎麼辦?這個時候需要加入一個計算優先度的函數,這個也很簡單。公式: nPriority=100 * 板塊需要水平移動移動的次數 + 板塊需要選擇的次數

  4. PD演演算法的設計是 如果板塊擺放再遊戲區域的左側優先度要加上10,那是因為他的那個遊戲橫向的小方格數量是10個,是一個偶數,而他的中心點在6這個位置。nPriority值小的為最優位置

以上就是Pierre Dellacherie演演算法的全部內容

獲取某方塊的所有形態可以放置的所有位置這個才是難點

基本的實現步驟是:

  1. 先確定總共有40中可能(方塊為4中旋轉方式,依照我這個方式來說,每一種可以擺放的列的位置是 0-9,因為有的方塊的左側是空白的,所以是0開始,方塊最窄也是2,所以結尾是0)

  2. 行的話從上往下依次下降直到最後不能下降為止,就記作當前圖形

  3. 得到所有形態可以放置的所有位置,計算各個引數

  4. 計算所有位置的nValue 值和nPriority值

  5. 比較值的大小找到最優位置