#include "board.hpp" #include #include #include #include #include bool WHITE = true; bool BLACK = false; const char toChar(pieceType type) { switch (type) { case NONE: return '.'; case PAWN: return 'P'; case KNIGHT: return 'N'; case BISHOP: return 'B'; case ROOK: return 'R'; case QUEEN: return 'Q'; case KING: return 'K'; default: return '?'; } } Piece createPiece(pieceType type, bool color, bool moved) { Piece piece; piece.type = type; piece.color = color; piece.moved = moved; return piece; }; void printBoard(board *b) { std::string line = " +-----------------+\n"; std::string letter = " a b c d e f g h\n"; std::cout << letter; std::cout << line; for (int rank = 0; rank < 8; rank++) { std::printf("%d |", 8 - rank); for (int file = 0; file < 8; file++) { Piece piece = b->pieces[rank * 8 + file]; char symbol = toChar(piece.type); if (piece.color == BLACK) { symbol = std::tolower(static_cast(symbol)); } std::printf(" %c", symbol); } std::printf(" | %d\n", 8 - rank); } std::cout << line; std::cout << letter; std::println(); std::println("Turn: {}", b->turn == WHITE ? "White" : "Black"); std::println("Castling: {}", b->castle); } void setBoardFen(std::string fen, board *b) { // example fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 int file = 0; int rank = 0; std::string castle = ""; enum parserState { POSITION, TURN, CASTLE, ENPASSANT, CLOCK1, CLOCK2, }; parserState state = POSITION; for (int i = 0; i < fen.length(); i++) { std::printf("state: %d\n", state); std::printf("doing: %c\n", fen[i]); if (fen[i] == ' ') { if (state == POSITION) { state = TURN; continue; } if (state == TURN) { state = CASTLE; continue; } if (state == CASTLE) { state = ENPASSANT; continue; } continue; } if (state == CASTLE) { if (fen[i] == '-') { castle = "-"; continue; } if (toupper(fen[i]) == 'K') { castle += fen[i]; continue; } if (toupper(fen[i]) == 'Q') { castle += fen[i]; continue; } } if (state == TURN) { if (toupper(fen[i]) == 'W') { b->turn = WHITE; continue; } if (toupper(fen[i]) == 'B') { b->turn = BLACK; continue; } } if (state == POSITION) { if (isdigit(fen[i])) { int move = fen[i] - '0'; file += move; if (file > 8) { std::println("Fatal: file was to big"); return; // malformed rank } continue; } if (fen[i] == '/') { file = 0; rank++; if (rank > 8) { std::println("Fatal: rank was to big"); return; // malformed rank } continue; } if (toupper(fen[i]) == 'N') { Piece piece = createPiece(KNIGHT, isupper(fen[i])); b->pieces[rank * 8 + file] = piece; file++; continue; } if (toupper(fen[i]) == 'R') { Piece piece = createPiece(ROOK, isupper(fen[i])); b->pieces[rank * 8 + file] = piece; file++; continue; } if (toupper(fen[i]) == 'Q') { Piece piece = createPiece(QUEEN, isupper(fen[i])); b->pieces[rank * 8 + file] = piece; file++; continue; } if (toupper(fen[i]) == 'B') { Piece piece = createPiece(BISHOP, isupper(fen[i])); b->pieces[rank * 8 + file] = piece; file++; continue; } if (toupper(fen[i]) == 'P') { Piece piece = createPiece(PAWN, isupper(fen[i])); b->pieces[rank * 8 + file] = piece; file++; continue; } if (toupper(fen[i]) == 'K') { Piece piece = createPiece(KING, isupper(fen[i])); b->pieces[rank * 8 + file] = piece; file++; continue; } } break; } b->castle = castle.empty() ? "-" : castle; }