游戏树的C++实现
问题描述:
我将以C++结构来代表国际象棋游戏。我认为,最好的选择将是一个树形结构(因为在每个深处我们有几个可能的动作)。游戏树的C++实现
这是一个很好的方法吗?
struct TreeElement{
SomeMoveType move;
TreeElement *parent;
std::vector<TreeElement*> children;
};
如何有效地将这种数据存储在文件中?有没有办法确保整个树结构将存储在内存的相同部分,这将允许使用mmap函数?
答
要将数据存储在同一部分内存中,您可能希望为您使用的std::vector<TreeElement *>
提供一个Allocator对象,并从您的块中分配该对象。
为了能够序列化它,而不是存储实际的指针,你可能会考虑在块中存储偏移量。然后,当您读取数据时,您可以将块起始地址添加到每个偏移量以将其重新转换为地址。
根据您使用的操作系统/编译器,可能已经有一些支持。例如,微软的编译器支持__based
指针,这几乎就是我所描述的:一个基地址,并且基于该地址的每个指针实际上只是一个偏移量,而不是一个完整的指针。提及mmap
表示可能不直接提供给您,但是它可能是您正在使用的编译器/操作系统具有类似的内容。否则,您可能必须自己完成这项工作(例如,使用based_pointer
课程)。
真正的问题是你为什么试图序列化移动树。在一个典型的情况下,您最好只保存当前的棋盘位置(或者等同于移动历史记录),并根据需要重新生成移动树。这足够小,它很容易储存。
答
我认为使用std :: vector并不是创建树的最佳方式,单链表的样式树构造可能更简单也是最好的。
您不能以某种方式将该结构保存到文件中,因为它包含指针并使用“vector”。 – 2012-02-19 15:19:56
这些是三个非常广泛和非常不同的问题,汇集成一个。请不要这样做。 – 2012-02-19 15:21:46
我会尝试命名节点(只是使用指针值)并在Depth-first ordersearch中遍历树,这样您可以生成一个有序的1维数组,如:[{node:1,move:..,parent :0},{节点:2,移动:..,父:1},{节点:3,移动:..,父:2},{节点:4,移动:..,父:3}] – arthurprs 2012-02-19 15:26:36