summaryrefslogtreecommitdiff
path: root/src/board.c
diff options
context:
space:
mode:
authorRobby Zambito <contact@robbyzambito.me>2021-12-30 00:02:22 -0500
committerRobby Zambito <contact@robbyzambito.me>2021-12-30 00:02:22 -0500
commit6a35a3cffd976f6fa9d96759e2f2bb0f784b92ac (patch)
tree8c1f87ff19ab3cdb35a3450942846e1b1c736aa6 /src/board.c
parentb74a45d66405d59ea3f2891a10ee2c62f12134d9 (diff)
Pulled lots of things out of game loop
Diffstat (limited to 'src/board.c')
-rw-r--r--src/board.c118
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;
+}