# Minimax check(mate) detection

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. Thank you in advance.

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.

• 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. Jan 16, 2020 at 10:54
• @eligolf Would that be possible to accept my answer? Jan 17, 2020 at 13:44