X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=dvonn-board.c;h=f8f9b93843556f3e20b482418c7ca75f768f28d2;hb=ad4d9127c5dd419f84da2329c60b3f785c068e66;hp=4aaac54aadc19bcb65f3a5f360c967206e417e51;hpb=c1c2fe84387af8e7d9fdea36fedc4482b48027c1;p=dvonn diff --git a/dvonn-board.c b/dvonn-board.c index 4aaac54..f8f9b93 100644 --- a/dvonn-board.c +++ b/dvonn-board.c @@ -231,14 +231,60 @@ dvonn_board_place (dvonn_board_t *board, board->moves++; + dvonn_board_next_player (board); + if (board->moves == 49) { board->phase = DVONN_PHASE_MOVEMENT; board->moves = 0; + board->player = DVONN_PLAYER_WHITE; } 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 +307,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;