基于Pierre Dellacherie的俄罗斯方块-05Pierre Dellacherie算法
-
Pierre Dellacherie算法感觉上像是一个遍历算法,给与各个参数不同的权重,使得更加合理的摆放方块
-
评估主要是6个参数:
-
LandingHeight:下落后的高度,方块最后不能下落之后,方块的重心(也就是中心点的高度),相当于高度越低越安全,我这里并没有记录每一个图形的中心点,统一为高度减去1,如图小方块Z下落之后高度为4,我这里需要重心,我就选择重心 - 1 = 3
-
ErodedPieceCellsMetric:消除贡献值=消除行数该方块参与消除的格子数。
例如,该情况下消除了2行,该方块提供了2个单位的格子。那么贡献值=2*2=4 -
RowTransitions:行变换数。按行遍历,从哪一行有方块开始计算,边界定义为有方块,从方块到空记作一次变换,从空到有方块在记作一次变化,如图
从有方块开始计算从上到下一次是4 + 4+2+4 -
BoardColTransitions:列变换数:同行变换数,只不过换成了按列遍历。(上下两侧算做边界)
-
BoardBuriedHoles:空洞数,空洞指的是,每列中某个方块下面没有方块的空白位置,该空白可能由 1 个单位或多个单位组成,但只要没有被方块隔断,都只算一个空洞。注意,空洞的计算以列为单位,若不同列的相邻空格连在一起,不可以将它们算作同一个空洞。如图所示
-
BoardWells:井数,就像是水井一样,空白的个数。井指的是某一列中,两边都有方块的连续空格,(左右两边看做实体)一定要注意两边都有方块才能看做是井。还需要注意井深度,井的深度是连续累加的。如图所示最右边深度为2,就是1+2,需要把井的深度做累加,如图所示已经标识的很清楚
权重的话,有人用小数,我这里为了方便计算全部乘以10作为整数计算了
-
#define LANDINGHEIGHT -45
#define ROWSELIMINATED 34
#define ROWTRANSITIONS -32
#define COLUMNTRANSITIONS -93
#define NUMBEROFHOLES -79
#define WELLSUMS -34
-
函数为:nValue = -45 × landingHeight + 34 × erodedPieceCellsMetric - 32 × boardRowTransitions - 93 × boardColTransitions - 79 × boardBuriedHoles - 34 × boardWells
-
即使所有数都会是负数,nValue 值大的为最优位置
-
如果出现两个局面评分相同那怎么办?这个时候需要加入一个计算优先度的函数,这个也很简单。公式: nPriority=100 * 板块需要水平移动移动的次数 + 板块需要选择的次数
-
PD算法的设计是 如果板块摆放再游戏区域的左侧优先度要加上10,那是因为他的那个游戏横向的小方格数量是10个,是一个偶数,而他的中心点在6这个位置。nPriority值小的为最优位置
以上就是Pierre Dellacherie算法的全部内容
获取某方块的所有形态可以放置的所有位置这个才是难点
基本的实现步骤是:
-
先确定总共有40中可能(方块为4中旋转方式,依照我这个方式来说,每一种可以摆放的列的位置是 0-9,因为有的方块的左侧是空白的,所以是0开始,方块最窄也是2,所以结尾是0)
-
行的话从上往下依次下降直到最后不能下降为止,就记作当前图形
-
得到所有形态可以放置的所有位置,计算各个参数
-
计算所有位置的nValue 值和nPriority值
-
比较值的大小找到最优位置