added count_liberties + test
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 @@ | |||
|---|---|---|---|
| 1 | 1 | 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) | |||
|---|---|---|---|
| 4 | 4 | { | |
| 5 | 5 | go_board* board = malloc(sizeof(*board)); | |
| 6 | 6 | 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++) | |
| 8 | 8 | { | |
| 9 | 9 | board->field_array[i] = EMPTY; | |
| 10 | 10 | } | |
| @@ -13,6 +13,12 @@ go_board* create_board(size_t size) | |||
|---|---|---|---|
| 13 | 13 | return board; | |
| 14 | 14 | } | |
| 15 | 15 | ||
| 16 | + | void delete_board(go_board* board) | |
| 17 | + | { | |
| 18 | + | free(board->field_array); | |
| 19 | + | free(board); | |
| 20 | + | } | |
| 21 | + | ||
| 16 | 22 | void print_board(go_board* board) | |
| 17 | 23 | { | |
| 18 | 24 | for(size_t y = 0; y < board->size; y++) | |
| @@ -20,6 +26,7 @@ void print_board(go_board* board) | |||
|---|---|---|---|
| 20 | 26 | for(size_t x = 0; x < board->size; x++) | |
| 21 | 27 | { | |
| 22 | 28 | putchar(get_board_at(board,y,x)); | |
| 29 | + | putchar(' '); | |
| 23 | 30 | } | |
| 24 | 31 | putchar('\n'); | |
| 25 | 32 | } | |
| @@ -38,10 +45,12 @@ void set_board_at(go_board* board, size_t y, size_t x, char item) | |||
|---|---|---|---|
| 38 | 45 | if(y >= 0 && x >= 0 && y < board->size && x < board->size) | |
| 39 | 46 | board->field_array[y*board->size+x] = item; | |
| 40 | 47 | } | |
| 41 | - | ||
| 48 | + | #include <unistd.h> | |
| 42 | 49 | void find_group(go_board* board, go_board* overlay, size_t y, size_t x) | |
| 43 | 50 | { | |
| 44 | - | set_board_at(overlay, y-1, x, GROUP); | |
| 51 | + | assert(board->size == overlay->size); | |
| 52 | + | ||
| 53 | + | set_board_at(overlay, y, x, GROUP); | |
| 45 | 54 | char field = get_board_at(board,y,x); | |
| 46 | 55 | ||
| 47 | 56 | 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) | |||
|---|---|---|---|
| 57 | 66 | find_group(board, overlay, y, x+1); | |
| 58 | 67 | } | |
| 59 | 68 | ||
| 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 | + | ||
| 60 | 112 | ||
Msimple-go.h
| @@ -4,12 +4,15 @@ | |||
|---|---|---|---|
| 4 | 4 | #include <stdint.h> | |
| 5 | 5 | #include <stdbool.h> | |
| 6 | 6 | #include <stdio.h> | |
| 7 | + | #include <assert.h> | |
| 8 | + | #include <string.h> | |
| 7 | 9 | ||
| 8 | 10 | #define BLACK 'b' | |
| 9 | 11 | #define WHITE 'w' | |
| 10 | - | #define EMPTY ' ' | |
| 12 | + | #define EMPTY '.' | |
| 11 | 13 | #define GROUP '#' | |
| 12 | 14 | #define INVALID_FIELD '\0' | |
| 15 | + | #define COUNTED '+' | |
| 13 | 16 | ||
| 14 | 17 | typedef struct go_board | |
| 15 | 18 | { | |
| @@ -25,8 +28,15 @@ typedef struct game_state | |||
|---|---|---|---|
| 25 | 28 | ||
| 26 | 29 | ||
| 27 | 30 | go_board* create_board(size_t size); | |
| 31 | + | void delete_board(go_board* board); | |
| 28 | 32 | char get_board_at(go_board* board, size_t y, size_t x); | |
| 29 | 33 | 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 | + | ||
| 30 | 40 | ||
| 31 | 41 | ||
| 32 | 42 | #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 | + | } | |