diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 6ce0039a..ac111069 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -48,7 +48,8 @@ Value Evaluation::value() int pieceInHandDiffCount; int pieceOnBoardDiffCount; - int pieceToRemoveCount; + int pieceToRemoveCount = (pos.side_to_move() == BLACK) ? + pos.piece_to_remove_count() : -pos.piece_to_remove_count();; switch (pos.get_phase()) { case Phase::ready: @@ -67,8 +68,6 @@ Value Evaluation::value() break; case Action::remove: - pieceToRemoveCount = (pos.side_to_move() == BLACK) ? - pos.piece_to_remove_count() : -pos.piece_to_remove_count(); value += VALUE_EACH_PIECE_PLACING_NEEDREMOVE * pieceToRemoveCount; break; default: @@ -90,8 +89,6 @@ Value Evaluation::value() break; case Action::remove: - pieceToRemoveCount = (pos.side_to_move() == BLACK) ? - pos.piece_to_remove_count() : -(pos.piece_to_remove_count()); value += VALUE_EACH_PIECE_MOVING_NEEDREMOVE * pieceToRemoveCount; break; default: @@ -129,6 +126,28 @@ Value Evaluation::value() value = -value; } +#if EVAL_DRAW_WHEN_NOT_KNOWN_WIN_IF_MAY_FLY + if (pos.get_phase() == Phase::moving && rule.mayFly && !rule.hasDiagonalLines) { + int piece_on_board_count_future_black = pos.piece_on_board_count(BLACK); + int piece_on_board_count_future_white = pos.piece_on_board_count(WHITE); + + if (pos.side_to_move() == BLACK) { + piece_on_board_count_future_white -= pos.piece_to_remove_count(); + } + + if (pos.side_to_move() == WHITE) { + piece_on_board_count_future_black -= pos.piece_to_remove_count(); + } + + + if (piece_on_board_count_future_white == 3 || piece_on_board_count_future_black == 3) { + if (abs(value) < VALUE_KNOWN_WIN) { + value = VALUE_DRAW; + } + } + } +#endif + return value; } diff --git a/src/types.h b/src/types.h index bde2b34d..6ef1accc 100644 --- a/src/types.h +++ b/src/types.h @@ -196,7 +196,7 @@ enum Value : int8_t { VALUE_ZERO = 0, VALUE_DRAW = 0, - VALUE_KNOWN_WIN = 20, + VALUE_KNOWN_WIN = 25, VALUE_UNIQUE = 60, VALUE_MATE = 80, VALUE_INFINITE = 125,