在我的国际象棋引擎中,使用位板代表董事会的状态,一次性产生一大堆伪合法动作,结果就是一个位板。例如:
走卒:
稍后有点魔术:
最后的位板只是一大堆可能的动作。引擎通常如何使用这个位板并从中产生单独的移动?我是否必须迭代每一位以检查它是否已设置?迭代在一个位板上似乎无视使用位板的目的,这就是为什么我有点怀疑。
有更好的方法吗?
答案 0 :(得分:2)
然后,通常你应用minimax算法的一些变体来评估动作的好坏,这样你就可以选择(你估计的)最佳动作。例如,一个简单的变体是alpha-beta。
这些变体主要涉及尝试引导搜索“可能有用的移动”并远离搜索空间的无用区域,因为搜索树非常宽,并且您深入探索它的能力对于一个好的棋是非常重要的人工智能 - 浅浅地探索它会使人工智能很容易“陷阱”,因为它会让选择看起来很短暂,即使它们以后会很糟糕。
所以是的,你将遍历位板。这并没有真正违背他们的目的 - 你仍然(可能)比没有使用位板时更快地计算移动。对于最简单的AI,您可以使用标准的位板技术进行“第一次”移动,但是像这样的AI将低于新手级别,根本不考虑输赢。
答案 1 :(得分:2)
您不必迭代64位单位。您可以准备/预定义例如256个大小的查找数组,其中包含所有可能的移动列表,其中8位索引表示单个排名上的一个攻击集。然后,您可以使用按位移位操作(bitboard >> 8)
仅迭代8次,以将后续的rank-attack-sets作为数组的索引传递并提取移动列表。与一位步进循环相比,它将加速大约8倍。也许您应该将此数组增强到[8][256]
实际上也传递一个排名编号,并根据您的需要提取最终的移动列表(带x,y
坐标)。内存成本仍然微不足道。