diff --git a/main.c b/main.c index 7148cfc..d0e235e 100644 --- a/main.c +++ b/main.c @@ -3,6 +3,7 @@ typedef unsigned int uint; typedef int Piece; +typedef char FEN[75]; typedef enum { Pawn = 0, Knight, Bishop, Rook, Queen, King } Pieces; typedef enum { White = 0, Black = 8 } PieceColors; @@ -12,19 +13,27 @@ typedef struct { uint column; } Square; +typedef Square Board[64]; + char chrToLower(char chr) { - if (chr > 'A' && chr < 'Z') + if (chr >= 'A' && chr <= 'Z') return chr + 32; 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; } 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]) { +void fen_toBoard(const FEN fen, Board board) { uint i = 0; char fen_char; uint row = 8; @@ -87,15 +96,65 @@ void fen_parseToArray(const char fen[75], Square board[64]) { } } -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"); +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; } - printf("%d\t", board[i].piece); + + 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() { + Board board; + FEN fen = "rnbqkbnr/ppppp1pp/5p2/8/8/8/PPPPPPPP/RNBQKBNR"; + fen_toBoard(fen, board); + fen_fromBoard(board, fen); + printf("%s", fen); return 0; }