added tests, reorganized tests, added game constructor and destructor, added kill_group(), remove redundant check in check_bounds()
MMakefile
| @@ -1,4 +1,4 @@ | |||
|---|---|---|---|
| 1 | 1 | all: | |
| 2 | - | gcc -O0 -g test.c simple-go.c -o test \ | |
| 3 | - | -Wall -Wpedantic -Wnull-dereference -Wshadow -Wconversion -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wstrict-overflow=5 -Wunreachable-code -Wno-unused-parameter \ | |
| 2 | + | gcc -Og -g test.c simple-go.c -o test -std=c11 \ | |
| 3 | + | -Wall -Wextra -Wpedantic -Wnull-dereference -Wshadow -Wconversion -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wstrict-overflow=5 -Wunreachable-code -Wno-unused-parameter \ | |
| 4 | 4 | -fsanitize=undefined | |
Msimple-go.c
| @@ -3,7 +3,9 @@ | |||
|---|---|---|---|
| 3 | 3 | go_board* create_board(size_t size) | |
| 4 | 4 | { | |
| 5 | 5 | go_board* board = malloc(sizeof(*board)); | |
| 6 | + | assert(board); | |
| 6 | 7 | board->field_array = malloc(size*size*sizeof(*board->field_array)); | |
| 8 | + | assert(board->field_array); | |
| 7 | 9 | for(size_t i = 0; i < size*size; i++) | |
| 8 | 10 | { | |
| 9 | 11 | board->field_array[i] = EMPTY; | |
| @@ -13,18 +15,45 @@ go_board* create_board(size_t size) | |||
|---|---|---|---|
| 13 | 15 | return board; | |
| 14 | 16 | } | |
| 15 | 17 | ||
| 18 | + | void delete_board(go_board* board) | |
| 19 | + | { | |
| 20 | + | free(board->field_array); | |
| 21 | + | free(board); | |
| 22 | + | } | |
| 23 | + | ||
| 24 | + | game_state* create_game(size_t size) | |
| 25 | + | { | |
| 26 | + | game_state* game = malloc(sizeof(*game)); | |
| 27 | + | game->board = create_board(size); | |
| 28 | + | game->black_turn = true; | |
| 29 | + | ||
| 30 | + | return game; | |
| 31 | + | } | |
| 32 | + | ||
| 33 | + | void delete_game(game_state* game) | |
| 34 | + | { | |
| 35 | + | delete_board(game->board); | |
| 36 | + | free(game); | |
| 37 | + | } | |
| 38 | + | ||
| 16 | 39 | bool check_bounds(go_board* board, size_t y, size_t x) | |
| 17 | 40 | { | |
| 18 | - | if(y >= 0 && x >= 0 && y < board->size && x < board->size) | |
| 41 | + | if(y < board->size && x < board->size) | |
| 19 | 42 | return true; | |
| 20 | 43 | else | |
| 21 | 44 | return false; | |
| 22 | 45 | } | |
| 23 | 46 | ||
| 24 | - | void delete_board(go_board* board) | |
| 47 | + | void kill_group(go_board* board, go_board* overlay) | |
| 25 | 48 | { | |
| 26 | - | free(board->field_array); | |
| 27 | - | free(board); | |
| 49 | + | for(size_t y = 0; y < board->size; y++) | |
| 50 | + | { | |
| 51 | + | for(size_t x = 0; x < board->size; x++) | |
| 52 | + | { | |
| 53 | + | if(get_board_at(overlay, y, x) == GROUP) | |
| 54 | + | set_board_at(board, y, x, EMPTY); | |
| 55 | + | } | |
| 56 | + | } | |
| 28 | 57 | } | |
| 29 | 58 | ||
| 30 | 59 | void print_board(go_board* board) | |
| @@ -67,7 +96,7 @@ bool play_at(game_state* game, size_t y, size_t x) | |||
|---|---|---|---|
| 67 | 96 | delete_board(enemy_group); | |
| 68 | 97 | return false; | |
| 69 | 98 | } else { | |
| 70 | - | //TODO: kill_group(); | |
| 99 | + | kill_group(game->board, enemy_group); | |
| 71 | 100 | } | |
| 72 | 101 | } | |
| 73 | 102 | 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) | |||
|---|---|---|---|
| 79 | 108 | delete_board(enemy_group); | |
| 80 | 109 | return false; | |
| 81 | 110 | } else { | |
| 82 | - | //kill_group(); | |
| 111 | + | kill_group(game->board, enemy_group); | |
| 83 | 112 | } | |
| 84 | 113 | } | |
| 85 | 114 | 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) | |||
|---|---|---|---|
| 91 | 120 | delete_board(enemy_group); | |
| 92 | 121 | return false; | |
| 93 | 122 | } else { | |
| 94 | - | //kill_group(); | |
| 123 | + | kill_group(game->board, enemy_group); | |
| 95 | 124 | } | |
| 96 | 125 | } | |
| 97 | 126 | 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) | |||
|---|---|---|---|
| 103 | 132 | delete_board(enemy_group); | |
| 104 | 133 | return false; | |
| 105 | 134 | } else { | |
| 106 | - | //kill_group(); | |
| 135 | + | kill_group(game->board, enemy_group); | |
| 107 | 136 | } | |
| 108 | 137 | } | |
| 109 | 138 | //TODO: ...or if it connects to own group that has liberties left | |
Msimple-go.h
| @@ -28,11 +28,17 @@ typedef struct game_state | |||
|---|---|---|---|
| 28 | 28 | ||
| 29 | 29 | ||
| 30 | 30 | go_board* create_board(size_t size); | |
| 31 | - | bool play_at(game_state* game, size_t y, size_t x); | |
| 32 | - | bool check_bounds(go_board* board, size_t y, size_t x); | |
| 33 | 31 | void delete_board(go_board* board); | |
| 32 | + | game_state* create_game(size_t size); | |
| 33 | + | void delete_game(game_state* game); | |
| 34 | + | ||
| 35 | + | bool check_bounds(go_board* board, size_t y, size_t x); | |
| 34 | 36 | char get_board_at(go_board* board, size_t y, size_t x); | |
| 35 | 37 | void set_board_at(go_board* board, size_t y, size_t x, char item); | |
| 38 | + | ||
| 39 | + | void kill_group(go_board* board, go_board* overlay); | |
| 40 | + | bool play_at(game_state* game, size_t y, size_t x); | |
| 41 | + | ||
| 36 | 42 | void print_board(go_board* board); | |
| 37 | 43 | void find_group(go_board* board, go_board* overlay, size_t y, size_t x); | |
| 38 | 44 | size_t count_liberties(go_board* board, go_board* overlay); | |
Mtest.c
| @@ -1,7 +1,8 @@ | |||
|---|---|---|---|
| 1 | 1 | #include "simple-go.h" | |
| 2 | 2 | ||
| 3 | - | int main(int argc, char** argv) | |
| 3 | + | void test1(void) | |
| 4 | 4 | { | |
| 5 | + | puts("test1 running"); | |
| 5 | 6 | go_board* test_board = create_board(5); | |
| 6 | 7 | ||
| 7 | 8 | set_board_at(test_board, 2, 2, WHITE); | |
| @@ -15,13 +16,50 @@ int main(int argc, char** argv) | |||
|---|---|---|---|
| 15 | 16 | print_board(test_board); | |
| 16 | 17 | putchar('\n'); | |
| 17 | 18 | ||
| 18 | - | go_board* overlay = create_board(5); | |
| 19 | - | find_group(test_board, overlay, 2, 2); | |
| 19 | + | go_board* test_overlay = create_board(5); | |
| 20 | + | find_group(test_board, test_overlay, 2, 2); | |
| 21 | + | ||
| 22 | + | print_board(test_overlay); | |
| 23 | + | ||
| 24 | + | printf("liberties: %ld\n", count_liberties(test_board,test_overlay)); | |
| 20 | 25 | ||
| 21 | - | print_board(overlay); | |
| 26 | + | kill_group(test_board, test_overlay); | |
| 27 | + | ||
| 28 | + | print_board(test_board); | |
| 22 | 29 | ||
| 23 | - | printf("liberties: %ld\n", count_liberties(test_board,overlay)); | |
| 24 | 30 | delete_board(test_board); | |
| 25 | - | delete_board(overlay); | |
| 31 | + | delete_board(test_overlay); | |
| 32 | + | puts("test1 finished"); | |
| 33 | + | } | |
| 34 | + | ||
| 35 | + | void test2(void) | |
| 36 | + | { | |
| 37 | + | puts("test2 running"); | |
| 38 | + | game_state* test_game = create_game(5); | |
| 39 | + | go_board* test_board = test_game->board; | |
| 40 | + | set_board_at(test_board, 2, 3, WHITE); | |
| 41 | + | set_board_at(test_board, 3, 2, WHITE); | |
| 42 | + | set_board_at(test_board, 1, 2, WHITE); | |
| 43 | + | set_board_at(test_board, 2, 1, WHITE); | |
| 44 | + | ||
| 45 | + | play_at(test_game, 2, 2); | |
| 46 | + | ||
| 47 | + | print_board(test_game->board); | |
| 48 | + | ||
| 49 | + | set_board_at(test_board, 2, 1, EMPTY); | |
| 50 | + | ||
| 51 | + | play_at(test_game, 2, 2); | |
| 52 | + | ||
| 53 | + | print_board(test_game->board); | |
| 54 | + | ||
| 55 | + | delete_game(test_game); | |
| 56 | + | puts("test2 finished"); | |
| 57 | + | } | |
| 58 | + | ||
| 59 | + | ||
| 60 | + | int main(int argc, char** argv) | |
| 61 | + | { | |
| 62 | + | test1(); | |
| 63 | + | test2(); | |
| 26 | 64 | ||
| 27 | 65 | } | |