我对 OCaml 相当陌生,我想实现一个类似于四排线的游戏。 我需要的是一些数据结构来保持游戏状态。游戏板是一个 4x4 的正方形,共有 16 个方 block 。 我正在 OCaml 中寻找一种表示形式,以便轻松快速地检索(或执行某些操作)整个列、行或对角线中的所有元素。 我将在这个游戏上进行极小极大搜索,这就是速度很重要的原因。
到目前为止,我已经考虑过一维列表。列表的问题在于,很难弄清楚哪些元素属于每行/列/对角线,然后使用 List.map
检索它们。
我考虑过使用Array.make 4 (Array.make 4 Empty);;
。当涉及到行时,这绝对是完美的。获取它们并对其进行模式匹配很容易。但在各个列和对角线上进行模式匹配是一件苦差事。
我希望能够做的是有一个函数,它接受游戏板并返回包含所有行/列/对角线的列表列表。然后,我想做,例如,将(行,列,对角线)与(空,空,空,空)->某事匹配
。
最佳答案
由于长度是固定的,因此更喜欢数组而不是列表:它们使用更少的内存并且读写速度更快。
恐怕你需要编写一个函数来获取对角线,没有简单的模式匹配。
当你写“在[对角线]上做一些操作”时,我假设你正在考虑一个函数f
,它采用长度为4的数组来存储元素,例如[|Empty ;空;空;空|]
。
也许 f
可以将位置 p
作为参数,以及该位置内的索引数组:
f p [|x1,y1; x2,y2; x3,y3; x4,y4|]
将提取方 block p.(x1).(y1) ... p.(x4).(y4)
。然后只需传递不同的 x
和 y
即可使 f
对行/列/对角线进行操作。
一旦代码运行并且您开始优化,您可能需要查看位向量: 如果最小最大搜索的树中存储了很多位置,减少内存占用意味着更多的缓存命中和更快的执行。您可能想自己对单个 int 中的位置进行编码,但这是一些棘手的工作,您不想太早这样做。
关于arrays - OCaml 中用于跟踪游戏板的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13326516/