simple-go.c
Raw
1#include "simple-go.h"
2
3go_board* create_board(size_t size)
4{
5 go_board* board = malloc(sizeof(*board));
6 board->field_array = malloc(size*size*sizeof(*board->field_array));
7 for(size_t i = 0; i < size*size; i++)
8 {
9 board->field_array[i] = EMPTY;
10 }
11 board->size = size;
12
13 return board;
14}
15
16void delete_board(go_board* board)
17{
18 free(board->field_array);
19 free(board);
20}
21
22void print_board(go_board* board)
23{
24 for(size_t y = 0; y < board->size; y++)
25 {
26 for(size_t x = 0; x < board->size; x++)
27 {
28 putchar(get_board_at(board,y,x));
29 putchar(' ');
30 }
31 putchar('\n');
32 }
33}
34
35char get_board_at(go_board* board, size_t y, size_t x)
36{
37 if(y >= 0 && x >= 0 && y < board->size && x < board->size)
38 return board->field_array[y*board->size+x];
39 else
40 return INVALID_FIELD;
41}
42
43void set_board_at(go_board* board, size_t y, size_t x, char item)
44{
45 if(y >= 0 && x >= 0 && y < board->size && x < board->size)
46 board->field_array[y*board->size+x] = item;
47}
48#include <unistd.h>
49void find_group(go_board* board, go_board* overlay, size_t y, size_t x)
50{
51 assert(board->size == overlay->size);
52
53 set_board_at(overlay, y, x, GROUP);
54 char field = get_board_at(board,y,x);
55
56 if(get_board_at(board,y-1,x) == field && get_board_at(overlay,y-1,x) == EMPTY)
57 find_group(board, overlay, y-1, x);
58
59 if(get_board_at(board,y,x-1) == field && get_board_at(overlay,y,x-1) == EMPTY)
60 find_group(board, overlay, y, x-1);
61
62 if(get_board_at(board,y+1,x) == field && get_board_at(overlay,y+1,x) == EMPTY)
63 find_group(board, overlay, y+1, x);
64
65 if(get_board_at(board,y,x+1) == field && get_board_at(overlay,y,x+1) == EMPTY)
66 find_group(board, overlay, y, x+1);
67}
68
69size_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
112
113