From 01c912435b1cc90b629f5c085765d4455f275911 Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Sun, 2 Feb 2025 20:17:36 +0100 Subject: [PATCH] implemented bishop legal moves --- cpp/src/pieces/bishop.cpp | 23 +++++++++++++++++++++++ cpp/src/pieces/piece.cpp | 34 ++++++++++++++++++++++++++++++++++ cpp/src/pieces/piece.hpp | 3 +++ 3 files changed, 60 insertions(+) create mode 100644 cpp/src/pieces/bishop.cpp diff --git a/cpp/src/pieces/bishop.cpp b/cpp/src/pieces/bishop.cpp new file mode 100644 index 0000000..472c83e --- /dev/null +++ b/cpp/src/pieces/bishop.cpp @@ -0,0 +1,23 @@ +#include "../board.hpp" +#include "../coords.hpp" +#include "../move.hpp" +#include "piece.hpp" + +#include + +std::vector bishop_moves(const Board& b, const Coords xy) { + std::vector ret; + auto ne = look_direction(b, xy, 1, 1); + ret.insert(ret.end(), ne.begin(), ne.end()); + + auto se = look_direction(b, xy, 1, -1); + ret.insert(ret.end(), se.begin(), se.end()); + + auto sw = look_direction(b, xy, -1, -1); + ret.insert(ret.end(), sw.begin(), sw.end()); + + auto nw = look_direction(b, xy, -1, 1); + ret.insert(ret.end(), nw.begin(), nw.end()); + + return ret; +} diff --git a/cpp/src/pieces/piece.cpp b/cpp/src/pieces/piece.cpp index 99cd572..a30daac 100644 --- a/cpp/src/pieces/piece.cpp +++ b/cpp/src/pieces/piece.cpp @@ -36,3 +36,37 @@ std::vector legal_moves( return {}; } + +std::optional +move_for_position(const Board& board, const Coords source, const Coords dest) { + if (dest.is_within_bounds()) + return {}; + + int8_t piece = board.squares[dest.to_index()]; + if (piece == Piece::None) + return Move{source.to_index(), dest.to_index()}; + + int8_t source_colour = board.squares[source.to_index()] & 0b11000; + int8_t dest_colour = piece & 0b11000; + if (source_colour != dest_colour) + return Move{source.to_index(), dest.to_index(), true}; + return {}; +} + +std::vector +look_direction(const Board& board, const Coords xy, int mult_dx, int mult_dy) { + std::vector ret; + for (int d = 0; d < 8; d++) { + int dx = mult_dx * d; + int dy = mult_dy * d; + + std::optional move = + move_for_position(board, xy, Coords{xy.x + dx, xy.y + dy}); + if (move.has_value()) { + ret.push_back(move.value()); + if (move.value().is_capturing) + break; + } + } + return ret; +} diff --git a/cpp/src/pieces/piece.hpp b/cpp/src/pieces/piece.hpp index dd1a46c..0e51010 100644 --- a/cpp/src/pieces/piece.hpp +++ b/cpp/src/pieces/piece.hpp @@ -3,6 +3,7 @@ #include "../move.hpp" #include +#include #include enum Piece : int8_t { @@ -25,6 +26,8 @@ struct Coords; std::vector legal_moves(int8_t, const Board&, const Coords, bool); 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_moves(const Board&, const Coords); std::vector rook_moves(const Board&, const Coords);