chess - Chess bitboard 移动生成

我正在编写一个 chess 引擎,并且我正在了解 chess 引擎如何在 store 游戏位置(在 64 位 bitboards 中)以及如何从中生成移动。当你得到最后的 bitboard 移动时,你怎么知道哪一块移动到哪里?例如,以白骑士为例。您可以轻松地对白马 bitboard 进行位移以获得马/s 将移动到的方格,然后使用其他二元运算符确保这些方格没有被您自己的棋子占据并且马没有移动出界.如果这是白马 bitboard:

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0

你可以弄清楚这些是合法的移动(假设方块上没有友好的棋子,但它们与这个例子无关)

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 1 0 1 0 0 0 0
1 0 1 0 1 0 0 0
0 0 * 1 0 0 0 0
1 * 0 0 1 0 0 0
0 1 0 1 0 0 0 0

(*s 用于骑士的位置,这样更容易可视化)。既然您知道骑士可以移动到 e2,那有什么作用?你怎么知道是哪个白骑士。你怎么知道两个白马都可以移动到d1?使用二元和 bitboard 运算符是因为它们非常有效,但我看不出它们如何帮助获得合法移动的最终列表。

回答1

当你生成动作时,你会经历每一位,例如骑士bitboard。然后,您将 store 骑士位(开始方格)和它可以移动到的每个可能的方格(结束方格),这将使您获得该棋子的所有合法移动。我通常将信息 store 作为对象或将其编码为位数。

在移动生成期间,您还将 store 有关移动的其他信息,例如它是否是捕获移动,castling,e.p.等等。基本上任何在你的人工智能后期阶段便宜且有用/需要的信息。

我认为 https://www.chessprogramming.org/Encoding_Moves 是您正在寻找的。我还建议查看 Code Monkey King 中关于 https://www.youtube.com/watch?v=ubX5lyIQoSs&list=PLmN0neTso3Jxh8ZIylk74JpwfiWNI76Cs&index=27 的非常好的系列,如果你不是用 C 语言编写的,你仍然可以很容易地从中获得概念。我将它用作我的 Python 和 C# 引擎的指南。

相似文章

php - 检查一个主教是否可以取消另一个主教

大家好!请问我该如何解决这个问题?我被要求在PHP中编写一个程序,问题是我需要创建一个涉及主教的测试代码。给定两个主教,bishop1和bishop2,以及他们的位置。如果bishop1可以一次捕获b...