2048游戏通关算法

你玩过咱们昨天介绍的HTML5 小游戏2048么?玩通关了么?若是没有玩通关过,别急,看过本文以后通关不再是难事!html

基本的算法是,若是2^k是最大的数字,那么咱们努力将2^(k-1)放在它的旁边,而后再把2^(k-2)放在2^(k-1)的旁边,以此类推。git

为了达成这一点,咱们努力将最大的数字放在角落,而后将第二大的数字放在它旁边,以此类推。将最大的数字放在角落,这样就能够留出足够的空间来组合出更大的数字。github

最终咱们指望造成这样的图形:算法

x   x   x   x
  4   2   x   x
  8   16  32  64
1024 512 256 128

这是适用于人类的算法,若是是机器呢?可使用更强力、复杂的算法。segmentfault

ovolve编写了一个针对2048的AI程序,能够自动帮你通关。函数

在机器的眼里,2048是一个回合制的游戏,是一个离散的状态空间,和象棋之类的游戏同样。所以彻底可使用成熟的极小化极大 + α-β剪枝算法。为了提高搜索的效率,考虑了两个因素:性能

  • 单调性
  • 平滑性

单调性指尽可能使各个方向上的数字保持单调(递增或递减),这样能够防止小数字被分割开来。spa

为了便于合并,相邻的块(tile)差距要尽量地小,这经过衡量平滑性来判断。code

咱们能够从图论的角度来解释平滑性。咱们能够把游戏的状态当作是G(V, E),其中V表明活动的块的集合,而E表明链接相邻块的边角,边角的差距经过函数c(v1, v2)来衡量。由于推动游戏要求相邻块数值相同,也就是说c(v1, v2)返回0。所以咱们须要尽量地减小相邻块的差距,或者说,确保移动致使各处相邻块c(v1, v2)之和最小。htm

经过这样的算法,咱们能获得大约90%的胜率,同时也有不错的性能。(没人愿意等上半天才看到AI动一步……

参考


撰文 SegmentFault

相关文章
相关标签/搜索