-
- hs = moves[i].score - values[to];
- if (hs > bestScore)
- {
- bestIndex = i;
- bestScore = hs;
- }
- }
-
- if (bestIndex != -1)
- {
- // Raise value of the picked square, so next attack
- // to the same square will get low priority.
- to = move_to(moves[bestIndex].move);
- values[to] += 0xB00;
- }
- return bestIndex;
-}
-
-
-/// MovePicker::pick_move_from_list() picks the move with the biggest score
-/// from a list of generated moves (moves[] or badCaptures[], depending on
-/// the current move generation phase). It takes care not to return the
-/// transposition table move if that has already been serched previously.
-
-Move MovePicker::pick_move_from_list() {
-
- int bestIndex;
- Move move;
-
- switch (PhaseTable[phaseIndex]) {
-
- case PH_GOOD_CAPTURES:
- assert(!pos.is_check());
- assert(movesPicked >= 0);
-
- while (movesPicked < numOfMoves)
- {
- bestIndex = find_best_index();
- move = moves[bestIndex].move;
- moves[bestIndex] = moves[movesPicked++];
- if ( move != ttMove
- && move != mateKiller
- && pos.pl_move_is_legal(move, pinned))
- return move;
- }
- break;
-
- case PH_NONCAPTURES:
- assert(!pos.is_check());
- assert(movesPicked >= 0);
-
- while (movesPicked < numOfMoves)
- {
- // If this is a PV node or we have only picked a few moves, scan
- // the entire move list for the best move. If many moves have already
- // been searched and it is not a PV node, we are probably failing low
- // anyway, so we just pick the first move from the list.
- bestIndex = (pvNode || movesPicked < 12) ? find_best_index() : movesPicked;
- move = moves[bestIndex].move;
- moves[bestIndex] = moves[movesPicked++];
- if ( move != ttMove
- && move != mateKiller
- && pos.pl_move_is_legal(move, pinned))
- return move;
- }
- break;
-
- case PH_EVASIONS:
- assert(pos.is_check());
- assert(movesPicked >= 0);
-
- while (movesPicked < numOfMoves)
- {
- bestIndex = find_best_index();
- move = moves[bestIndex].move;
- moves[bestIndex] = moves[movesPicked++];
- return move;
- }
- break;
-
- case PH_BAD_CAPTURES:
- assert(!pos.is_check());
- assert(movesPicked >= 0);
- // It's probably a good idea to use SEE move ordering here, instead
- // of just picking the first move. FIXME
- while (movesPicked < numOfBadCaptures)
- {
- move = badCaptures[movesPicked++].move;
- if ( move != ttMove
- && move != mateKiller
- && pos.pl_move_is_legal(move, pinned))
- return move;
- }
- break;
-
- case PH_QCAPTURES:
- assert(!pos.is_check());
- assert(movesPicked >= 0);
- while (movesPicked < numOfMoves)
- {
- bestIndex = (movesPicked < 4 ? find_best_index() : movesPicked);
- move = moves[bestIndex].move;
- moves[bestIndex] = moves[movesPicked++];
- // Remember to change the line below if we decide to hash the qsearch!
- // Maybe also postpone the legality check until after futility pruning?
- if (/* move != ttMove && */ pos.pl_move_is_legal(move, pinned))
- return move;
- }
- break;
-
- case PH_QCHECKS:
- assert(!pos.is_check());
- assert(movesPicked >= 0);
- // Perhaps we should do something better than just picking the first
- // move here? FIXME
- while (movesPicked < numOfMoves)
- {
- move = moves[movesPicked++].move;
- // Remember to change the line below if we decide to hash the qsearch!
- if (/* move != ttMove && */ pos.pl_move_is_legal(move, pinned))
- return move;
- }
- break;
-
- default:
- break;