⼩游戏2048最佳算法怎么实现?思路全解析!
1.简介
很多⼈都玩过2048,我就⽐较⽼套,因为我⼀向看不上这类单机游戏。但是就在某⼀天泡脚的⽆聊时光,拿了媳妇⼉的⼿机,左看看右点点,莫名打开了2048。嗯... 这真是⼀款打发⽆聊时光的 "good game"。通过滑动来使得每⾏或每列相邻并且相同的数字相加⽽得到⼀个最⼤的数字,最后的数字越⼤,得分越⾼!于是,我在想,是否能像魔⽅⼀样,有⼀定的套路来帮助我们决定每⼀步该往哪个⽅向滑动最佳,以便获得最好的成绩呢?
2.如何玩2048
2048是在4×4⽅格中玩的游戏。⽅格的每个位置都可能是空的,也可能是⼀个带有数字的⽅块。
开始游戏时,⽅格上会在随机位置产⽣两个⽅块,数字为“ 2”或“ 4”。每个⽅块都有10%的⼏率是“ 4”,否则为“2”。
通过将所有⽅块向某个⽅向(上,下,左或右)移动来进⾏游戏。这样做时,彼此相邻且⼀起移动的具有相同值的所有⽅块将合并成⼀个新的⽅块,该⽅块的值等于前两个⽅块的和:
2048游戏
进⾏滑动后,将在随机位置产⽣⼀个新的⽅块。新⽅块有 90% 的⼏率为 ”2“, 10% 的⼏率是 ”4“。
然后,继续进⾏游戏,直到⽅格中不再有能移动的⽅块为⽌。
按理来说,这游戏的⽬标是达到⼀个值为“ 2048”的⽅块就结束了。但是,we never stop,我们可以继续进⾏游戏,来争取更⼤的胜利。理论上,⽅块最⼤值为 “ 131072” 。
3.问题说明
想要解决这个游戏,是个灰常因缺斯汀的问题。因为我们不仅要正确预测每个新⽅块产⽣的位置,⽽且还要正确地预测它是“ 2”还是“ 4”。这是随机事件,理论上每⼀次都预测正确是不可能的。
因此,不可能有⼀种算法每次都能轻松⽽正确解决难题。我们能尽可能做到的玩好这个概率游戏,确定每个步骤的最佳操作。
不管什么时候,我们只能采取四种⾏为,然后⾯临的挑战是确定这四项举措中哪⼀项将取得最佳的长期效果。
我们的算法基于 [Expectimax] 算法,它本⾝是 [Minimax] 算法的⼀种变体,但是树的路由会根据它们发⽣的可能性进⾏加权。
从本质上讲,我们将游戏视为两⼈游戏:
因此,我们现在将算法简化为模拟任何给定的移动并为结果⽣成分数。
这是⼀个分为两部分的过程。第⼀步是看是否可以移动,如果不能移动,则以“ 0”的分数提前中⽌。如果可以移动,那么我们将继续进⾏真正的算法,在该算法中确定移动的效果如何:
评分流程
简单的java游戏代码
3.2 确定下⼀步⾏动
到⽬前为⽌,算法的主要部分是模拟滑动,然⽽关键的问题是:如何为每个可能的移动进⾏评分。这下就是 Expectimax 算法发挥作⽤的时候了!
我将模拟两个玩家的所有可能动作,并进⾏⼏个步骤,然后看看其中哪个能带来最佳结果。
对于⼈类玩家⽽⾔,只有“上”,“下”,“左”和“右”的这四个动作。
对于计算机则是,将“ 2”或“ 4” ⽅块随机放置在空⽩的位置:
模拟过程
算法1-2
因为使⽤的是递归算法,所以我增加了⼀个深度限制,⽤来停⽌,否则可能会⽆⽌境运⾏下去。
算法3
算法4
这⼜是⼀个递归,模拟了每个⼈移动⼀定数量的步骤,并确定哪些移动可以拿到最佳的结果。
剩下的唯⼀事情就是为移动后得到的每个⽅格,计算出最终分数。当然,这也没有⼗全⼗美的算法,不同的因素会造成不同的结果。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。