你玩过咱们昨天介绍的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