Ну что ж, пойдем старым добрым путем, разобьем на отдельные ходы
Function Perft(isRoot:boolean;depth:integer; var Board:Tboard):int64;
// Процедура перфоманс теста. Gринимает на вход позицию и глубину, возвращает количество перебранных легальных ходов. Рекурсивно вызывает саму себя
var
Movelist : TMovelist;
Undo:TUndo;
nodes:int64;
i,nps,cnt:integer;
Pins : int64;
isEasyPass : boolean;
begin
if isRoot then begin
timer:=now; // Если мы в корневой позиции, то стратуем таймер.
ply:=0;
old_nodes:=0;
cummulative_nodes:=0;
end;
nodes:=0;
Pins:=FindPins(Board);
GeneratePseudoMoves(AllMoves,Board,MoveList); // генерируем все псевдолегальные ходы
for i:=1 to MoveList[0] do // Цикл ходов
begin
isEasyPass:=EasyPass(Pins,MoveList[i],Board);
MakeMove(Movelist[i],Board,Undo);// Делаем ход на доске
if isEasyPass or (not isAttackedBySide(Board.King[-Board.SideToMove],Board.SideToMove,Board)) then
begin
// Если король после сделанного хода не остался под шахом (ход был легальный), то идем на глубину ниже
if depth>1
then begin
Inc(ply);
nodes:=nodes+Perft(false,depth-1,Board);
Dec(ply);
end
else inc(nodes); // Если это уже листья дерева, то просто подсчитываем сколько их, легальных.
if (ply=0) then begin
old_nodes:=nodes - cummulative_nodes;
cummulative_nodes:=cummulative_nodes + old_nodes;
writeln(StringMove(Movelist[i])+Format(' nodes=%u',[old_nodes]));
end;
end;
UnMakeMove(Undo,Board); // Возвращаем ход
end;
// Если мы закончили перебор из корневой позиции, то считаем время и выводим статистику
If isRoot then
begin
cnt:=MillisecondsBetween(timer,now);
if cnt<>0
then nps:=(nodes*1000) div cnt
else nps:=nodes;
writeln('Perft ',depth,' - ',nodes,' nodes. At ',cnt,' msec.',nps,' nodes per second');
end;
Result:=nodes;
end;
a2a3 nodes=4480935 move:a2-a3 nodes=4463267
a2a4 nodes=5378712 move:a2-a4 nodes=5363555
b1a3 nodes=4903157 move:b1-a3 nodes=4856835
b1c3 nodes=5773473 move:b1-c3 nodes=5708064
b2b3 nodes=5326365 move:b2-b3 nodes=5310358
b2b4 nodes=5309282 move:b2-b4 nodes=5293555
c2c3 nodes=5515636 move:c2-c3 nodes=5417640
c2c4 nodes=5956440 move:c2-c4 nodes=5866666
d2d3 nodes=8146948 move:d2-d3 nodes=8073082
d2d4 nodes=8972072 move:d2-d4 nodes=8879566
e2e3 nodes=9926866 move:e2-e3 nodes=9726018
e2e4 nodes=9977367 move:e2-e4 nodes=9771632
f2f3 nodes=4446961 move:f2-f3 nodes=4404141
f2f4 nodes=4938595 move:f2-f4 nodes=4890429
g1f3 nodes=5738578 move:g1-f3 nodes=5723523
g1h3 nodes=4896061 move:g1-h3 nodes=4877234
g2g3 nodes=5370611 move:g2-g3 nodes=5346260
g2g4 nodes=5256291 move:g2-g4 nodes=5239875
h2h3 nodes=4480713 move:h2-h3 nodes=4463070
h2h4 nodes=5404278 move:h2-h4 nodes=5385554
nodes=119 060 324
Perft 6 - 120199341 nodes.
At 14617 msec.8223256 nodes per second
Ни один ход не совпал, голову сломал, почему
PS
Ищем
a2a3 nodes=8457 move:a2-a3 nodes=8457
a2a4 nodes=9329 move:a2-a4 nodes=9329
b1a3 nodes=8885 move:b1-a3 nodes=8885
b1c3 nodes=9755 move:b1-c3 nodes=9755
b2b3 nodes=9345 move:b2-b3 nodes=9345
b2b4 nodes=9332 move:b2-b4 nodes=9332
c2c3 nodes=9313 move:c2-c3 nodes=9272
c2c4 nodes=9786 move:c2-c4 nodes=9744
d2d3 nodes=11959 move:d2-d3 nodes=11959
d2d4 nodes=12435 move:d2-d4 nodes=12435
e2e3 nodes=13208 move:e2-e3 nodes=13134
e2e4 nodes=13236 move:e2-e4 nodes=13160
f2f3 nodes=8457 move:f2-f3 nodes=8457
f2f4 nodes=8929 move:f2-f4 nodes=8929
g1f3 nodes=9748 move:g1-f3 nodes=9748
g1h3 nodes=8881 move:g1-h3 nodes=8881
g2g3 nodes=9345 move:g2-g3 nodes=9345
g2g4 nodes=9328 move:g2-g4 nodes=9328
h2h3 nodes=8457 move:h2-h3 nodes=8457
h2h4 nodes=9329 move:h2-h4 nodes=9329
nodes=197 281
Perft 4 - 197514 nodes.
At 28 msec.7054071 nodes per second