added count_liberties + test

AuthorKonata <konata@posteo.jp>
Date
Commit578e149434394ccdccf50bab714c8010a0165394
Parent4eaccd4
5 files changed, 145 insertions(+), 6 deletions(-)
▾A.gitignore
@@ -0,0 +1,55 @@
# Binaries
test
# Prerequisites
*.d
# Object files
*.o
*.ko
*.obj
*.elf
# Linker output
*.ilk
*.map
*.exp
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/
*.su
*.idb
*.pdb
# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf
▾MMakefile
@@ -1,3 +1,3 @@
all:
gcc -Og -g simple-go.c \
-Wall -Werror -Wpedantic -Wnull-dereference -Wshadow -Wconversion -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wstrict-overflow=5 -Wunreachable-code -Wno-unused-parameter
gcc -O0 -g test.c simple-go.c -o test \
-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)
{
go_board* board = malloc(sizeof(*board));
board->field_array = malloc(size*size*sizeof(*board->field_array));
for(size_t i = 0; i < size; i++)
for(size_t i = 0; i < size*size; i++)
{
board->field_array[i] = EMPTY;
}
@@ -13,6 +13,12 @@ go_board* create_board(size_t size)
return board;
}
void delete_board(go_board* board)
{
free(board->field_array);
free(board);
}
void print_board(go_board* board)
{
for(size_t y = 0; y < board->size; y++)
@@ -20,6 +26,7 @@ void print_board(go_board* board)
for(size_t x = 0; x < board->size; x++)
{
putchar(get_board_at(board,y,x));
putchar(' ');
}
putchar('\n');
}
@@ -38,10 +45,12 @@ void set_board_at(go_board* board, size_t y, size_t x, char item)
if(y >= 0 && x >= 0 && y < board->size && x < board->size)
board->field_array[y*board->size+x] = item;
}
#include <unistd.h>
void find_group(go_board* board, go_board* overlay, size_t y, size_t x)
{
set_board_at(overlay, y-1, x, GROUP);
assert(board->size == overlay->size);
set_board_at(overlay, y, x, GROUP);
char field = get_board_at(board,y,x);
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)
find_group(board, overlay, y, x+1);
}
size_t count_liberties(go_board* board, go_board* overlay)
{
assert(board->size == overlay->size);
go_board* tmpoverlay = create_board(board->size);
memcpy(tmpoverlay->field_array, overlay->field_array, board->size*board->size);
size_t liberties = 0;
for(size_t y = 0; y < board->size; y++)
{
for(size_t x = 0; x < board->size; x++)
{
if(get_board_at(overlay, y, x) == GROUP)
{
if(get_board_at(board,y-1,x) == EMPTY && get_board_at(tmpoverlay,y-1,x) != COUNTED)
{
liberties++;
set_board_at(tmpoverlay,y-1,x,COUNTED);
}
if(get_board_at(board,y,x-1) == EMPTY && get_board_at(tmpoverlay,y,x-1) != COUNTED)
{
liberties++;
set_board_at(tmpoverlay,y,x-1,COUNTED);
}
if(get_board_at(board,y+1,x) == EMPTY && get_board_at(tmpoverlay,y+1,x) != COUNTED)
{
liberties++;
set_board_at(tmpoverlay,y+1,x,COUNTED);
}
if(get_board_at(board,y,x+1) == EMPTY && get_board_at(tmpoverlay,y,x+1) != COUNTED)
{
liberties++;
set_board_at(tmpoverlay,y,x+1,COUNTED);
}
}
}
}
return liberties;
}
▾Msimple-go.h
@@ -4,12 +4,15 @@
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#define BLACK 'b'
#define WHITE 'w'
#define EMPTY ' '
#define EMPTY '.'
#define GROUP '#'
#define INVALID_FIELD '\0'
#define COUNTED '+'
typedef struct go_board
{
@@ -25,8 +28,15 @@ typedef struct game_state
go_board* create_board(size_t size);
void delete_board(go_board* board);
char get_board_at(go_board* board, size_t y, size_t x);
void set_board_at(go_board* board, size_t y, size_t x, char item);
void print_board(go_board* board);
void find_group(go_board* board, go_board* overlay, size_t y, size_t x);
size_t count_liberties(go_board* board, go_board* overlay);
#endif //SIMPLE_GO_H
▾Atest.c
@@ -0,0 +1,22 @@
#include "simple-go.h"
int main(int argc, char** argv)
{
go_board* test_board = create_board(5);
set_board_at(test_board,2,2,WHITE);
set_board_at(test_board,2,3,WHITE);
set_board_at(test_board,1,3,WHITE);
set_board_at(test_board,3,3,WHITE);
print_board(test_board);
putchar('\n');
go_board* overlay = create_board(5);
find_group(test_board, overlay,2,2);
print_board(overlay);
printf("liberties: %ld\n", count_liberties(test_board,overlay));
}