从移动位板生成单个移动
Generating individual moves from a bitboard of moves
在我的国际象棋引擎中,它使用位板来表示棋盘的状态,一次生成一大块伪合法移动,结果是位板。例如:
棋子:
稍后一点位板魔法:
最后的位板只是一大块可能的着法。引擎通常如何获取此位板并从中生成单独的移动?我是否必须遍历每一位以检查它是否已设置?迭代位板似乎违背了使用位板的真正目的,这就是我有点怀疑的原因。
有没有更好的方法?
然后,通常您会应用 minimax algorithm to evaluate how good the moves are, so you can pick (what you estimate to be) the best move. A simple variant is, for example, alpha-beta.
的一些变体
这些变体主要涉及尝试将搜索引导至 "probably useful moves" 并远离搜索的无用区域 space,因为搜索树非常广泛,您深入探索它的能力是对于一个优秀的国际象棋 AI 来说极其重要 - 浅层探索使 AI 更容易 "trap" 因为它会做出短期看起来不错的选择,即使它们后来的效果很差。
所以是的,您将遍历位板。这并没有真正违背他们的目的 - 你仍然(可能)计算出比你没有使用位板快得多的移动。对于最简单的 AI,您可以使用标准的位板技术走 "the first" 步,但像这样玩的 AI 将低于新手水平,根本不考虑输赢。
您不必迭代超过 64 个单位。例如,您可以 prepare/pre-define 一个 256 大小的查找数组,其中包含所有可能的移动列表,其中 8 位索引表示一个棋子在单个等级上的攻击集。然后,您可以使用移位操作 (bitboard >> 8)
仅迭代 8 次,以将后续的排名攻击集作为索引传递给数组并提取移动列表。与一位步进循环相比,它将加速大约 8 倍。也许你应该将这个数组增强到 [8][256]
实际上以传递一个排名数字本身并根据你的需要提取一个最终的移动列表(具有 x,y
坐标)。内存成本仍然微不足道。
在我的国际象棋引擎中,它使用位板来表示棋盘的状态,一次生成一大块伪合法移动,结果是位板。例如:
棋子:
稍后一点位板魔法:
最后的位板只是一大块可能的着法。引擎通常如何获取此位板并从中生成单独的移动?我是否必须遍历每一位以检查它是否已设置?迭代位板似乎违背了使用位板的真正目的,这就是我有点怀疑的原因。
有没有更好的方法?
然后,通常您会应用 minimax algorithm to evaluate how good the moves are, so you can pick (what you estimate to be) the best move. A simple variant is, for example, alpha-beta.
的一些变体这些变体主要涉及尝试将搜索引导至 "probably useful moves" 并远离搜索的无用区域 space,因为搜索树非常广泛,您深入探索它的能力是对于一个优秀的国际象棋 AI 来说极其重要 - 浅层探索使 AI 更容易 "trap" 因为它会做出短期看起来不错的选择,即使它们后来的效果很差。
所以是的,您将遍历位板。这并没有真正违背他们的目的 - 你仍然(可能)计算出比你没有使用位板快得多的移动。对于最简单的 AI,您可以使用标准的位板技术走 "the first" 步,但像这样玩的 AI 将低于新手水平,根本不考虑输赢。
您不必迭代超过 64 个单位。例如,您可以 prepare/pre-define 一个 256 大小的查找数组,其中包含所有可能的移动列表,其中 8 位索引表示一个棋子在单个等级上的攻击集。然后,您可以使用移位操作 (bitboard >> 8)
仅迭代 8 次,以将后续的排名攻击集作为索引传递给数组并提取移动列表。与一位步进循环相比,它将加速大约 8 倍。也许你应该将这个数组增强到 [8][256]
实际上以传递一个排名数字本身并根据你的需要提取一个最终的移动列表(具有 x,y
坐标)。内存成本仍然微不足道。