summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/board.c80
-rw-r--r--lib/piece.c53
-rw-r--r--lib/print.c45
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');
+ }
+}
nihil fit ex nihilo