如何使用 Stockfish 完美功能在移动生成器中查找非法移动?

How to find illegal moves in move generator using Stockfish perft funtion?

我正在 Unity 中制作一个国际象棋程序,并且制作了一个 perft 函数来查找我的移动生成器中的错误。我下载了 Stockfish 来比较结果。

从国际象棋的起始位置开始,深度为 3,我的结果大部分与 Stockfish 的结果相匹配。唯一不同的是黑马走后

这是 Stockfish 的结果:

a2a3: 380
b2b3: 420
c2c3: 420
d2d3: 539
e2e3: 599
f2f3: 380
g2g3: 420
h2h3: 380
a2a4: 420
b2b4: 421
c2c4: 441
d2d4: 560
e2e4: 600
f2f4: 401
g2g4: 421
h2h4: 420
b1a3: 400
b1c3: 440
g1f3: 440
g1h3: 400

Nodes searched: 8902

这是我的结果:

a2a3: 380
b2b3: 420
c2c3: 420
d2d3: 539
e2e3: 599
f2f3: 380
g2g3: 420
h2h3: 380
a2a4: 420
b2b4: 421
c2c4: 441
d2d4: 560
e2e4: 600
f2f4: 401
g2g4: 421
h2h4: 420
b1a3: 420
b1c3: 460
g1f3: 460
g1h3: 420

Nodes searched: 8982

我的算法在黑马的每一步移动后生成的移动总数比 Stockfish 多 20 步。

我的问题是,我如何使用这些结果来找出我的程序认为哪些非法移动是合法的?鉴于这些或任何未来的测试结果,调试我的算法的最快方法是什么?

我在网上找不到其他任何东西,这就是我在这里问的原因。

按照以下步骤操作。

  1. 我们从b1a3开始,因为有区别,你的是420,sf是400,在位置上推move,意思是startpos + b1a3 or
    position startpos moves b1a3,然后发送 perft 2 命令。请注意深度从深度 3 减少到深度 2。我们减少它是因为我们推动移动。 对于 sf 和你的引擎:
position startpos moves b1a3
perft 2

然后按照您在 post,

中的方式记录动作
  1. 找到它们不同的着法,然后像步骤 1 一样再次推动该着法,但现在使用深度 1,我们上次使用的是深度 2。记录性能并进行比较。由于那只是深度 1,您将能够看到您的引擎正在发生什么。最好在真板或软件板上设置位置。

这些是合法的着法生成问题,因此您必须检查您的着法生成、makemove 和 unmakemove 函数。您有骑士移动问题,所以您的骑士移动偏移量可能不正确。还要检查你的攻击功能。

同样在你的代码中添加一些断言到处像一个白子不能吃另一个白子,移动的 to square 在 64 棋盘正方形和其他人之内。