X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=dvonn-board.c;h=5b7c106c311909b30a47d96dc7ff3c6e7ecaf418;hb=491f9bdf58e9ad5b23858e3f780a506c45e867b2;hp=b6b36e5eac7dfefcbf1e6cce6d53901a8fcd7ff8;hpb=74df2492e8c32df37d886dec4baf9344dc6b8cff;p=dvonn diff --git a/dvonn-board.c b/dvonn-board.c index b6b36e5..5b7c106 100644 --- a/dvonn-board.c +++ b/dvonn-board.c @@ -192,6 +192,17 @@ dvonn_board_next_player (dvonn_board_t *board) board->player = DVONN_PLAYER_BLACK; } +int +dvonn_board_pass (dvonn_board_t *board) +{ + /* XXX: Should check here and only allow a pass if there are + * no legal moves. */ + + dvonn_board_next_player (board); + + return TRUE; +} + int dvonn_board_place (dvonn_board_t *board, int x, int y, @@ -228,6 +239,49 @@ dvonn_board_place (dvonn_board_t *board, return TRUE; } +static void +fill_living(dvonn_board_t *board, + int living[DVONN_BOARD_X_SIZE][DVONN_BOARD_Y_SIZE], + int x, int y) +{ + if (dvonn_board_cell_occupied (board, x, y) && ! living[x][y]) + { + living[x][y] = 1; + + fill_living (board, living, x - 1, y); + fill_living (board, living, x + 1, y); + fill_living (board, living, x, y - 1); + fill_living (board, living, x, y + 1); + fill_living (board, living, x + 1, y - 1); + fill_living (board, living, x - 1, y + 1); + } +} + +static void +eliminate_disconnected_stacks (dvonn_board_t *board) +{ + int x, y; + int living[DVONN_BOARD_X_SIZE][DVONN_BOARD_Y_SIZE]; + + for (x = 0; x < DVONN_BOARD_X_SIZE; x++) + for (y = 0; y < DVONN_BOARD_Y_SIZE; y++) + living[x][y] = 0; + + for (x = 0; x < DVONN_BOARD_X_SIZE; x++) + for (y = 0; y < DVONN_BOARD_Y_SIZE; y++) + if (board->cells[x][y].contains_red) + fill_living (board, living, x, y); + + for (x = 0; x < DVONN_BOARD_X_SIZE; x++) + for (y = 0; y < DVONN_BOARD_Y_SIZE; y++) + if (dvonn_board_cell_occupied (board, x, y) && + ! living[x][y]) + { + board->cells[x][y].type = DVONN_CELL_EMPTY; + board->cells[x][y].height = 0; + } +} + int dvonn_board_move (dvonn_board_t *board, int x1, int y1, @@ -250,6 +304,8 @@ dvonn_board_move (dvonn_board_t *board, board->cells[x1][y1].height = 0; board->cells[x1][y1].contains_red = FALSE; + eliminate_disconnected_stacks (board); + dvonn_board_next_player (board); return TRUE;