From 25700bcf0f8c4a6cf2aecff90fbde1708444f457 Mon Sep 17 00:00:00 2001 From: cdricms <36056008+cdricms@users.noreply.github.com> Date: Wed, 20 Dec 2023 21:52:37 +0100 Subject: [PATCH] Convert fen to board array --- .gitignore | 2 ++ main.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 .gitignore create mode 100644 main.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..18adb28 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.dSYM +main diff --git a/main.c b/main.c new file mode 100644 index 0000000..cf305b1 --- /dev/null +++ b/main.c @@ -0,0 +1,101 @@ +#include +#include + +typedef unsigned int uint; +typedef int Piece; +typedef enum { Pawn = 0, Knight, Bishop, Rook, Queen, King } Pieces; +typedef enum { White = 0, Black = 8 } PieceColors; + +typedef struct { + Piece piece; + uint row; + uint column; +} Square; + +char chrToLower(char chr) { + if (chr > 'A' && chr < 'Z') + return chr + 32; + return chr; +} + +PieceColors piece_getColor(const Piece piece) { return 8 & piece; } +Piece piece_getColorlessPiece(const Piece piece) { + return piece_getColor(piece) ^ piece; +} + +// Starter fen: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR +void fen_parseToArray(const char fen[75], Square board[64]) { + uint i = 0; + char fen_char; + uint row = 8; + uint column = 0; + uint board_i; + while ((fen_char = fen[i++]) != 0) { + if (fen_char == '/') { + row--; + column = 0; + continue; + } + // Upper case or lower case + bool is_upper_case; + if ((is_upper_case = fen_char > 'A' && fen_char < 'Z') || + fen_char > 'a' && fen_char < 'z') { + char lowered_char = chrToLower(fen_char); + Pieces p; + switch (lowered_char) { + case 'p': + p = Pawn; + break; + case 'n': + p = Knight; + break; + case 'b': + p = Bishop; + break; + case 'r': + p = Rook; + break; + case 'q': + p = Queen; + break; + case 'k': + p = King; + break; + default: + printf("[ERROR] %c is not an authorized character\n", fen_char); + return; + } + PieceColors color = is_upper_case ? White : Black; + Piece piece = p ^ color; + Square square = {.piece = piece, .row = row, .column = ++column}; + board[board_i++] = square; + } else if (fen_char > '0' && fen_char < '9') { + // if the char is a number bet. 1 and 8 + // we increment the i by its real value (1..=8) + int offset = fen_char - '0'; + if (offset < 9) { + for (int j = 0; j < offset; j++) { + Square square = {.piece = -1, .row = row, .column = ++column}; + board[board_i++] = square; + } + } else { + printf("[ERROR]: On character %d of FEN, %c is out of range.", i, + fen_char); + return; + } + } + } +} + +int main() { + Square board[64]; + char fen[75] = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR"; + fen_parseToArray(fen, board); + for (int i = 0; i < 64; i++) { + if (i % 8 == 0) { + printf("\n"); + } + printf("%d\t", board[i].piece); + } + return 0; +}