From 4792daf127c84a1114d569505a72ff4743916918 Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Sun, 2 Feb 2025 14:50:44 +0100 Subject: [PATCH] cpp board can go back and forth from FEN --- cpp/board | Bin 0 -> 80328 bytes cpp/board.cpp | 110 ++++++++++++++++++++++++++++++++++++++++++++++ cpp/main.cpp | 16 +++++++ cpp/stickfosh.cpp | 0 cpp/tests/fen | Bin 0 -> 80568 bytes cpp/tests/fen.cpp | 37 ++++++++++++++++ 6 files changed, 163 insertions(+) create mode 100755 cpp/board create mode 100644 cpp/board.cpp create mode 100644 cpp/main.cpp create mode 100644 cpp/stickfosh.cpp create mode 100755 cpp/tests/fen create mode 100644 cpp/tests/fen.cpp diff --git a/cpp/board b/cpp/board new file mode 100755 index 0000000000000000000000000000000000000000..be3d5935a157d4193319cabb45b32c2eecc6a6c1 GIT binary patch literal 80328 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 a<=7wHuErgUFR{wMlc91>a1?MPjsFd$&yzL) literal 0 HcmV?d00001 diff --git a/cpp/board.cpp b/cpp/board.cpp new file mode 100644 index 0000000..a5758b6 --- /dev/null +++ b/cpp/board.cpp @@ -0,0 +1,110 @@ +#include +#include +#include +#include +#include + +enum Piece { + None = 0, + King = 1, + Pawn = 2, + Knigt = 3, + Bishop = 4, + Rook = 5, + Queen = 6, +}; + +enum Colour { + White = 8, + Black = 16, +}; + +enum CastleRights { + KingSide = 1, + QueenSide = 2, +}; + +class Board { + public: // make this private after debugging + int squares[64] = {Piece::None}; + Colour turn; + int castle_rights; + + public: + static Board* setup_fen_position(std::string fen); + + std::string to_fen(); +}; + +Board* Board::setup_fen_position(std::string fen) { + Board* board = new Board(); + std::map c2p{ + {'k', Piece::King}, + {'p', Piece::Pawn}, + {'n', Piece::Knigt}, + {'b', Piece::Bishop}, + {'r', Piece::Rook}, + {'q', Piece::Queen}, + }; + + std::string fen_board = fen.substr(0, fen.find(' ')); + int rank = 7, file = 0; + for (char symbol : fen_board) { + if (symbol == '/') { + file = 0; + rank--; + continue; + } + + if (std::isdigit(symbol)) + file += symbol - '0'; + else { + Colour colour = + std::isupper(symbol) ? Colour::White : Colour::Black; + + Piece piece = c2p[std::tolower(symbol)]; + board->squares[rank * 8 + file] = colour | piece; + file++; + } + } + return board; +} + +std::string Board::to_fen() { + std::map p2c{ + {Piece::King, 'k'}, + {Piece::Pawn, 'p'}, + {Piece::Knigt, 'n'}, + {Piece::Bishop, 'b'}, + {Piece::Rook, 'r'}, + {Piece::Queen, 'q'}, + }; + + std::string ret; + 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) { + empty_cell_counter++; + continue; + } + + int full_piece = this->squares[rank * 8 + file]; + char piece = p2c[full_piece & 0b111]; + Colour colour = (full_piece & 0b11000) == Colour::White + ? Colour::White + : Colour::Black; + + if (empty_cell_counter > 0) { + ret += std::to_string(empty_cell_counter); + empty_cell_counter = 0; + } + ret += colour == Colour::White ? std::toupper(piece) : piece; + } + if (empty_cell_counter > 0) + ret += std::to_string(empty_cell_counter); + if (rank > 0) + ret += "/"; + } + return ret; +} diff --git a/cpp/main.cpp b/cpp/main.cpp new file mode 100644 index 0000000..bf59c81 --- /dev/null +++ b/cpp/main.cpp @@ -0,0 +1,16 @@ +#include "board.cpp" + +int main(int argc, char* argv[]) { + std::string pos = + "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8"; + Board* b = Board::setup_fen_position(pos); + + std::string fen = b->to_fen(); + + std::cout << pos << std::endl; + std::cout << fen << std::endl; + + std::cout << (fen.substr(0, fen.find(" ")) == pos.substr(0, pos.find(" "))) + << std::endl; + return 0; +} diff --git a/cpp/stickfosh.cpp b/cpp/stickfosh.cpp new file mode 100644 index 0000000..e69de29 diff --git a/cpp/tests/fen b/cpp/tests/fen new file mode 100755 index 0000000000000000000000000000000000000000..bafed67e534ecdab796bd5d4f3909e48805b003b GIT binary patch literal 80568 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 literal 0 HcmV?d00001 diff --git a/cpp/tests/fen.cpp b/cpp/tests/fen.cpp new file mode 100644 index 0000000..857e917 --- /dev/null +++ b/cpp/tests/fen.cpp @@ -0,0 +1,37 @@ +#include "../board.cpp" + +#define IS_TRUE(x) \ + { \ + if (!(x)) \ + std::cout << __FUNCTION__ << " failed on line " << __LINE__ \ + << std::endl; \ + } + +#define ASSERT_EQUALS(expected, actual) \ + { \ + if (expected != actual) \ + std::cout << "Expected: " << std::endl \ + << '\t' << expected << std::endl \ + << "Got: " << std::endl \ + << '\t' << actual << std::endl; \ + } + +int main() { + std::string pos = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR"; + 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 = "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR"; + 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 = "8/8/8/4p1K1/2k1P3/8/8/8"; + 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()); +}