X-Git-Url: https://git.cworth.org/git?p=dvonn;a=blobdiff_plain;f=dvonn-board.c;fp=dvonn-board.c;h=5b7c106c311909b30a47d96dc7ff3c6e7ecaf418;hp=4aaac54aadc19bcb65f3a5f360c967206e417e51;hb=290d2396610f08c48eda9fd2400679176448d7d9;hpb=c1c2fe84387af8e7d9fdea36fedc4482b48027c1 diff --git a/dvonn-board.c b/dvonn-board.c index 4aaac54..5b7c106 100644 --- a/dvonn-board.c +++ b/dvonn-board.c @@ -239,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, @@ -261,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;