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;
 }