如果我错了,请纠正我。搜索算法,即修改后的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的可能的攻击方格。
一旦初始化,就需要以某种方式转换成列表...
如何将一系列位板转换为列表? 感谢兄弟姐妹们的帮助。
答案 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
这是关于国际象棋引擎的所有理论: