added tests, reorganized tests, added game constructor and destructor, added kill_group(), remove redundant check in check_bounds()

AuthorKonata <konata@posteo.jp>
Date
Commit5d57823be22c163a00c95266b2cae510ae8a780c
Parent930be82
4 files changed, 91 insertions(+), 18 deletions(-)
▾MMakefile
@@ -1,4 +1,4 @@
all:
gcc -O0 -g test.c simple-go.c -o test \
-Wall -Wpedantic -Wnull-dereference -Wshadow -Wconversion -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wstrict-overflow=5 -Wunreachable-code -Wno-unused-parameter \
gcc -Og -g test.c simple-go.c -o test -std=c11 \
-Wall -Wextra -Wpedantic -Wnull-dereference -Wshadow -Wconversion -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wstrict-overflow=5 -Wunreachable-code -Wno-unused-parameter \
-fsanitize=undefined
▾Msimple-go.c
@@ -3,7 +3,9 @@
go_board* create_board(size_t size)
{
go_board* board = malloc(sizeof(*board));
assert(board);
board->field_array = malloc(size*size*sizeof(*board->field_array));
assert(board->field_array);
for(size_t i = 0; i < size*size; i++)
{
board->field_array[i] = EMPTY;
@@ -13,18 +15,45 @@ go_board* create_board(size_t size)
return board;
}
void delete_board(go_board* board)
{
free(board->field_array);
free(board);
}
game_state* create_game(size_t size)
{
game_state* game = malloc(sizeof(*game));
game->board = create_board(size);
game->black_turn = true;
return game;
}
void delete_game(game_state* game)
{
delete_board(game->board);
free(game);
}
bool check_bounds(go_board* board, size_t y, size_t x)
{
if(y >= 0 && x >= 0 && y < board->size && x < board->size)
if(y < board->size && x < board->size)
return true;
else
return false;
}
void delete_board(go_board* board)
void kill_group(go_board* board, go_board* overlay)
{
free(board->field_array);
free(board);
for(size_t y = 0; y < board->size; y++)
{
for(size_t x = 0; x < board->size; x++)
{
if(get_board_at(overlay, y, x) == GROUP)
set_board_at(board, y, x, EMPTY);
}
}
}
void print_board(go_board* board)
@@ -67,7 +96,7 @@ bool play_at(game_state* game, size_t y, size_t x)
delete_board(enemy_group);
return false;
} else {
//TODO: kill_group();
kill_group(game->board, enemy_group);
}
}
if(get_board_at(game->board, y, x-1) == (game->black_turn ? WHITE : BLACK))
@@ -79,7 +108,7 @@ bool play_at(game_state* game, size_t y, size_t x)
delete_board(enemy_group);
return false;
} else {
//kill_group();
kill_group(game->board, enemy_group);
}
}
if(get_board_at(game->board, y+1, x) == (game->black_turn ? WHITE : BLACK))
@@ -91,7 +120,7 @@ bool play_at(game_state* game, size_t y, size_t x)
delete_board(enemy_group);
return false;
} else {
//kill_group();
kill_group(game->board, enemy_group);
}
}
if(get_board_at(game->board, y, x+1) == (game->black_turn ? WHITE : BLACK))
@@ -103,7 +132,7 @@ bool play_at(game_state* game, size_t y, size_t x)
delete_board(enemy_group);
return false;
} else {
//kill_group();
kill_group(game->board, enemy_group);
}
}
//TODO: ...or if it connects to own group that has liberties left
▾Msimple-go.h
@@ -28,11 +28,17 @@ typedef struct game_state
go_board* create_board(size_t size);
bool play_at(game_state* game, size_t y, size_t x);
bool check_bounds(go_board* board, size_t y, size_t x);
void delete_board(go_board* board);
game_state* create_game(size_t size);
void delete_game(game_state* game);
bool check_bounds(go_board* board, size_t y, size_t x);
char get_board_at(go_board* board, size_t y, size_t x);
void set_board_at(go_board* board, size_t y, size_t x, char item);
void kill_group(go_board* board, go_board* overlay);
bool play_at(game_state* game, size_t y, size_t x);
void print_board(go_board* board);
void find_group(go_board* board, go_board* overlay, size_t y, size_t x);
size_t count_liberties(go_board* board, go_board* overlay);
▾Mtest.c
@@ -1,7 +1,8 @@
#include "simple-go.h"
int main(int argc, char** argv)
void test1(void)
{
puts("test1 running");
go_board* test_board = create_board(5);
set_board_at(test_board, 2, 2, WHITE);
@@ -15,13 +16,50 @@ int main(int argc, char** argv)
print_board(test_board);
putchar('\n');
go_board* overlay = create_board(5);
find_group(test_board, overlay, 2, 2);
go_board* test_overlay = create_board(5);
find_group(test_board, test_overlay, 2, 2);
print_board(test_overlay);
printf("liberties: %ld\n", count_liberties(test_board,test_overlay));
print_board(overlay);
kill_group(test_board, test_overlay);
print_board(test_board);
printf("liberties: %ld\n", count_liberties(test_board,overlay));
delete_board(test_board);
delete_board(overlay);
delete_board(test_overlay);
puts("test1 finished");
}
void test2(void)
{
puts("test2 running");
game_state* test_game = create_game(5);
go_board* test_board = test_game->board;
set_board_at(test_board, 2, 3, WHITE);
set_board_at(test_board, 3, 2, WHITE);
set_board_at(test_board, 1, 2, WHITE);
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);
delete_game(test_game);
puts("test2 finished");
}
int main(int argc, char** argv)
{
test1();
test2();
}