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

View File

@ -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());
}