摆放一个板块的策略是:板块放置的位置越靠下越好,方块之间越紧密越好,自身对消除行的方块贡献数量越多越好。
不可为了追求消除行数,而去造成过多的空洞,这样也是不合理的。
参数:
- landingHeight:指当前板块放置之后,板块重心距离游戏区域底部的距离。(也就是小方块的海拔高度)
- erodedPieceCellsMetric:这是消除参数的体现,他代表的是消除的行数与当前摆放的板块中被消除的小方块的格数的乘积。 举个例子:下面这个例子就是说明红色的小方块下落之后会消除2行,而且自身贡献的小方格数是3个,所以返回值是3*2=6
boardRowTransitions:对于每一行小方格,从左往右看,从无小方格到有小方格是一种“变换”,从有小方格到无小方格也是一种“变换”,这个属性是各行中“变换”之和
- 上面这张图片中用黑色边框标注的即为一次“变换”,第一行为7次变换,第二行为6次变换
boardColTransitions:这是每一列的变换次数之和
boardBuriedHoles:各列中的“空洞的小方格数之和”
- 如图所示,空洞数为6
- boardWells:各列中“井”的深度的连加和
- “井”的定义是,两边(包括边界)都有方块填充的空列。
- 如图所示,以两边的最低边为“井”的开始,图中一共有两个“井”,深度分别为2和3,
- 所以这个图返回的boardWells值应该是
(1+2)+(1+2+3)= 9
Pierre Dellacherie算法评估函数
value = -landingHeight + erodedPieceCellsMetric - boardRowTransitions - boardColTransitions - (4 * boardBuriedHoles) - boardWells
根据各指标的权重的经验值修改评估函数为:value = -45 × landingHeight + 34 × erodedPieceCellsMetric - 32 × boardRowTransitions - 93 × boardColTransitions - (79 × boardBuriedHoles) - 34 × boardWells
value值大的为最优位置,你没看错就是大的是最优,即使所有数都会是负数
要出现两个局面评分相同那怎么办呢?这个时候需要加入一个计算优先度的函数,这个也很简单。公式如下:
priority=100 * 板块需要水平移动移动的次数 + 板块需要选择的次数
(ps:可能PD算法的设计是 如果板块摆放再游戏区域的左侧优先度要加上10,那是因为他的那个游戏横向的小方格数量是10个,是一个偶数,而他的中心点在6这个位置。)priority值小的为最优位置
以上就是Pierre Dellacherie算法的全部内容
难在第一步,获取某方块的所有形态可以放置的所有位置这个才是难点。
基本的实现步骤是:
- 1. 获取某方块的所有形态可以放置的所有位置
- 2. 计算所有位置的value值和priority值
- 3. 比较值的大小找到最优位置