arrays - OCaml 中用于跟踪游戏板的数据结构

标签 arrays ocaml

我对 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)。然后只需传递不同的 xy 即可使 f 对行/列/对角线进行操作。

一旦代码运行并且您开始优化,您可能需要查看位向量: 如果最小最大搜索的树中存储了很多位置,减少内存占用意味着更多的缓存命中和更快的执行。您可能想自己对单个 int 中的位置进行编码,但这是一些棘手的工作,您不想太早这样做。

关于arrays - OCaml 中用于跟踪游戏板的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13326516/

相关文章:

c++ - 未处理的异常 : Access violation reading location 0x015E2348

Java复制多维数组,随机错误

list - 匹配元组列表中的一项

javascript - 如何在 JavaScript 中表示代数数据类型和模式匹配

recursion - OCaml:是否可以在单独的文件中定义相互递归的数据结构

c# - 实例化并初始化多维数组 C#

php - 搜索加密数据

android - 可以将 FileOutputStream 转换为字节数组吗?

events - OCaml 事件/ channel 教程?

ubuntu - Ocaml 没有创建 .o 文件