finished play_at()

AuthorKonata <konata@posteo.jp>
Date
Commitf60dc8cd674cc9a4b67757f3022f1ef32c55d3af
Parent5d57823
2 files changed, 80 insertions(+), 49 deletions(-)
▾Msimple-go.c
@@ -79,65 +79,94 @@ bool play_at(game_state* game, size_t y, size_t x)
if(get_board_at(game->board, y, x) != EMPTY)
return false;
//check if placement could lead to suicide
if(get_board_at(game->board, y-1, x) != EMPTY &&
get_board_at(game->board, y, x-1) != EMPTY &&
get_board_at(game->board, y+1, x) != EMPTY &&
get_board_at(game->board, y, x+1) != EMPTY)
//if so, check if placement kills a surrounding group
bool can_place = false;
char up = get_board_at(game->board, y-1, x);
char left = get_board_at(game->board, y, x-1);
char down = get_board_at(game->board, y+1, x);
char right = get_board_at(game->board, y, x+1);
//first check for group to kill, then for empty field, and last for group woth liberties
if(up == (game->black_turn ? WHITE : BLACK))
{
if(get_board_at(game->board, y-1, x) == (game->black_turn ? WHITE : BLACK))
go_board* enemy_group = create_board(game->board->size);
find_group(game->board, enemy_group, y-1, x);
if(count_liberties(game->board, enemy_group) <= 1)
{
go_board* enemy_group = create_board(game->board->size);
find_group(game->board, enemy_group, y-1, x);
if(count_liberties(game->board, enemy_group) > 1)
{
delete_board(enemy_group);
return false;
} else {
kill_group(game->board, enemy_group);
}
kill_group(game->board, enemy_group);
can_place = true;
}
if(get_board_at(game->board, y, x-1) == (game->black_turn ? WHITE : BLACK))
delete_board(enemy_group);
} else if(up == EMPTY) {
can_place = true;
} else {
go_board* friendly_group = create_board(game->board->size);
find_group(game->board, friendly_group, y-1, x);
if(count_liberties(game->board, friendly_group) > 1)
can_place = true;
delete_board(friendly_group);
}
if(left == (game->black_turn ? WHITE : BLACK))
{
go_board* enemy_group = create_board(game->board->size);
find_group(game->board, enemy_group, y, x-1);
if(count_liberties(game->board, enemy_group) <= 1)
{
go_board* enemy_group = create_board(game->board->size);
find_group(game->board, enemy_group, y, x-1);
if(count_liberties(game->board, enemy_group) > 1)
{
delete_board(enemy_group);
return false;
} else {
kill_group(game->board, enemy_group);
}
kill_group(game->board, enemy_group);
can_place = true;
}
if(get_board_at(game->board, y+1, x) == (game->black_turn ? WHITE : BLACK))
} else if(left == EMPTY) {
can_place = true;
} else {
go_board* friendly_group = create_board(game->board->size);
find_group(game->board, friendly_group, y, x-1);
if(count_liberties(game->board, friendly_group) > 1)
can_place = true;
delete_board(friendly_group);
}
if(down == (game->black_turn ? WHITE : BLACK))
{
go_board* enemy_group = create_board(game->board->size);
find_group(game->board, enemy_group, y+1, x);
if(count_liberties(game->board, enemy_group) <= 1)
{
go_board* enemy_group = create_board(game->board->size);
find_group(game->board, enemy_group, y+1, x);
if(count_liberties(game->board, enemy_group) > 1)
{
delete_board(enemy_group);
return false;
} else {
kill_group(game->board, enemy_group);
}
kill_group(game->board, enemy_group);
can_place = true;
}
if(get_board_at(game->board, y, x+1) == (game->black_turn ? WHITE : BLACK))
} else if(down == EMPTY) {
can_place = true;
} else {
go_board* friendly_group = create_board(game->board->size);
find_group(game->board, friendly_group, y+1, x);
if(count_liberties(game->board, friendly_group) > 1)
can_place = true;
delete_board(friendly_group);
}
if(right == (game->black_turn ? WHITE : BLACK))
{
go_board* enemy_group = create_board(game->board->size);
find_group(game->board, enemy_group, y, x+1);
if(count_liberties(game->board, enemy_group) <= 1)
{
go_board* enemy_group = create_board(game->board->size);
find_group(game->board, enemy_group, y, x+1);
if(count_liberties(game->board, enemy_group) > 1)
{
delete_board(enemy_group);
return false;
} else {
kill_group(game->board, enemy_group);
}
kill_group(game->board, enemy_group);
can_place = true;
}
//TODO: ...or if it connects to own group that has liberties left
} else if(right == EMPTY) {
can_place = true;
} else {
go_board* friendly_group = create_board(game->board->size);
find_group(game->board, friendly_group, y, x+1);
if(count_liberties(game->board, friendly_group) > 1)
can_place = true;
delete_board(friendly_group);
}
if(!can_place)
return false;
set_board_at(game->board, y, x, game->black_turn ? BLACK : WHITE);
game->black_turn = !game->black_turn;
return true;
▾Mtest.c
@@ -43,13 +43,15 @@ void test2(void)
set_board_at(test_board, 2, 1, WHITE);
play_at(test_game, 2, 2);
print_board(test_game->board);
set_board_at(test_board, 2, 1, EMPTY);
play_at(test_game, 2, 2);
print_board(test_game->board);
play_at(test_game, 2, 1);
print_board(test_game->board);
delete_game(test_game);