diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/board.cpp | 78 | ||||
| -rw-r--r-- | src/board.hpp | 11 | ||||
| -rw-r--r-- | src/main.cpp | 17 |
3 files changed, 95 insertions, 11 deletions
diff --git a/src/board.cpp b/src/board.cpp index 81cb583..1085dbb 100644 --- a/src/board.cpp +++ b/src/board.cpp @@ -1,12 +1,86 @@ #include "board.hpp" +#include <cctype> #include <cstdio> +#include <string> +bool WHITE = true; +bool BLACK = false; + +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) { for (int i = 0; i < 64; i++) { - piece currentPiece = b->pieces[i]; - std::printf("%d ", currentPiece.type); + Piece currentPiece = b->pieces[i]; + std::printf("%d%d%d ", currentPiece.type, currentPiece.moved, + currentPiece.color); if (i % 8 == 7 && i != 0) { std::printf("\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; + + 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; + continue; + } + if (toupper(fen[i]) == 'W') { + b->turn = WHITE; + } + 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 (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; + } + break; + } +} diff --git a/src/board.hpp b/src/board.hpp index 68557c8..eb2f153 100644 --- a/src/board.hpp +++ b/src/board.hpp @@ -1,6 +1,8 @@ #ifndef SRC_BOARD_H_ #define SRC_BOARD_H_ +#include <cstdint> +#include <string> enum pieceType { NONE, PAWN, @@ -11,16 +13,21 @@ enum pieceType { KING, }; -struct piece { +struct Piece { bool color; pieceType type; bool moved; }; struct board { - piece pieces[64]; + Piece pieces[64]; bool turn; // 1 white; 0 black + std::string castle; + uint8_t halfMoveClock; + uint16_t MoveClock; }; void printBoard(board *b); +void setBoardFen(std::string fen, board *b); +Piece createPiece(pieceType type, bool color, bool moved = false); #endif /* SRC_BOARD_H_ */ diff --git a/src/main.cpp b/src/main.cpp index 6d82603..a2d9deb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,19 +2,22 @@ #include "board.hpp" -#define WHITE = true -#define BLACK = false +Piece NonePiece = { + false, + NONE, + false, +}; int main() { board b; b.turn = true; + b.castle = "KQkq"; + b.halfMoveClock = 0; + b.MoveClock = 0; for (int i = 0; i < 64; i++) { - piece NewPiece; - NewPiece.color = true; - NewPiece.moved = false; - NewPiece.type = ROOK; - b.pieces[i] = NewPiece; + b.pieces[i] = NonePiece; }; + setBoardFen("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", &b); printBoard(&b); return EXIT_SUCCESS; } |
