summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game_loop.c44
-rw-r--r--src/initialize_board.c18
-rw-r--r--src/print_board.c4
-rw-r--r--src/valid_moves.c9
4 files changed, 40 insertions, 35 deletions
diff --git a/src/game_loop.c b/src/game_loop.c
index 4674e44..c11f473 100644
--- a/src/game_loop.c
+++ b/src/game_loop.c
@@ -31,10 +31,18 @@
#define STREQ(a, b) (strcmp(a, b) == 0)
-struct move (*player_one_get_move)(enum player_color board[8][8],
- enum player_color current_player);
-struct move (*player_two_get_move)(enum player_color board[8][8],
- enum player_color current_player);
+static enum player_color current_player;
+
+enum player_color get_current_player(void) { return current_player; }
+
+static enum player_color **board;
+
+const enum player_color **get_board(void) {
+ return (const enum player_color **)board;
+}
+
+struct move (*player_one_get_move)();
+struct move (*player_two_get_move)();
static enum player_color other_player(enum player_color current_player) {
switch (current_player) {
@@ -76,8 +84,7 @@ static void inner_main(void *closure, int argc, char **argv) {
scm_shell(argc, argv);
}
-static struct move prompt_get_move(enum player_color board[8][8],
- enum player_color current_player) {
+static struct move prompt_get_move(enum player_color current_player) {
// Initialize move to an invalid move.
struct move move = {-1, -1};
@@ -90,7 +97,7 @@ static struct move prompt_get_move(enum player_color board[8][8],
if (STREQ(input, "h")) {
print_help();
} else if (STREQ(input, "p")) {
- print_board(board);
+ print_board();
} else if (STREQ(input, "g")) {
int argc = 1;
char **argv = calloc(1, sizeof(char *));
@@ -108,14 +115,13 @@ static struct move prompt_get_move(enum player_color board[8][8],
}
free(input);
- } while (!is_valid_move(board, current_player, move));
+ } while (!is_valid_move(current_player, move));
return move;
}
/* Returns true if the move was valid */
-static bool apply_move(enum player_color board[8][8],
- enum player_color current_player, struct move move) {
+static bool apply_move(enum player_color current_player, struct move move) {
// Flip in up direction
bool flipped_up = false;
@@ -168,24 +174,16 @@ static bool apply_move(enum player_color board[8][8],
return flipped_up || flipped_down || flipped_left || flipped_right;
}
-static enum player_color current_player;
-
-enum player_color get_current_player(void) { return current_player; }
-
-static enum player_color board[8][8];
-
-const enum player_color **get_board(void) {
- return (const enum player_color **)board;
-}
-enum player_color game_loop(enum player_color init_board[8][8]) {
+enum player_color game_loop() {
+ initialize_board(&board);
using_history();
current_player = WHITE;
- while (has_valid_moves(board, current_player)) {
- struct move move = prompt_get_move(board, current_player);
- apply_move(board, current_player, move);
+ while (has_valid_moves(current_player)) {
+ struct move move = prompt_get_move(current_player);
+ apply_move(current_player, move);
current_player = other_player(current_player);
}
diff --git a/src/initialize_board.c b/src/initialize_board.c
index 2e037c3..18b1468 100644
--- a/src/initialize_board.c
+++ b/src/initialize_board.c
@@ -18,20 +18,26 @@
#define _GNU_SOURCE
+#include <stdlib.h>
+
#include "othello.h"
-void initialize_board(enum player_color board[8][8]) {
+void initialize_board(enum player_color ***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;
+ (*board)[i][j] = EMPTY;
}
}
// Fill the starting positions
- board[3][3] = WHITE;
- board[3][4] = BLACK;
- board[4][3] = BLACK;
- board[4][4] = WHITE;
+ (*board)[3][3] = WHITE;
+ (*board)[3][4] = BLACK;
+ (*board)[4][3] = BLACK;
+ (*board)[4][4] = WHITE;
}
diff --git a/src/print_board.c b/src/print_board.c
index 4256e7e..98280fd 100644
--- a/src/print_board.c
+++ b/src/print_board.c
@@ -22,7 +22,9 @@
#include "othello.h"
-void print_board(enum player_color board[8][8]) {
+void print_board() {
+ const enum player_color **board = get_board();
+
puts(" 0 1 2 3 4 5 6 7");
for (int row = 0; row < 8; row++) {
diff --git a/src/valid_moves.c b/src/valid_moves.c
index d37de3c..bd53833 100644
--- a/src/valid_moves.c
+++ b/src/valid_moves.c
@@ -22,9 +22,9 @@
#include "othello.h"
-bool is_valid_move(enum player_color board[8][8],
- const enum player_color current_player,
+bool is_valid_move(const enum player_color current_player,
const struct move move) {
+ const enum player_color **board = get_board();
// The move must be a positive position.
if (move.row < 0 || move.col < 0) {
return false;
@@ -81,13 +81,12 @@ bool is_valid_move(enum player_color board[8][8],
return is_valid_up || is_valid_down || is_valid_left || is_valid_right;
}
-bool has_valid_moves(enum player_color board[8][8],
- const enum player_color current_player) {
+bool has_valid_moves(const enum player_color current_player) {
bool result = false;
struct move move;
for (move.row = 0; move.row < 8 && !result; move.row++) {
for (move.col = 0; move.col < 8 && !result; move.col++) {
- result = is_valid_move(board, current_player, move);
+ result = is_valid_move(current_player, move);
}
}