diff options
author | Robby Zambito <contact@robbyzambito.me> | 2021-12-30 00:02:22 -0500 |
---|---|---|
committer | Robby Zambito <contact@robbyzambito.me> | 2021-12-30 00:02:22 -0500 |
commit | 6a35a3cffd976f6fa9d96759e2f2bb0f784b92ac (patch) | |
tree | 8c1f87ff19ab3cdb35a3450942846e1b1c736aa6 /src/board.c | |
parent | b74a45d66405d59ea3f2891a10ee2c62f12134d9 (diff) |
Pulled lots of things out of game loop
Diffstat (limited to 'src/board.c')
-rw-r--r-- | src/board.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/board.c b/src/board.c new file mode 100644 index 0000000..12b5384 --- /dev/null +++ b/src/board.c @@ -0,0 +1,118 @@ +/* This file is a part of othello-ai-guile-c + * + * Copyright (C) 2021 Robby Zambito + * + * othello-ai-guile-c is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * othello-ai-guile-c is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#define _GNU_SOURCE + +#include <stdlib.h> + +#include "othello.h" +#include "othello_move.h" + +static enum player_color **board; + +const enum player_color **get_board(void) { + return (const enum player_color **)board; +} + +void initialize_board() { + board = malloc(8 * sizeof(enum player_color *)); + for (int i = 0; i < 8; i++) { + board[i] = malloc(8 * sizeof(enum player_color)); + } + + // Set all the positions to empty + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 8; j++) { + board[i][j] = EMPTY; + } + } + + // Fill the starting positions + board[3][3] = WHITE; + board[3][4] = BLACK; + board[4][3] = BLACK; + board[4][4] = WHITE; +} + +/* Returns true if the move was valid */ +bool apply_move(enum player_color current_player, struct move move) { + + // Flip in up direction + bool flipped_up = false; + for (int i = move.row - 1; + i > 0 && board[i][move.col] != EMPTY && !flipped_up; i--) { + if (board[i][move.col] == current_player) { + for (int j = move.row; j > i; j--) { + board[j][move.col] = current_player; + } + flipped_up = true; + } + } + + // Flip in down direction + bool flipped_down = false; + for (int i = move.row + 1; + i < 8 && board[i][move.col] != EMPTY && !flipped_down; i++) { + if (board[i][move.col] == current_player) { + for (int j = move.row; j < i; j++) { + board[j][move.col] = current_player; + } + flipped_down = true; + } + } + + // Flip in left direction + bool flipped_left = false; + for (int i = move.col - 1; + i > 0 && board[move.row][i] != EMPTY && !flipped_left; i--) { + if (board[move.row][i] == current_player) { + for (int j = move.col; j > i; j--) { + board[move.row][j] = current_player; + } + flipped_left = true; + } + } + + // Flip in right direction + bool flipped_right = false; + for (int i = move.col + 1; + i < 8 && board[move.row][i] != EMPTY && !flipped_right; i++) { + if (board[move.row][i] == current_player) { + for (int j = move.col; j < i; j++) { + board[move.row][j] = current_player; + } + flipped_right = true; + } + } + + return flipped_up || flipped_down || flipped_left || flipped_right; +} + +enum player_color get_winner() { + int white_score = 0, black_score = 0; + for (int row = 0; row < 8; row++) { + for (int col = 0; col < 8; col++) { + white_score += (int)(board[row][col] == WHITE); + black_score += (int)(board[row][col] == BLACK); + } + } + + return white_score > black_score ? WHITE + : black_score > white_score ? BLACK + : EMPTY; +} |