From 959ecdeb7d4930fddac197c217decc1fbe90de85 Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Sun, 16 Feb 2025 09:28:55 +0100 Subject: [PATCH] added the opponenent pawn attack map move better ordering --- cpp/src/model/board/board.cpp | 14 ++++++++++++++ cpp/src/model/board/board.hpp | 1 + cpp/src/model/pieces/pawn.cpp | 21 +++++++++++++++++++++ cpp/src/model/pieces/piece.hpp | 1 + cpp/src/model/utils/move.cpp | 7 +++++++ 5 files changed, 44 insertions(+) diff --git a/cpp/src/model/board/board.cpp b/cpp/src/model/board/board.cpp index 616a1dc..ec977c3 100644 --- a/cpp/src/model/board/board.cpp +++ b/cpp/src/model/board/board.cpp @@ -421,3 +421,17 @@ std::vector Board::all_capturing_moves() const { return ret; } + +std::vector Board::opponent_pawn_attack_map() const { + std::vector ret; + for (int i = 0; i < 64; i++) { + if (piece_at(i) == Piece::Pawn + && ((colour_at(i) == White && !white_to_play) + || (colour_at(i) == Black && white_to_play))) { + std::vector attack_map = + pawn_attack_map(*this, Coords::from_index(i)); + ret.insert(ret.end(), attack_map.begin(), attack_map.end()); + } + } + return ret; +} diff --git a/cpp/src/model/board/board.hpp b/cpp/src/model/board/board.hpp index f4ffa59..96d5392 100644 --- a/cpp/src/model/board/board.hpp +++ b/cpp/src/model/board/board.hpp @@ -39,6 +39,7 @@ struct Board { std::vector all_legal_moves() const; std::vector all_capturing_moves() const; + std::vector opponent_pawn_attack_map() const; bool is_checkmate() const; diff --git a/cpp/src/model/pieces/pawn.cpp b/cpp/src/model/pieces/pawn.cpp index aeac3a7..67f9b36 100644 --- a/cpp/src/model/pieces/pawn.cpp +++ b/cpp/src/model/pieces/pawn.cpp @@ -79,3 +79,24 @@ std::vector pawn_moves(const Board& b, const Coords xy) { return ret; } + +std::vector pawn_attack_map(const Board& b, Coords xy) { + std::vector ret{}; + Colour my_colour = b.colour_at(xy); + + // -- Capture to the left + if (xy.x > 0) { + int dy = my_colour == Colour::White ? 1 : -1; + Coords left{xy.x - 1, xy.y + dy}; + ret.push_back(left.to_index()); + } + + // -- Capture to the right + if (xy.x < 7) { + int dy = my_colour == Colour::White ? 1 : -1; + Coords right{xy.x + 1, xy.y + dy}; + ret.push_back(right.to_index()); + } + + return ret; +} diff --git a/cpp/src/model/pieces/piece.hpp b/cpp/src/model/pieces/piece.hpp index 7911b1e..a1c90d4 100644 --- a/cpp/src/model/pieces/piece.hpp +++ b/cpp/src/model/pieces/piece.hpp @@ -69,6 +69,7 @@ std::vector keep_only_blocking(const std::vector, const Board&); std::optional move_for_position(const Board&, const Coords, const Coords); std::vector look_direction(const Board&, const Coords, int, int); +std::vector pawn_attack_map(const Board&, const Coords); std::vector pawn_moves(const Board&, const Coords); std::vector rook_moves(const Board&, const Coords); std::vector knight_moves(const Board&, const Coords); diff --git a/cpp/src/model/utils/move.cpp b/cpp/src/model/utils/move.cpp index 118e2f2..6a47969 100644 --- a/cpp/src/model/utils/move.cpp +++ b/cpp/src/model/utils/move.cpp @@ -3,6 +3,8 @@ #include "../board/board.hpp" #include "utils.hpp" +#include + int Move::score_guess(const Board& b) const { int ret = 0; @@ -15,5 +17,10 @@ int Move::score_guess(const Board& b) const { if (promoting_to != Piece::None) ret += piece_value(promoting_to); + std::vector pawn_attack_map = b.opponent_pawn_attack_map(); + if (std::find(pawn_attack_map.begin(), pawn_attack_map.end(), target_square) + != pawn_attack_map.end()) + ret -= me_piece; + return ret; }