首页 > 编程语言 >基于Pierre Dellacherie的俄罗斯方块-05Pierre Dellacherie算法

基于Pierre Dellacherie的俄罗斯方块-05Pierre Dellacherie算法

时间:2023-03-16 11:45:04浏览次数:43  
标签:位置 05Pierre Dellacherie Pierre 算法 方块 define

基于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. 比较值的大小找到最优位置

标签:位置,05Pierre,Dellacherie,Pierre,算法,方块,define
From: https://www.cnblogs.com/ice1992/p/17221759.html

相关文章