Fen from board
This commit is contained in:
81
main.c
81
main.c
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
typedef unsigned int uint;
|
typedef unsigned int uint;
|
||||||
typedef int Piece;
|
typedef int Piece;
|
||||||
|
typedef char FEN[75];
|
||||||
typedef enum { Pawn = 0, Knight, Bishop, Rook, Queen, King } Pieces;
|
typedef enum { Pawn = 0, Knight, Bishop, Rook, Queen, King } Pieces;
|
||||||
typedef enum { White = 0, Black = 8 } PieceColors;
|
typedef enum { White = 0, Black = 8 } PieceColors;
|
||||||
|
|
||||||
@@ -12,19 +13,27 @@ typedef struct {
|
|||||||
uint column;
|
uint column;
|
||||||
} Square;
|
} Square;
|
||||||
|
|
||||||
|
typedef Square Board[64];
|
||||||
|
|
||||||
char chrToLower(char chr) {
|
char chrToLower(char chr) {
|
||||||
if (chr > 'A' && chr < 'Z')
|
if (chr >= 'A' && chr <= 'Z')
|
||||||
return chr + 32;
|
return chr + 32;
|
||||||
return chr;
|
return chr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char chrToUpper(char chr) {
|
||||||
|
if (chr >= 'a' && chr <= 'z')
|
||||||
|
return chr - 32;
|
||||||
|
return chr;
|
||||||
|
}
|
||||||
|
|
||||||
PieceColors piece_getColor(const Piece piece) { return Black & piece; }
|
PieceColors piece_getColor(const Piece piece) { return Black & piece; }
|
||||||
Piece piece_getColorlessPiece(const Piece piece) {
|
Piece piece_getColorlessPiece(const Piece piece) {
|
||||||
return piece_getColor(piece) ^ piece;
|
return piece_getColor(piece) ^ piece;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Starter fen: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
|
// Starter fen: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
|
||||||
void fen_parseToArray(const char fen[75], Square board[64]) {
|
void fen_toBoard(const FEN fen, Board board) {
|
||||||
uint i = 0;
|
uint i = 0;
|
||||||
char fen_char;
|
char fen_char;
|
||||||
uint row = 8;
|
uint row = 8;
|
||||||
@@ -87,15 +96,65 @@ void fen_parseToArray(const char fen[75], Square board[64]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fen_fromBoard(const Board board, FEN fen) {
|
||||||
|
// Reset fen
|
||||||
|
uint fen_i = 0;
|
||||||
|
while (fen[fen_i] != 0)
|
||||||
|
fen[fen_i++] = 0;
|
||||||
|
|
||||||
|
fen_i = 0;
|
||||||
|
uint board_i = 0;
|
||||||
|
while (board_i < 64) {
|
||||||
|
|
||||||
|
if (board_i != 0 && board_i % 8 == 0)
|
||||||
|
fen[fen_i++] = '/';
|
||||||
|
|
||||||
|
Square square = board[board_i++];
|
||||||
|
if (square.piece == -1) {
|
||||||
|
uint num = 1;
|
||||||
|
while (board_i % 8 != 0 && (square = board[board_i]).piece == -1) {
|
||||||
|
board_i++;
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
fen[fen_i++] = num + '0';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
char fen_char;
|
||||||
|
switch (piece_getColorlessPiece(square.piece)) {
|
||||||
|
case Pawn:
|
||||||
|
fen_char = 'p';
|
||||||
|
break;
|
||||||
|
case Knight:
|
||||||
|
fen_char = 'n';
|
||||||
|
break;
|
||||||
|
case Bishop:
|
||||||
|
fen_char = 'b';
|
||||||
|
break;
|
||||||
|
case Rook:
|
||||||
|
fen_char = 'r';
|
||||||
|
break;
|
||||||
|
case Queen:
|
||||||
|
fen_char = 'q';
|
||||||
|
break;
|
||||||
|
case King:
|
||||||
|
fen_char = 'k';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("[ERROR]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (piece_getColor(square.piece) == White)
|
||||||
|
fen_char = chrToUpper(fen_char);
|
||||||
|
fen[fen_i++] = fen_char;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
Square board[64];
|
Board board;
|
||||||
char fen[75] = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR";
|
FEN fen = "rnbqkbnr/ppppp1pp/5p2/8/8/8/PPPPPPPP/RNBQKBNR";
|
||||||
fen_parseToArray(fen, board);
|
fen_toBoard(fen, board);
|
||||||
for (int i = 0; i < 64; i++) {
|
fen_fromBoard(board, fen);
|
||||||
if (i % 8 == 0) {
|
printf("%s", fen);
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
printf("%d\t", board[i].piece);
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user