diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/board.c | 80 | ||||
-rw-r--r-- | lib/piece.c | 53 | ||||
-rw-r--r-- | lib/print.c | 45 |
3 files changed, 178 insertions, 0 deletions
diff --git a/lib/board.c b/lib/board.c new file mode 100644 index 0000000..6543bcc --- /dev/null +++ b/lib/board.c @@ -0,0 +1,80 @@ +#include <stdlib.h> +#include <stdio.h> + +#include "board.h" + +Board* _setup_colors(Board *b) { + int i, j; + + for (i = 0; i < SIZE; i++) + for (j = 0; j < SIZE; j++) + if (i % 2) // Odd rows start with white + if (j % 2) + b[i][j]->color = WHITE; + else + b[i][j]->color = BLACK; + else + if (j % 2) + b[i][j]->color = BLACK; + else + b[i][j]->color = WHITE; + + return b; +} + +Board* _pawns(Board *b) { + return b; +} + +Board* _rocks(Board *b) { + return b; +} + +Board* _knights(Board *b) { + return b; +} + +Board* _bishops(Board *b) { + return b; +} + +Board* _queens(Board *b) { + return b; +} + +Board* _kings(Board *b) { + return b; +} + +Board* _setup_pieces(Board *b) { + return _pawns(_rocks(_knights(_bishops(_queens(_kings(b)))))); // :-) +} + +Board* _initial_setup(Board *b) { + return _setup_pieces(_setup_colors(b)); +} + +Board board_init() { + int i, j; + + Board b = malloc(sizeof(Square*) * SIZE); + + for (i = 0; i < SIZE; i++) { + b[i] = malloc(sizeof(Square) * SIZE); + for (j = 0; j < SIZE; j++) + b[i][j].piece = NULL; + } + + return b; +} + +int board_delete(Board* b) { + int i; + + for (i = 0; i < SIZE; i++) + free(b[i]); + + free(b); + + return 0; +} diff --git a/lib/piece.c b/lib/piece.c new file mode 100644 index 0000000..bbe0bdc --- /dev/null +++ b/lib/piece.c @@ -0,0 +1,53 @@ +#include <ctype.h> +#include "piece.h" + +#ifdef UTF8 + +# TODO +int piece_character(Piece p) { + switch (p.color) { + + case WHITE: + switch (p.type) { + case PAWN: return '♙'; + case ROCK: return '♖'; + case KNIGHT: return '♘'; + case BISHOP: return '♗'; + case QUEEN: return '♕'; + case KING: return '♔'; + } + + case BLACK: + switch (p.type) { + case PAWN: return '♟'; + case ROCK: return '♜'; + case KNIGHT: return '♞'; + case BISHOP: return '♝'; + case QUEEN: return '♛'; + case KING: return '♚'; + } + } +} + +#else + +int piece_character(Piece p) { + int res; + + switch (p.type) { + + case PAWN: res = 'p'; break; + case ROCK: res = 'r'; break; + case KNIGHT: res = 'n'; break; + case BISHOP: res = 'b'; break; + case QUEEN: res = 'q'; break; + case KING: res = 'k'; break; + } + + if (p.color == BLACK) + return toupper(res); + + return res; +} + +#endif diff --git a/lib/print.c b/lib/print.c new file mode 100644 index 0000000..431641e --- /dev/null +++ b/lib/print.c @@ -0,0 +1,45 @@ +#include <stdio.h> +#include <stdlib.h> + +#include "print.h" +#include "piece.h" + +/* Printing related functions */ +void print_piece(Piece p) { + putchar(piece_character(p)); +} + +void print_square(Square s) { + puts("+-+\n|"); + + if (s.piece == NULL) + switch (s.color) { + case WHITE: + putchar(' '); + break;; + case BLACK: + putchar('/'); + break; + default: + perror("Wait... what?\n"); + exit(EXIT_FAILURE); + } + else + print_piece(*s.piece); + + puts("|\n+-+"); + + return; +} + +void print_board(Board *b) { + int i, j; + + for (i = 0; i < SIZE; i++) { + for (j = 0; j < SIZE; j++) { + print_square(*b[i][j]); + } + + putchar('\n'); + } +} |