如何将一组位板转换为列表?

时间:2016-05-30 23:36:36

标签: artificial-intelligence chess

如果我错了,请纠正我。搜索算法,即修改后的alpha beta,探索了一系列合法移动。首先,需要初始化 像这样的一系列位板:

unsigned long long knight_attacks [64] = {0x020800,0x050800等...}

每个元素在该方块的所有可能的攻击方格上都有1个,例如,knight_attacks [f4]在d5,e6,g6,h5,d3,e2,g2上会有1&#s,和h3对应于来自f4的可能的攻击方格。

一旦初始化,就需要以某种方式转换成列表...

如何将一系列位板转换为列表? 感谢兄弟姐妹们的帮助。

2 个答案:

答案 0 :(得分:1)

天真的解决方案包括循环比特位:

while ( x ) {
   U64 ls1b = x & -x; // isolate LS1B
   ...
   x &= x-1; // reset LS1B
}

国际象棋编程维基中可以找到更高级的算法: https://chessprogramming.wikispaces.com/Bitboard+Serialization

答案 1 :(得分:1)

如果我错了,请纠正我;我只是个初学者。

骑士的动作分为两种类型:捕获和非捕获。

对于非捕获和捕获移动,您将需要使用按位OR,但显然使用不同的位板。

knightCaptures = knightAttack bitboard | emptySquare;

同样;

knightMoves = knightAttack bitboard | enemyBitboard;

将每个这些位板转换为需要执行以下操作的移动列表:扫描每个位的位板。你怎么做到这一点?通过找到最低有效位并将其删除。然后你找到下一个最低的sig位并将其删除......等等。

以下是关于移动生成和比特扫描的一些文章: https://chessprogramming.wikispaces.com/BitScan

http://peterellisjones.com/post/39938456375/chess-engine-part-i-choosing-internal-data

http://peterellisjones.com/post/41238723473/chess-engine-part-ii-move-encoding-and-move

https://www.cis.uab.edu/hyatt/boardrep.html

https://www.cis.uab.edu/hyatt/bitmaps.html

这是关于国际象棋引擎的所有理论:

http://www.frayn.net/beowulf/theory.html