我正在用功能编程语言Elixir 创建一个简单的MiniMax实现。因为有很多完美知识的游戏(井字游戏,四连冠,西洋跳棋,国际象棋等),所以此实现可能是为任何这些游戏创建游戏AI的框架。
但是,我面临的一个问题是如何以功能语言正确存储游戏状态。这些游戏主要处理二维游戏板,其中经常执行以下操作:
- 阅读特定板位的内容
- 更新特定板位置的内容(返回新的移动可能性时)
- 考虑连接到当前位置的一个或多个位置的内容(即下一个或上一个水平,垂直或对角线位置)
- 考虑任何方向上多个连接位置的内容。
- 考虑整个文件,等级和对角线的内容。
- 旋转或镜像电路板(以检查对称性,以提供与已经计算出的结果相同的结果)。
大多数功能语言都使用链接列表和元组作为多元素数据结构的基本构建块。但是,这些似乎对这项工作非常不利:
- 链接列表具有O(n)(线性)查找时间。另外,由于我们无法在板上进行一次扫描来“扫描和更新板”,因此使用列表似乎非常不切实际。
- 元组具有O(1)(恒定)查找时间。但是,将电路板表示为固定大小的元组将使得很难遍历等级,文件,对角线或其他类型的连续正方形。此外,Elixir和Haskell(这是我所知道的两种功能语言)都缺乏读取元组的第n个元素的语法。这将使得不可能编写适用于任意尺寸电路板的动态解决方案。
Elixir具有内置的Map数据结构(而Haskell具有Data.Map
),该结构允许O(log n)(对数)访问元素。现在,我使用一个地图,其中x, y
以位置表示键的元组。
这是“可行的”,但是以这种方式滥用地图是错误的,尽管我不知道确切的原因。我正在寻找一种以功能性编程语言存储二维游戏板的更好方法。