From 81b24d30828db06c058452798bc4ed9090f9c625 Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Sun, 2 Feb 2025 21:39:33 +0100 Subject: [PATCH] extended FEN support to include who's turn it is --- cpp/src/board.cpp | 15 +++++++++++++-- cpp/tests/fen.cpp | 24 ++++++++++++------------ 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/cpp/src/board.cpp b/cpp/src/board.cpp index 439b72e..1331409 100644 --- a/cpp/src/board.cpp +++ b/cpp/src/board.cpp @@ -19,6 +19,7 @@ Board Board::setup_fen_position(std::string fen) { {'q', Piece::Queen}, }; + // -- Pieces std::string fen_board = fen.substr(0, fen.find(' ')); int rank = 7, file = 0; for (char symbol : fen_board) { @@ -39,6 +40,11 @@ Board Board::setup_fen_position(std::string fen) { file++; } } + + // -- Active colour + int index = fen.find(' '); + index++; + board.white_to_play = fen[index] == 'w'; return board; } @@ -53,15 +59,16 @@ std::string Board::to_fen() const { }; std::string ret; + // -- Pieces for (int rank = 7; rank >= 0; rank--) { int empty_cell_counter = 0; for (int file = 0; file < 8; file++) { - if (this->squares[rank * 8 + file] == Piece::None) { + if (squares[rank * 8 + file] == Piece::None) { empty_cell_counter++; continue; } - int full_piece = this->squares[rank * 8 + file]; + int full_piece = squares[rank * 8 + file]; char piece = p2c[full_piece & 0b111]; int8_t colour = colour_at({file, rank}); @@ -76,6 +83,10 @@ std::string Board::to_fen() const { if (rank > 0) ret += "/"; } + ret += " "; + + // -- Active colour + ret += white_to_play ? 'w' : 'b'; return ret; } diff --git a/cpp/tests/fen.cpp b/cpp/tests/fen.cpp index e2f6675..9a5030f 100644 --- a/cpp/tests/fen.cpp +++ b/cpp/tests/fen.cpp @@ -2,21 +2,21 @@ #include "lib.hpp" int main() { - std::string pos = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR"; - ASSERT_EQUALS(pos, Board::setup_fen_position(pos)->to_fen()); + std::string pos = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w"; + ASSERT_EQUALS(pos, Board::setup_fen_position(pos).to_fen()); - pos = "r1bk3r/p2pBpNp/n4n2/1p1NP2P/6P1/3P4/P1P1K3/q5b1"; - ASSERT_EQUALS(pos, Board::setup_fen_position(pos)->to_fen()); + pos = "r1bk3r/p2pBpNp/n4n2/1p1NP2P/6P1/3P4/P1P1K3/q5b1 b"; + ASSERT_EQUALS(pos, Board::setup_fen_position(pos).to_fen()); - pos = "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR"; - ASSERT_EQUALS(pos, Board::setup_fen_position(pos)->to_fen()); + pos = "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b"; + ASSERT_EQUALS(pos, Board::setup_fen_position(pos).to_fen()); - pos = "4k2r/6r1/8/8/8/8/3R4/R3K3"; - ASSERT_EQUALS(pos, Board::setup_fen_position(pos)->to_fen()); + pos = "4k2r/6r1/8/8/8/8/3R4/R3K3 w"; + ASSERT_EQUALS(pos, Board::setup_fen_position(pos).to_fen()); - pos = "8/8/8/4p1K1/2k1P3/8/8/8"; - ASSERT_EQUALS(pos, Board::setup_fen_position(pos)->to_fen()); + pos = "8/8/8/4p1K1/2k1P3/8/8/8 b"; + ASSERT_EQUALS(pos, Board::setup_fen_position(pos).to_fen()); - pos = "8/5k2/3p4/1p1Pp2p/pP2Pp1P/P4P1K/8/8"; - ASSERT_EQUALS(pos, Board::setup_fen_position(pos)->to_fen()); + pos = "8/5k2/3p4/1p1Pp2p/pP2Pp1P/P4P1K/8/8 b"; + ASSERT_EQUALS(pos, Board::setup_fen_position(pos).to_fen()); }