int perft(Position& pos, Depth depth)
{
+ MoveStack mlist[256];
StateInfo st;
- Move move;
+ Move m;
int sum = 0;
- MovePicker mp(pos, MOVE_NONE, depth, H);
+
+ // Generate all legal moves
+ MoveStack* last = generate_moves(pos, mlist);
// If we are at the last ply we don't need to do and undo
// the moves, just to count them.
- if (depth <= OnePly) // Replace with '<' to test also qsearch
- {
- while (mp.get_next_move()) sum++;
- return sum;
- }
+ if (depth <= OnePly)
+ return int(last - mlist);
// Loop through all legal moves
CheckInfo ci(pos);
- while ((move = mp.get_next_move()) != MOVE_NONE)
+ for (MoveStack* cur = mlist; cur != last; cur++)
{
- pos.do_move(move, st, ci, pos.move_is_check(move, ci));
+ m = cur->move;
+ pos.do_move(m, st, ci, pos.move_is_check(m, ci));
sum += perft(pos, depth - OnePly);
- pos.undo_move(move);
+ pos.undo_move(m);
}
return sum;
}
alpha = *alphaPtr;
beta = *betaPtr;
isCheck = pos.is_check();
+ depth = (Iteration - 2) * OnePly + InitialDepth;
// Step 1. Initialize node (polling is omitted at root)
ss->currentMove = ss->bestMove = MOVE_NONE;
captureOrPromotion = pos.move_is_capture_or_promotion(move);
// Step 11. Decide the new search depth
- depth = (Iteration - 2) * OnePly + InitialDepth;
ext = extension<PV>(pos, move, captureOrPromotion, moveIsCheck, false, false, &dangerous);
newDepth = depth + ext;
if ( m != MOVE_NULL
&& before != VALUE_NONE
&& after != VALUE_NONE
- && pos.captured_piece() == NO_PIECE_TYPE
+ && pos.captured_piece_type() == PIECE_TYPE_NONE
&& !move_is_special(m))
H.set_gain(pos.piece_on(move_to(m)), move_to(m), -(before + after));
}