extended FEN support to include who's turn it is

This commit is contained in:
Karma Riuk 2025-02-02 21:39:33 +01:00
parent 497da2de8e
commit 81b24d3082
2 changed files with 25 additions and 14 deletions

View File

@ -19,6 +19,7 @@ Board Board::setup_fen_position(std::string fen) {
{'q', Piece::Queen}, {'q', Piece::Queen},
}; };
// -- Pieces
std::string fen_board = fen.substr(0, fen.find(' ')); std::string fen_board = fen.substr(0, fen.find(' '));
int rank = 7, file = 0; int rank = 7, file = 0;
for (char symbol : fen_board) { for (char symbol : fen_board) {
@ -39,6 +40,11 @@ Board Board::setup_fen_position(std::string fen) {
file++; file++;
} }
} }
// -- Active colour
int index = fen.find(' ');
index++;
board.white_to_play = fen[index] == 'w';
return board; return board;
} }
@ -53,15 +59,16 @@ std::string Board::to_fen() const {
}; };
std::string ret; std::string ret;
// -- Pieces
for (int rank = 7; rank >= 0; rank--) { for (int rank = 7; rank >= 0; rank--) {
int empty_cell_counter = 0; int empty_cell_counter = 0;
for (int file = 0; file < 8; file++) { 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++; empty_cell_counter++;
continue; continue;
} }
int full_piece = this->squares[rank * 8 + file]; int full_piece = squares[rank * 8 + file];
char piece = p2c[full_piece & 0b111]; char piece = p2c[full_piece & 0b111];
int8_t colour = colour_at({file, rank}); int8_t colour = colour_at({file, rank});
@ -76,6 +83,10 @@ std::string Board::to_fen() const {
if (rank > 0) if (rank > 0)
ret += "/"; ret += "/";
} }
ret += " ";
// -- Active colour
ret += white_to_play ? 'w' : 'b';
return ret; return ret;
} }

View File

@ -2,21 +2,21 @@
#include "lib.hpp" #include "lib.hpp"
int main() { int main() {
std::string pos = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR"; std::string pos = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w";
ASSERT_EQUALS(pos, Board::setup_fen_position(pos)->to_fen()); ASSERT_EQUALS(pos, Board::setup_fen_position(pos).to_fen());
pos = "r1bk3r/p2pBpNp/n4n2/1p1NP2P/6P1/3P4/P1P1K3/q5b1"; pos = "r1bk3r/p2pBpNp/n4n2/1p1NP2P/6P1/3P4/P1P1K3/q5b1 b";
ASSERT_EQUALS(pos, Board::setup_fen_position(pos)->to_fen()); ASSERT_EQUALS(pos, Board::setup_fen_position(pos).to_fen());
pos = "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR"; pos = "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b";
ASSERT_EQUALS(pos, Board::setup_fen_position(pos)->to_fen()); ASSERT_EQUALS(pos, Board::setup_fen_position(pos).to_fen());
pos = "4k2r/6r1/8/8/8/8/3R4/R3K3"; pos = "4k2r/6r1/8/8/8/8/3R4/R3K3 w";
ASSERT_EQUALS(pos, Board::setup_fen_position(pos)->to_fen()); ASSERT_EQUALS(pos, Board::setup_fen_position(pos).to_fen());
pos = "8/8/8/4p1K1/2k1P3/8/8/8"; pos = "8/8/8/4p1K1/2k1P3/8/8/8 b";
ASSERT_EQUALS(pos, Board::setup_fen_position(pos)->to_fen()); ASSERT_EQUALS(pos, Board::setup_fen_position(pos).to_fen());
pos = "8/5k2/3p4/1p1Pp2p/pP2Pp1P/P4P1K/8/8"; pos = "8/5k2/3p4/1p1Pp2p/pP2Pp1P/P4P1K/8/8 b";
ASSERT_EQUALS(pos, Board::setup_fen_position(pos)->to_fen()); ASSERT_EQUALS(pos, Board::setup_fen_position(pos).to_fen());
} }