summaryrefslogtreecommitdiff
path: root/src/move.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/move.c')
-rw-r--r--src/move.c143
1 files changed, 94 insertions, 49 deletions
diff --git a/src/move.c b/src/move.c
index 82d9b47..2405761 100644
--- a/src/move.c
+++ b/src/move.c
@@ -112,68 +112,112 @@ int apply_move(enum player_color **board, enum player_color current_player,
return 0;
}
- // Flip in up direction
- int num_flipped_up = 0;
- for (int i = move.row - 1;
- i >= 0 && board[i][move.col] != EMPTY && num_flipped_up == 0; i--) {
- if (board[i][move.col] == current_player) {
- if (i < move.row - 1) {
- for (int j = move.row; j > i; j--) {
- board[j][move.col] = current_player;
- num_flipped_up++;
+ int num_flipped_up = 0, num_flipped_down = 0, num_flipped_left = 0,
+ num_flipped_right = 0, num_flipped_up_left = 0, num_flipped_up_right = 0,
+ num_flipped_down_left = 0, num_flipped_down_right = 0;
+
+ bool done_flipping_up = false, done_flipping_down = false,
+ done_flipping_left = false, done_flipping_right = false,
+ done_flipping_up_left = false, done_flipping_up_right = false,
+ done_flipping_down_left = false, done_flipping_down_right = false;
+
+ for (int i = 1; i < 8; i++) {
+ if (!done_flipping_up && (move.row - i >= 0) &&
+ board[move.row - i][move.col] == current_player) {
+
+ if (i > 1) {
+ bool flippable = true;
+ for (int j = 1; flippable && j < i; j++) {
+ if (board[move.row - j][move.col] == EMPTY) {
+ flippable = false;
+ }
+ }
+
+ if (flippable) {
+ for (int j = 0; j < i; j++) {
+ board[move.row - j][move.col] = current_player;
+ num_flipped_up++;
+ }
}
- } else {
- break;
}
+
+ done_flipping_up = true;
}
- }
+ if (!done_flipping_down && (move.row + i < 8) &&
+ board[move.row + i][move.col] == current_player) {
+
+ if (i > 1) {
+ bool flippable = true;
+ for (int j = 1; flippable && j < i; j++) {
+ if (board[move.row + j][move.col] == EMPTY) {
+ flippable = false;
+ }
+ }
- // Flip in down direction
- int num_flipped_down = 0;
- for (int i = move.row + 1;
- i < 8 && board[i][move.col] != EMPTY && num_flipped_down == 0; i++) {
- if (board[i][move.col] == current_player) {
- if (i > move.row + 1) {
- for (int j = move.row; j < i; j++) {
- board[j][move.col] = current_player;
- num_flipped_down++;
+ if (flippable) {
+ for (int j = 0; j < i; j++) {
+ board[move.row + j][move.col] = current_player;
+ num_flipped_down++;
+ }
}
- } else {
- break;
}
+
+ done_flipping_down = true;
}
- }
+ if (!done_flipping_left && (move.col - i >= 0) &&
+ board[move.row][move.col - i] == current_player) {
+
+ if (i > 1) {
+ bool flippable = true;
+ for (int j = 1; flippable && j < i; j++) {
+ if (board[move.row][move.col - j] == EMPTY) {
+ flippable = false;
+ }
+ }
- // Flip in left direction
- int num_flipped_left = 0;
- for (int i = move.col - 1;
- i >= 0 && board[move.row][i] != EMPTY && num_flipped_left == 0; i--) {
- if (board[move.row][i] == current_player) {
- if (i < move.col - 1) {
- for (int j = move.col; j > i; j--) {
- board[move.row][j] = current_player;
- num_flipped_left++;
+ if (flippable) {
+ for (int j = 0; j < i; j++) {
+ board[move.row][move.col - j] = current_player;
+ num_flipped_left++;
+ }
}
- } else {
- break;
}
+
+ done_flipping_left = true;
}
- }
+ if (!done_flipping_right && (move.col + i < 8) &&
+ board[move.row][move.col + i] == current_player) {
+
+ if (i > 1) {
+ bool flippable = true;
+ for (int j = 1; flippable && j < i; j++) {
+ if (board[move.row][move.col + j] == EMPTY) {
+ flippable = false;
+ }
+ }
- // Flip in right direction
- int num_flipped_right = 0;
- for (int i = move.col + 1;
- i < 8 && board[move.row][i] != EMPTY && num_flipped_right == 0; i++) {
- if (board[move.row][i] == current_player) {
- if (i > move.col + 1) {
- for (int j = move.col; j < i; j++) {
- board[move.row][j] = current_player;
- num_flipped_right++;
+ if (flippable) {
+ for (int j = 0; j < i; j++) {
+ board[move.row][move.col + j] = current_player;
+ num_flipped_right++;
+ }
}
- } else {
- break;
}
+
+ done_flipping_right = true;
}
+ /*if (!done_flipping_up_left &&) {*/
+ /*done_flipping_up_left = true;*/
+ /*}*/
+ /*if (!done_flipping_up_right &&) {*/
+ /*done_flipping_up_right = true;*/
+ /*}*/
+ /*if (!done_flipping_down_left &&) {*/
+ /*done_flipping_down_left = true;*/
+ /*}*/
+ /*if (!done_flipping_down_right &&) {*/
+ /*done_flipping_down_right = true;*/
+ /*}*/
}
return num_flipped_up + num_flipped_down + num_flipped_left +
@@ -183,8 +227,9 @@ int apply_move(enum player_color **board, enum player_color current_player,
SCM scm_apply_move(SCM scm_move, SCM scm_board, SCM scm_player) {
struct move move = scm_move_to_c_move(scm_move);
- enum player_color **board =
- SCM_UNBNDP(scm_board) ? copy_board(get_board()) : scm_board_to_c_board(scm_board);
+ enum player_color **board = SCM_UNBNDP(scm_board)
+ ? copy_board(get_board())
+ : scm_board_to_c_board(scm_board);
enum player_color player = SCM_UNBNDP(scm_player)
? get_current_player()