生成从移动

问题描述:

在我的国际象棋引擎,使用位棋盘为代表的董事会的状态的棋盘个人移动,产生一气呵成的假冒合法移动一大块,一个棋盘是结果。例如:生成从移动

走卒:

Pawns' statePawns' state - bitboard

小棋盘魔术后来:

Pawns' positionsPawns' positions - bitboard

在端部的棋盘是一个简单的可能的移动块。引擎如何通常采用这种棋盘,并从中产生个人动作?我是否必须迭代每一位以检查它是否已设置?迭代一个棋盘似乎藐视使用位面板的目的,这就是为什么我有点怀疑。

有没有更好的方法?

然后,通常在应用minimax算法来评估移动有多好,是一些变种,所以你可以选择(你估计什么是)最好的举措。一个简单的变体是,例如,alpha-beta

这些变体主要处理试图引导搜索朝向“可能有用的移动”,并且远离搜索空间的无用区域,因为搜索树非常广泛,并且您深入探索它的能力对于一个好的国际象棋AI--探索它浅显易懂让人工智能很容易陷入困境,因为它会使短期看起来很不错的选择,即使它们以后出现不好的情况。

所以是的,你会遍历的位板。这并没有违背他们的目的 - 你仍然(可能)计算的动作比没有使用位板快得多。对于最简单的AI,你可以采用标准的棋盘技巧进行“第一次”移动,但是像这样玩的AI会低于新手级别,根本不考虑输赢。

您不必遍历64个单个位。您可以准备/预先定义例如具有所有可能的移动列表的256大小查找阵列,其中8位索引代表单个队列中的一个棋子的攻击集。然后,可以按位移动操作(bitboard >> 8)只迭代8次,以将后续的秩攻击集作为数组的索引并提取移动列表。与一位步进循环相比,它将加速大约8倍。也许你应该增强这个阵列到[8][256]实际上也要传递一个等级号码本身并根据你的需要提取一个最终的移动列表(用x,y坐标)。记忆成本依然微不足道。

+0

相关:https://github.com/ServerTech/cortex/blob/master/src/lookup_tables.cc –