我有一个类似maxmax的函数,可以预测2048中的移动是否是一个好动作,并为其打分。但是,唯一缺少的是一种记住游戏中每个状态的方法。
例如,如果您将板子向上移动(等效于按键盘上的键),那么当我需要重新回到较深的位置并将原始状态向右移动时,我最终将如何回到该游戏状态?最好的方法是什么?
电路板本身存储为2d数组fyi。
答案 0 :(得分:1)
2048年的每个状态转换完全包含在两个事件中:
1-上一步
2-新图块的位置和值
如果您知道起始板(随机生成的前两个图块)和过渡顺序,则可以在游戏的任何步骤重建板状态。
用于存储此开始状态的数据结构,事件的序列可以像元组列表一样简单。
换句话说,接近“时光倒流”的方法更像是“重新运行时间直到到达要观察的状态”。它被称为event sourcing,在某种程度上,这就是Git图的功能,crypro-currency总帐的功能以及将来会计软件也可能会执行的功能。
这是一个介绍event sourcing
的好视频在您的特定情况下,如果您真正想做的是最后几步撤消或回滚,则memento pattern可能是一个更好的选择:
一种简单的方法是将每个连续状态存储在列表/数组中,并从序列中状态的索引中的每个步骤中检索状态。您也可以根据需要轻松地将步数限制为最后n步。
答案 1 :(得分:1)
在2048板上有16个正方形,并且每个正方形包含从2 ^ 1到2 ^ 11的2的幂。四舍五入后,需要4位才能存储1到11之间的数字,因此只需要16 * 4 = 64位就可以将游戏状态存储为1到11之间的16个数字。
64位不是很多,因此您最好直接存储每个游戏状态,而不要使用更间接和更复杂的方法。您可以将其编码为8个字节长的bytes
,16个字符的十六进制string
或一个长整数。长整数(在python 2中为long
或在python 3中为int
)可能最终会变得最紧凑和最容易使用。