所以我在解决问题时遇到了一些麻烦。 我目前正在用Java编写一个基于位板的国际象棋引擎(这是一个可以解决所有问题的方法)。到目前为止,所有的棋子/国王/骑士动作都按预期工作,没有错误。
我需要帮助理解的是滑动片移动生成。我为每个方块/件生成了一系列空板移动。根据我目前的理解,我还需要开发一个数组,其中包含每个方块上的每个可能占用 - 然后以某种方式根据各种方法查找该数组。
这种思考方式是否正确?是从0到2 ^ 63中选取每个数字并用该方块的移动位板进行xor'ing然后用一些方法(魔术/旋转位板)存储它来初始化数组并以相同的方式访问它运行时间?
非常感谢伪代码和解释。 (顺便说一句,我使用>>>)。
答案 0 :(得分:3)
有许多方法可以为位板生成滑块移动,具有不同的性能和复杂性。其中许多都列在here。
可能最快且最常见的是magic bitboards,它使用具有“魔法”预先计算值的位板乘法来一次生成所有四个方向上的可能移动。缺点是它使用非常大的查找表。这可能不应该是你的第一个实现,因为它更复杂。
Obstruction difference和hyperbola quintessence并不比魔术位板慢,但更容易实现。
更简单,更慢的是dumb7fill,它是每个可能方向的循环,不需要任何查找表。
答案 1 :(得分:0)
我个人正在使用双曲线精粹技术来生成滑块(Rooks,Bishops和Queen)运动。与魔术位板技术相比,它非常简单并且具有存储效率,但是比魔术位板要慢一点,因为与魔术位板的查找相比,双曲线精髓涉及到一些计算。请访问this talkchess.com论坛,以更好地了解如何生成等级攻击,因为这是我个人不十分了解的等级攻击。论坛讨论给了我所需的理解,它非常整洁并且运行良好。 Hyperbola Quintessence在Java上也能很好地工作,我在象棋引擎中使用了C ++。祝您象棋引擎编程好运。