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 @@
11 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 \
44 -fsanitize=undefined
Msimple-go.c
@@ -3,7 +3,9 @@
33 go_board* create_board(size_t size)
44 {
55 go_board* board = malloc(sizeof(*board));
6+ assert(board);
67 board->field_array = malloc(size*size*sizeof(*board->field_array));
8+ assert(board->field_array);
79 for(size_t i = 0; i < size*size; i++)
810 {
911 board->field_array[i] = EMPTY;
@@ -13,18 +15,45 @@ go_board* create_board(size_t size)
1315 return board;
1416 }
1517
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+
1639 bool check_bounds(go_board* board, size_t y, size_t x)
1740 {
18- if(y >= 0 && x >= 0 && y < board->size && x < board->size)
41+ if(y < board->size && x < board->size)
1942 return true;
2043 else
2144 return false;
2245 }
2346
24-void delete_board(go_board* board)
47+void kill_group(go_board* board, go_board* overlay)
2548 {
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+ }
2857 }
2958
3059 void print_board(go_board* board)
@@ -67,7 +96,7 @@ bool play_at(game_state* game, size_t y, size_t x)
6796 delete_board(enemy_group);
6897 return false;
6998 } else {
70- //TODO: kill_group();
99+ kill_group(game->board, enemy_group);
71100 }
72101 }
73102 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)
79108 delete_board(enemy_group);
80109 return false;
81110 } else {
82- //kill_group();
111+ kill_group(game->board, enemy_group);
83112 }
84113 }
85114 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)
91120 delete_board(enemy_group);
92121 return false;
93122 } else {
94- //kill_group();
123+ kill_group(game->board, enemy_group);
95124 }
96125 }
97126 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)
103132 delete_board(enemy_group);
104133 return false;
105134 } else {
106- //kill_group();
135+ kill_group(game->board, enemy_group);
107136 }
108137 }
109138 //TODO: ...or if it connects to own group that has liberties left
Msimple-go.h
@@ -28,11 +28,17 @@ typedef struct game_state
2828
2929
3030 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);
3331 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);
3436 char get_board_at(go_board* board, size_t y, size_t x);
3537 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+
3642 void print_board(go_board* board);
3743 void find_group(go_board* board, go_board* overlay, size_t y, size_t x);
3844 size_t count_liberties(go_board* board, go_board* overlay);
Mtest.c
@@ -1,7 +1,8 @@
11 #include "simple-go.h"
22
3-int main(int argc, char** argv)
3+void test1(void)
44 {
5+ puts("test1 running");
56 go_board* test_board = create_board(5);
67
78 set_board_at(test_board, 2, 2, WHITE);
@@ -15,13 +16,50 @@ int main(int argc, char** argv)
1516 print_board(test_board);
1617 putchar('\n');
1718
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));
2025
21- print_board(overlay);
26+ kill_group(test_board, test_overlay);
27+
28+ print_board(test_board);
2229
23- printf("liberties: %ld\n", count_liberties(test_board,overlay));
2430 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();
2664
2765 }