游戏树的C++实现

C++ implementation of game tree

本文关键字:实现 C++ 游戏      更新时间:2023-10-16

我将把一个国际象棋游戏表示为C++结构。我认为,最好的选择是树形结构(因为在每个深度,我们都有几个可能的移动)。

这是一个好方法吗?

struct TreeElement{
  SomeMoveType move;
  TreeElement *parent;
  std::vector<TreeElement*> children;
};

如何高效地将此类数据存储在文件中?有没有办法确保整个树结构将存储在内存的同一部分,从而允许使用mmap函数?

要将数据存储在内存的同一部分,您可能需要为所使用的std::vector<TreeElement *>提供一个Allocator对象,并从块中进行分配。

为了能够序列化它,您可以考虑在块中存储偏移量,而不是存储实际的指针。然后,当您读取回数据时,您可以将块开始的地址添加到每个偏移量,以将其转换回地址。

根据您使用的操作系统/编译器,可能已经有一些对此的支持。例如,微软的编译器支持__based指针,这正是我所描述的:一个基地址,基于该地址的每个指针实际上只是一个偏移量,而不是一个完整的指针。提到mmap表明您可能无法直接使用它,但您使用的编译器/OS可能也有类似的功能。否则,您可能不得不自己完成这项工作(例如,使用based_pointer类)。

真正的问题是你为什么要序列化一个移动树。在典型的情况下,最好只保存当前的董事会位置(或者,大约相当于移动历史),并在需要时从中重新生成移动树。它足够小,很容易储存。

我认为使用std::vector并不是创建树的最佳方式,单链表风格的树构造可能更简单、最好。