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<Move> Board::all_capturing_moves() const { return ret; } + +std::vector<int8_t> Board::opponent_pawn_attack_map() const { + std::vector<int8_t> 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<int8_t> 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<Move> all_legal_moves() const; std::vector<Move> all_capturing_moves() const; + std::vector<int8_t> 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<Move> pawn_moves(const Board& b, const Coords xy) { return ret; } + +std::vector<int8_t> pawn_attack_map(const Board& b, Coords xy) { + std::vector<int8_t> 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<Move> keep_only_blocking(const std::vector<Move>, const Board&); std::optional<Move> move_for_position(const Board&, const Coords, const Coords); std::vector<Move> look_direction(const Board&, const Coords, int, int); +std::vector<int8_t> pawn_attack_map(const Board&, const Coords); std::vector<Move> pawn_moves(const Board&, const Coords); std::vector<Move> rook_moves(const Board&, const Coords); std::vector<Move> 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 <algorithm> + 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<int8_t> 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; }