diff options
| -rw-r--r-- | src/board.cpp | 156 | ||||
| -rw-r--r-- | src/main.cpp | 2 |
2 files changed, 110 insertions, 48 deletions
diff --git a/src/board.cpp b/src/board.cpp index 1085dbb..d15f4b9 100644 --- a/src/board.cpp +++ b/src/board.cpp @@ -1,6 +1,8 @@ #include "board.hpp" #include <cctype> #include <cstdio> +#include <iostream> +#include <print> #include <string> bool WHITE = true; @@ -22,65 +24,125 @@ void printBoard(board *b) { std::printf("\n"); } } + std::printf("%d to play\n", b->turn); + std::cout << "castle: " << b->castle << "\n"; } 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++) { - if (fen[i] == '/') { - file = 0; - rank++; - continue; - } - if (isdigit(fen[i])) { - int move = fen[i] - '0'; - file += move; + 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 (toupper(fen[i]) == 'W') { - b->turn = WHITE; + 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 (toupper(fen[i]) == 'B') { - b->turn = BLACK; - } - if (toupper(fen[i]) == 'N') { - Piece piece = createPiece(KNIGHT, isupper(i)); - b->pieces[rank * 8 + file] = piece; - file++; - continue; - } - if (toupper(fen[i]) == 'R') { - Piece piece = createPiece(ROOK, isupper(i)); - b->pieces[rank * 8 + file] = piece; - file++; - continue; + if (state == TURN) { + if (toupper(fen[i]) == 'W') { + b->turn = WHITE; + continue; + } + if (toupper(fen[i]) == 'B') { + b->turn = BLACK; + continue; + } } - if (toupper(fen[i]) == 'Q') { - Piece piece = createPiece(QUEEN, isupper(i)); - b->pieces[rank * 8 + file] = piece; - file++; - continue; - } - if (toupper(fen[i]) == 'B') { - Piece piece = createPiece(BISHOP, isupper(i)); - b->pieces[rank * 8 + file] = piece; - file++; - continue; - } - if (toupper(fen[i]) == 'P') { - Piece piece = createPiece(PAWN, isupper(i)); - b->pieces[rank * 8 + file] = piece; - file++; - continue; - } - if (toupper(fen[i]) == 'K') { - Piece piece = createPiece(KING, isupper(i)); - b->pieces[rank * 8 + file] = piece; - file++; - 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; } diff --git a/src/main.cpp b/src/main.cpp index a2d9deb..f958d11 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,7 +11,7 @@ Piece NonePiece = { int main() { board b; b.turn = true; - b.castle = "KQkq"; + b.castle = ""; b.halfMoveClock = 0; b.MoveClock = 0; for (int i = 0; i < 64; i++) { |
