From 6e567f2f115bbd1457ea6fe3676f68c3422b1400 Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Thu, 6 Feb 2025 22:34:48 +0100 Subject: [PATCH] added the check for insufficient material --- cpp/src/model/board/board.cpp | 23 +++++++++++++++++++++++ cpp/src/model/board/board.hpp | 7 ++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/cpp/src/model/board/board.cpp b/cpp/src/model/board/board.cpp index 18d0dbb..4760373 100644 --- a/cpp/src/model/board/board.cpp +++ b/cpp/src/model/board/board.cpp @@ -5,6 +5,7 @@ #include "../utils/move.hpp" #include "../utils/utils.hpp" +#include #include #include #include @@ -269,6 +270,28 @@ Board Board::make_move(Move move) const { return ret; } +bool Board::insufficient_material_for(Colour current_colour) const { + int n_bishop = 0, n_knight = 0; + + for (int i = 0; i < 64; i++) { + Colour colour = colour_at(i); + if (colour != current_colour) + continue; + + Piece piece = piece_at(i); + if (piece == Piece::Pawn || piece == Piece::Queen + || piece == Piece::Rook) + return false; + + if (piece == Piece::Bishop) + n_bishop++; + if (piece == Piece::Knigt && colour == Colour::White) + n_knight++; + } + return (n_bishop == 0 && n_knight == 0) || (n_bishop == 1 && n_knight == 0) + || (n_bishop == 0 && n_knight == 1); +} + int8_t Board::get_king_of(int8_t colour) const { for (int i = 0; i < 64; i++) if (squares[i] == (colour | Piece::King)) diff --git a/cpp/src/model/board/board.hpp b/cpp/src/model/board/board.hpp index 2657c35..7233f2f 100644 --- a/cpp/src/model/board/board.hpp +++ b/cpp/src/model/board/board.hpp @@ -25,7 +25,12 @@ struct Board { Board make_move(Move) const; std::string to_fen() const; bool is_check_for(int8_t) const; - bool insufficient_material() const; + bool insufficient_material_for(Colour) const; + + bool insufficient_material() const { + return insufficient_material_for(White) + && insufficient_material_for(Black); + }; std::vector all_legal_moves() const;