aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdam <adammegarules1@gmail.com>2026-07-25 14:36:43 +0200
committerAdam <adammegarules1@gmail.com>2026-07-25 14:36:43 +0200
commit502506a969ca396309d3f6ff9819277e5c667331 (patch)
tree88362be2ecb5527e46f715ea5adf03ff648db2a9 /src
parentd6bc8dd98f24bb8f354aced71867898fe23a7ad2 (diff)
imprograming fen parser
Diffstat (limited to 'src')
-rw-r--r--src/board.cpp156
-rw-r--r--src/main.cpp2
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++) {