summaryrefslogtreecommitdiff
path: root/chess.c
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2022-12-07 19:03:55 -0800
committerKai Stevenson <kai@kaistevenson.com>2022-12-07 19:03:55 -0800
commit26dff288134041d3245701b047be1d9a08c7c9d3 (patch)
tree23803a266eac81f910770844dd957e14ab6506af /chess.c
parentf501b24b8886605949cd9b7880b8e4ce8e866e9d (diff)
added king moves, fixed memory leak in main
Diffstat (limited to 'chess.c')
-rw-r--r--chess.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/chess.c b/chess.c
index a0904df..f11a11f 100644
--- a/chess.c
+++ b/chess.c
@@ -150,6 +150,30 @@ vectorp_t get_queen_moves(int** board, vector_t position, int color) {
}
return init_vectorp(moves, moveCount);
}
+vectorp_t get_king_moves(int** board, vector_t position, int color) {
+ vector_t* moves = malloc(28 * sizeof(vector_t));
+ int moveCount = 0;
+ for(int i = 0; i < 8; i++) {
+ int h;
+ int v;
+ //diagonal moves
+ if(i < 4) {
+ h = i < 2 ? 1 : -1;
+ v = (i == 0 || i == 2) ? 1 : -1;
+ }
+ //straight moves
+ else {
+ h = (i == 4 || i == 6) ? 0 : i == 5 ? 1 : -1;
+ v = (i == 5 || i == 7) ? 0 : i == 6 ? 1 : -1;
+ }
+ vector_t move = init_vector(position.mx + h, position.my + v);
+ if(in_board(move) && (is_empty(board, move) || is_color(board, move, !color))) {
+ moves[moveCount] = move;
+ moveCount++;
+ }
+ }
+ return init_vectorp(moves, moveCount);
+}
//this function returns moves that will place the player in check!
vectorp_t get_moves(int** board, vector_t position, piece_t piece) {
int color = 0;
@@ -172,6 +196,9 @@ vectorp_t get_moves(int** board, vector_t position, piece_t piece) {
else if(piece == queen) {
return get_queen_moves(board, position, color);
}
+ else if(piece == king) {
+ return get_king_moves(board, position, color);
+ }
else {
return init_vectorp(0, 0);
}
@@ -320,6 +347,7 @@ int main() {
}
board[selection.mx][selection.my] = 0;
board[target.mx][target.my] = selectedPiece;
+ free(moves.vectors);
printf("\n");
turn = !turn;
}