added count_liberties + test

AuthorKonata <konata@posteo.jp>
Date
Commit578e149434394ccdccf50bab714c8010a0165394
Parent4eaccd4
5 files changed, 145 insertions(+), 6 deletions(-)
A.gitignore
@@ -0,0 +1,55 @@
1+# Binaries
2+test
3+
4+# Prerequisites
5+*.d
6+
7+# Object files
8+*.o
9+*.ko
10+*.obj
11+*.elf
12+
13+# Linker output
14+*.ilk
15+*.map
16+*.exp
17+
18+# Precompiled Headers
19+*.gch
20+*.pch
21+
22+# Libraries
23+*.lib
24+*.a
25+*.la
26+*.lo
27+
28+# Shared objects (inc. Windows DLLs)
29+*.dll
30+*.so
31+*.so.*
32+*.dylib
33+
34+# Executables
35+*.exe
36+*.out
37+*.app
38+*.i*86
39+*.x86_64
40+*.hex
41+
42+# Debug files
43+*.dSYM/
44+*.su
45+*.idb
46+*.pdb
47+
48+# Kernel Module Compile Results
49+*.mod*
50+*.cmd
51+.tmp_versions/
52+modules.order
53+Module.symvers
54+Mkfile.old
55+dkms.conf
MMakefile
@@ -1,3 +1,3 @@
11 all:
2- gcc -Og -g simple-go.c \
3- -Wall -Werror -Wpedantic -Wnull-dereference -Wshadow -Wconversion -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wstrict-overflow=5 -Wunreachable-code -Wno-unused-parameter
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
Msimple-go.c
@@ -4,7 +4,7 @@ go_board* create_board(size_t size)
44 {
55 go_board* board = malloc(sizeof(*board));
66 board->field_array = malloc(size*size*sizeof(*board->field_array));
7- for(size_t i = 0; i < size; i++)
7+ for(size_t i = 0; i < size*size; i++)
88 {
99 board->field_array[i] = EMPTY;
1010 }
@@ -13,6 +13,12 @@ go_board* create_board(size_t size)
1313 return board;
1414 }
1515
16+void delete_board(go_board* board)
17+{
18+ free(board->field_array);
19+ free(board);
20+}
21+
1622 void print_board(go_board* board)
1723 {
1824 for(size_t y = 0; y < board->size; y++)
@@ -20,6 +26,7 @@ void print_board(go_board* board)
2026 for(size_t x = 0; x < board->size; x++)
2127 {
2228 putchar(get_board_at(board,y,x));
29+ putchar(' ');
2330 }
2431 putchar('\n');
2532 }
@@ -38,10 +45,12 @@ void set_board_at(go_board* board, size_t y, size_t x, char item)
3845 if(y >= 0 && x >= 0 && y < board->size && x < board->size)
3946 board->field_array[y*board->size+x] = item;
4047 }
41-
48+#include <unistd.h>
4249 void find_group(go_board* board, go_board* overlay, size_t y, size_t x)
4350 {
44- set_board_at(overlay, y-1, x, GROUP);
51+ assert(board->size == overlay->size);
52+
53+ set_board_at(overlay, y, x, GROUP);
4554 char field = get_board_at(board,y,x);
4655
4756 if(get_board_at(board,y-1,x) == field && get_board_at(overlay,y-1,x) == EMPTY)
@@ -57,4 +66,47 @@ void find_group(go_board* board, go_board* overlay, size_t y, size_t x)
5766 find_group(board, overlay, y, x+1);
5867 }
5968
69+size_t count_liberties(go_board* board, go_board* overlay)
70+{
71+ assert(board->size == overlay->size);
72+
73+ go_board* tmpoverlay = create_board(board->size);
74+ memcpy(tmpoverlay->field_array, overlay->field_array, board->size*board->size);
75+
76+ size_t liberties = 0;
77+
78+ for(size_t y = 0; y < board->size; y++)
79+ {
80+ for(size_t x = 0; x < board->size; x++)
81+ {
82+ if(get_board_at(overlay, y, x) == GROUP)
83+ {
84+ if(get_board_at(board,y-1,x) == EMPTY && get_board_at(tmpoverlay,y-1,x) != COUNTED)
85+ {
86+ liberties++;
87+ set_board_at(tmpoverlay,y-1,x,COUNTED);
88+ }
89+ if(get_board_at(board,y,x-1) == EMPTY && get_board_at(tmpoverlay,y,x-1) != COUNTED)
90+ {
91+ liberties++;
92+ set_board_at(tmpoverlay,y,x-1,COUNTED);
93+ }
94+ if(get_board_at(board,y+1,x) == EMPTY && get_board_at(tmpoverlay,y+1,x) != COUNTED)
95+ {
96+ liberties++;
97+ set_board_at(tmpoverlay,y+1,x,COUNTED);
98+ }
99+ if(get_board_at(board,y,x+1) == EMPTY && get_board_at(tmpoverlay,y,x+1) != COUNTED)
100+ {
101+ liberties++;
102+ set_board_at(tmpoverlay,y,x+1,COUNTED);
103+ }
104+
105+ }
106+ }
107+ }
108+
109+ return liberties;
110+}
111+
60112
Msimple-go.h
@@ -4,12 +4,15 @@
44 #include <stdint.h>
55 #include <stdbool.h>
66 #include <stdio.h>
7+#include <assert.h>
8+#include <string.h>
79
810 #define BLACK 'b'
911 #define WHITE 'w'
10-#define EMPTY ' '
12+#define EMPTY '.'
1113 #define GROUP '#'
1214 #define INVALID_FIELD '\0'
15+#define COUNTED '+'
1316
1417 typedef struct go_board
1518 {
@@ -25,8 +28,15 @@ typedef struct game_state
2528
2629
2730 go_board* create_board(size_t size);
31+void delete_board(go_board* board);
2832 char get_board_at(go_board* board, size_t y, size_t x);
2933 void set_board_at(go_board* board, size_t y, size_t x, char item);
34+void print_board(go_board* board);
35+void find_group(go_board* board, go_board* overlay, size_t y, size_t x);
36+size_t count_liberties(go_board* board, go_board* overlay);
37+
38+
39+
3040
3141
3242 #endif //SIMPLE_GO_H
Atest.c
@@ -0,0 +1,22 @@
1+#include "simple-go.h"
2+
3+int main(int argc, char** argv)
4+{
5+ go_board* test_board = create_board(5);
6+
7+ set_board_at(test_board,2,2,WHITE);
8+ set_board_at(test_board,2,3,WHITE);
9+ set_board_at(test_board,1,3,WHITE);
10+ set_board_at(test_board,3,3,WHITE);
11+
12+ print_board(test_board);
13+ putchar('\n');
14+
15+ go_board* overlay = create_board(5);
16+ find_group(test_board, overlay,2,2);
17+
18+ print_board(overlay);
19+
20+ printf("liberties: %ld\n", count_liberties(test_board,overlay));
21+
22+}