6

in my minimax function I have a first few lines looking something like this:

children = board.get_all_possible_moves(board)

if depth = 0 or board.is_check_mate or board.is_draw:
    return None, evaluation(board)

The problem is that it takes time to calculate the children one "extra time" if the depth is 0 and the position is not draw or check mate. However, I want to know if the board state at depth 0 is check mate or draw.

As of now I detect check mate and draw by the following logic:

if not possible_moves:
    if board.is_check:
        board.is_check_mate = True
    else:
        board.is_draw = True

Is there a better way of finding whether a posisiton is check mate or not? Without having to calculate the opponents possible moves first, to save time in the minimax recursive function.

1 Answer 1

3

Your approach is correct. Stockfish does it as well.

https://github.com/official-stockfish/Stockfish/blob/master/src/search.cpp

if (rootMoves.empty())
{
  rootMoves.emplace_back(MOVE_NONE);
  sync_cout << "info depth 0 score "
            << UCI::value(rootPos.checkers() ? -VALUE_MATE : VALUE_DRAW)
            << sync_endl;
 }

There shouldn't be much penalty in performance, because:

  1. You will always need to generate candidate moves anyway
  2. Your code should maintain a bitboard (or other data structure) for the pieces checking the king. You will always need this information in your evaluation.

Consequently, what you're doing is just checking information that you already have.

3
  • Thank you. I thought it would be a better way. My engine can currently only reach a depth of 3 (1.5 ply?) which is not very good. Not using bitboards at the moment, the board is a class (in Python) with all move information and stuff in it.
    – eligolf
    Commented Jan 16, 2020 at 10:54
  • @eligolf Would that be possible to accept my answer?
    – SmallChess
    Commented Jan 17, 2020 at 13:44
  • @eligolf Dear Eligolf, could you kindly have a look at this question: stackoverflow.com/questions/78404555/… ? Commented Apr 30 at 14:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.