国际象棋引擎中的滑块生成

Sliding Piece Generation in Chess Engine

所以我一直无法解决一个问题。 我目前正在 Java 中编写一个基于 bitboard 的国际象棋引擎(这是一次解决所有问题的旅程)。到目前为止,所有 pawn/king/knight 动作都按预期工作并且没有错误。

我需要帮助理解的是滑块移动生成。我已经为每个方格/棋子生成了空棋盘移动数组。根据我目前的理解,我还需要开发一个数组,其中还包含每个方块上的每个可能的占用——然后以某种方式根据各种方法查找该数组。

这样的思考方式对吗?是否需要从 0 到 2^63 中选取每个数字,并使用该方块的移动位板对它进行异或运算,然后使用某种方法(magic/rotated 位板)存储它以初始化数组并以相同的方式访问它运行 时间?

非常感谢伪代码和解释。 (顺便说一句,我正在使用 >>> )。

有许多方法可以为位板生成滑动块移动,具有不同的性能和复杂性。其中许多已列出 here.

可能最快和最常见的是 magic bitboards,它使用位板与“神奇”的预先计算值的乘法来同时生成所有四个方向上的可能移动。缺点是它使用非常大的查找表。这可能不应该是您的第一个实现,因为它更复杂。

Obstruction difference and hyperbola quintessence 并不比魔术位板慢多少,而且更容易实现。

更简单和更慢的是 dumb7fill,它是一个在每个可能方向上的循环,不需要任何查找表。

我个人使用双曲线精华技术来生成滑块(Rooks、Bishops & Queen)移动。与魔术位板技术相比,它非常简单并且内存效率高,但比魔术位板慢一点,因为与魔术位板的查找相比,双曲线精髓涉及一些计算。请参考this talkchess.com 论坛以更好地理解等级攻击是如何产生的,因为我个人觉得我不太了解它。论坛讨论给了我必要的理解,它非常简洁并且运行良好。 Hyperbola Quintessence 也适用于 Java,我正在为我的国际象棋引擎使用 C++。祝您的国际象棋引擎编程顺利。