python - 在 python 中使用游戏树时存储 2048 板游戏状态的最佳方法

标签 python algorithm event-sourcing

我有一个类似于 minimax 的函数,可以预测 2048 年的一步棋是否是一个好棋步并给它打分。然而,它唯一缺少的是一种记住游戏中每个状态的方法。

例如,如果你向上移动一个棋盘(相当于按下键盘上的向上键),当我需要深入返回并将原始状态向右移动时,我最终如何才能回到那个游戏状态?这样做的最佳方法是什么?

电路板本身存储为二维数组 fyi。

最佳答案

2048 的每个状态转换都完全包含在两个事件中:

1- 前一步
2-新瓷砖的位置和值(value)

如果您知道起始棋盘(随机生成的前两 block 棋子)和转换顺序,您可以在游戏的任何步骤重建棋盘状态。

存储此开始状态的数据结构,事件序列可以像元组列表一样简单。

换句话说,“回到过去”的方法更像是“重新向前运行时间,直到达到你想要观察的状态”。它叫做event sourcing并且,在某种程度上,这就是 Git 图所做的事情,crypro-currencies 分类帐所做的事情,以及 future 会计软件可能也会做的事情。

这里有一个很好的视频介绍event sourcing

在您的特定情况下,如果您真正想做的是撤消回滚 最后几步,memento pattern可能是更好的选择:
一种简单的方法是将每个连续的状态存储在列表/数组中,并从序列中的状态索引中检索每个步骤的状态;如果需要,您还可以轻松地将步数限制为最后 n 步。

关于python - 在 python 中使用游戏树时存储 2048 板游戏状态的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51795961/

相关文章:

c++ - 三角形类 C++

c - 如何将一个字符串分成多个部分并反向重构?

cqrs - 通过事件溯源进行逻辑删除(可能包含敏感数据/GDPR)

scaling - CQRS 与 EventSourcing 如何优化读/写

python - Pandas 中的逻辑多重索引

python - 如何通过Python 3.5将base64图像嵌入到HTML电子邮件中?

python - 使用 for 循环将两个列表中的数据插入到字典中

python - 将网页抓取工具从 python 2 转换为 python 3

string - 给定两个字符串,找出它们是否相差一个编辑

java - Axon - 在查询时进行投影的最简单方法