C++ 中用于国际象棋移动生成的动态存储

Dynamic storage in C++ for chess move generation

我正在用 C++ 编写国际象棋引擎,目前正在研究着法生成。我对如何在生成移动时存储它们感到困惑。我对 C++ 比较陌生,但是有一些动态对象可以用来存储移动(因为我不知道有多少)。

您正在寻找类似 std::vector 的东西 - 一个表示大小动态变化的集合的模板:

Vectors are sequence containers representing arrays that can change in size.

Just like arrays, vectors use contiguous storage locations for their elements, which means that their elements can also be accessed using offsets on regular pointers to its elements, and just as efficiently as in arrays. But unlike arrays, their size can change dynamically, with their storage being handled automatically by the container.

C++ 中有很多容器,根据情况您可以使用 std::vector 或其他东西。

至于选择一个容器需要您的国际象棋引擎提供更多信息(例如它会调整多少次,是否可以在容器的前后添加动作等),我们无法直接给您用你提供的数据回答。

请查看 this question 以确定最适合您的案例。

许多国际象棋引擎大量使用递归。当您认为提前 5 步(5 层)时,您实际上进入了 5 次递归调用。如果您输入一个调用,该函数调用的局部变量将存储在堆栈中。所以理论上有一个本地 "chessboard" 就足够了,例如一个字段数组,每个字段都包含一个棋子(或为空),因为所有棋盘都会自动保留在堆栈中,直到它们的函数调用 returns。由于 stack space 通常是有限的,你也可以让每个调用(堆栈框架)只保存一个指向一块堆内存的指针,当你进入函数时分配它,当你再次离开它时释放它。每个函数调用 returns 它的调用者 "deeper" 递归级别组合的 "score" (累积值)(像往常一样使用 pieces 的值(pawn = 1,queen = 9 etc .)。您可以将它们存储在向量中,而不是分配单独的棋盘。优点是您的内存不太可能碎片化。然后每次调用都可以例如将其棋盘状态的索引保存在向量中。