Move MovePicker::next_move<false>() { Move move; while (true) { /* cur == endが成立するのは指し手が0ということ */ while (cur == end) generate_next_stage(); switch (stage) { /* ここにくるということは手を新たに生成していない、ttMoveで十分ということなのでttMoveをかえす */ case MAIN_SEARCH: case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT: ++cur; return ttMove; /* CAPTURES_S1で手が生成できたとき(他の指し手は生成していない)ここにくる pick_best関数でもっとも点数のよかった手を返す、 静止探索して評価値が0を下回らない(駒の取り合いに勝つか引き分け) 静止探索してマイナスになるようなら取る手の着手リストはendBadCapturesの指す 位置に移動し、最初から着手リストがなくなるまでつづける(cur == end)が成立するまで */ case CAPTURES_S1: move = pick_best(cur++, end)->move; if (move != ttMove) { if (pos.see_sign(move) >= VALUE_ZERO) return move; // Losing capture, move it to the tail of the array (endBadCaptures--)->move = move; } break; case KILLERS_S1: move = (cur++)->move; if ( move != MOVE_NONE && move != ttMove && pos.pseudo_legal(move) && !pos.capture(move)) return move; break; case QUIETS_1_S1: case QUIETS_2_S1: move = (cur++)->move; if ( move != ttMove && move != killers[0].move && move != killers[1].move && move != killers[2].move && move != killers[3].move && move != killers[4].move && move != killers[5].move) return move; break; case BAD_CAPTURES_S1: return (cur--)->move; case EVASIONS_S2: case CAPTURES_S3: case CAPTURES_S4: move = pick_best(cur++, end)->move; if (move != ttMove) return move; break; case CAPTURES_S5: move = pick_best(cur++, end)->move; if (move != ttMove && pos.see(move) > captureThreshold) return move; break; case CAPTURES_S6: move = pick_best(cur++, end)->move; if (to_sq(move) == recaptureSquare) return move; break; case QUIET_CHECKS_S3: move = (cur++)->move; if (move != ttMove) return move; break; case STOP: return MOVE_NONE; default: assert(false); } } }
Move MovePicker::next_move() { Move move; while (true) { while (cur == endMoves && stage != STOP) generate_next_stage(); switch (stage) { case MAIN_SEARCH: case EVASION: case QSEARCH_WITH_CHECKS: case QSEARCH_WITHOUT_CHECKS: case PROBCUT: ++cur; return ttMove; case GOOD_CAPTURES: move = pick_best(cur++, endMoves); if (move != ttMove) { if (pos.see_sign(move) >= VALUE_ZERO) return move; // Losing capture, move it to the tail of the array *endBadCaptures-- = move; } break; case KILLERS: move = *cur++; if ( move != MOVE_NONE && move != ttMove && pos.pseudo_legal(move) && !pos.capture(move)) return move; break; case GOOD_QUIETS: case BAD_QUIETS: move = *cur++; if ( move != ttMove && move != killers[0] && move != killers[1] && move != killers[2]) return move; break; case BAD_CAPTURES: return *cur--; case ALL_EVASIONS: case QCAPTURES_1: case QCAPTURES_2: move = pick_best(cur++, endMoves); if (move != ttMove) return move; break; case PROBCUT_CAPTURES: move = pick_best(cur++, endMoves); if (move != ttMove && pos.see(move) > threshold) return move; break; case RECAPTURES: move = pick_best(cur++, endMoves); if (to_sq(move) == recaptureSquare) return move; break; case CHECKS: move = *cur++; if (move != ttMove) return move; break; case STOP: return MOVE_NONE; default: assert(false); } } }
Move MovePicker::next_move<false>() { Move move; while (true) { while (cur == end) generate_next_stage(); switch (stage) { case MAIN_SEARCH: case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT: ++cur; return ttMove; case CAPTURES_S1: move = pick_best(cur++, end)->move; if (move != ttMove) { if (pos.see_sign(move) >= VALUE_ZERO) return move; // Losing capture, move it to the tail of the array (endBadCaptures--)->move = move; } break; case KILLERS_S1: move = (cur++)->move; if ( move != MOVE_NONE && move != ttMove && pos.pseudo_legal(move) && !pos.capture(move)) return move; break; case QUIETS_1_S1: case QUIETS_2_S1: move = (cur++)->move; if ( move != ttMove && move != killers[0].move && move != killers[1].move && move != killers[2].move && move != killers[3].move && move != killers[4].move && move != killers[5].move) return move; break; case BAD_CAPTURES_S1: return (cur--)->move; case EVASIONS_S2: case CAPTURES_S3: case CAPTURES_S4: move = pick_best(cur++, end)->move; if (move != ttMove) return move; break; case CAPTURES_S5: move = pick_best(cur++, end)->move; if (move != ttMove && pos.see(move) > captureThreshold) return move; break; case CAPTURES_S6: move = pick_best(cur++, end)->move; if (to_sq(move) == recaptureSquare) return move; break; case QUIET_CHECKS_S3: move = (cur++)->move; if (move != ttMove) return move; break; case STOP: return MOVE_NONE; default: assert(false); } } }