Convert fen to board array
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
*.dSYM
|
||||||
|
main
|
||||||
101
main.c
Normal file
101
main.c
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user