@@ -56,7 +56,7 @@ Value qsearch(Board &board, Value alpha, Value beta, Session &session,
5656 }
5757 return maxScore;
5858}
59- Value doSearch (Board & board, int depth, Value alpha, Value beta,
59+ Value doSearch (Board board, int depth, Value alpha, Value beta,
6060 Session &session, int ply = 0 ) {
6161 if (ply >= MAX_PLY - 1 )
6262 return eval::eval (board);
@@ -118,25 +118,34 @@ Value doSearch(Board &board, int depth, Value alpha, Value beta,
118118 Value score =
119119 doSearch (board, depth - 1 - R, -beta, -beta + 1 , session, ply + 1 );
120120
121- if (score == VALUE_NONE)
121+ if (score == VALUE_NONE) {
122+ board.undoMove ();
122123 return VALUE_NONE;
124+ }
123125 score = -score;
124126 board.undoMove ();
125127 if (score >= beta)
126- return beta ;
128+ return score ;
127129 }
128- for (Move move : moves) {
130+ for (size_t i = 0 ; i < moves.size (); ++i) {
131+ Move move = moves[i];
132+ int reduction = (i >= 3 && depth >= 3 && !board.isCapture (move)) ? 1 : 0 ;
129133 board.doMove (move);
130- Value childScore =
131- doSearch (board, depth - 1 , -beta, -alpha, session, ply + 1 );
132-
133- board.undoMove ();
134-
135- if (childScore == VALUE_NONE)
134+ Value childScore = doSearch (board, depth - 1 - reduction, -alpha - 1 , -alpha, session, ply + 1 );
135+ if (childScore == VALUE_NONE){
136+ board.undoMove ();
136137 return VALUE_NONE;
137-
138+ }
138139 Value score = -childScore;
139-
140+ if (reduction > 0 && score > alpha) {
141+ childScore = doSearch (board, depth - 1 , -beta, -alpha, session, ply + 1 );
142+ board.undoMove ();
143+ if (childScore == VALUE_NONE) return VALUE_NONE;
144+ score = -childScore;
145+ }
146+ else
147+ board.undoMove ();
148+
140149 if (score > maxScore) {
141150 maxScore = score;
142151 update_pv (session.pv [ply], move, session.pv [ply + 1 ]);
@@ -194,7 +203,6 @@ void search::search(const chess::Board &board,
194203 // since MAX_PLY=64
195204 session.pv [_][j] = Move::none ();
196205 }
197- session.nodes = 0 ;
198206 auto board_ = board;
199207 Value score_ =
200208 doSearch (board_, i, -VALUE_INFINITE, VALUE_INFINITE, session);
0 commit comments