refactored play_func(), added final_score to known_commands, fixed type issues, fixed coordinate issues with I and higher coords,fixed captured point counting, added cutils.wrap file for real this time

AuthorKonata <konata@posteo.jp>
Date
Commitbeb17137e28c0ca1ca37d17948d4996b01a2adee
Parenteb166d6
5 files changed, 56 insertions(+), 34 deletions(-)
▾Minclude/simple-go/simple-go.h
@@ -15,7 +15,7 @@
#define NO_FIELD '\0'
#define COUNTED '+'
typedef unsigned int go_coordinate;
typedef size_t go_coordinate;
typedef char go_symbol;
typedef struct go_board
@@ -51,7 +51,7 @@ bool check_bounds(const go_board* board, go_coordinate y, go_coordinate x);
char get_board_at(const go_board* board, go_coordinate y, go_coordinate x);
void set_board_at(go_board* board, go_coordinate y, go_coordinate x, char item);
void kill_group(go_board* board, const go_board* overlay);
void kill_group(game_state* game, const go_board* overlay);
bool group_killable(game_state* game, go_coordinate y, go_coordinate x);
bool group_attachable(const game_state* game, go_coordinate y, go_coordinate x);
bool play_at(game_state* game, go_coordinate y, go_coordinate x, go_symbol color);
▾Msrc/simple-go.c
@@ -47,14 +47,21 @@ bool check_bounds(const go_board* board, go_coordinate y, go_coordinate x)
return false;
}
void kill_group(go_board* board, const go_board* overlay)
void kill_group(game_state* game, const go_board* overlay)
{
go_board* board = game->board;
double* captured = NULL;
for(go_coordinate y = 0; y < board->size; y++)
{
for(go_coordinate x = 0; x < board->size; x++)
{
if(get_board_at(overlay, y, x) == GROUP)
{
if(!captured)
captured = get_board_at(board, y, x) == BLACK ? &game->white_captured : &game->black_captured;
set_board_at(board, y, x, EMPTY);
(*captured)++;
}
}
}
}
@@ -134,7 +141,7 @@ bool group_killable(game_state* game, go_coordinate y, go_coordinate x)
find_group(game->board, enemy_group, y, x);
if(count_liberties(game->board, enemy_group) <= 1)
{
kill_group(game->board, enemy_group);
kill_group(game, enemy_group);
delete_board(enemy_group);
return true;
} else {
@@ -376,10 +383,10 @@ go_score* score_game(const game_state* game)
if((belongs = group_belongs(board, overlay)) == WHITE)
{
vector_push(ret->white_groups, overlay);
ret->white_points += group_size(overlay);
ret->white_points += (double)group_size(overlay);
} else if(belongs == BLACK) {
vector_push(ret->black_groups, overlay);
ret->black_points += group_size(overlay);
ret->black_points += (double)group_size(overlay);
} else {
delete_board(overlay);
}
▾Msrc/simple-gtp-func.c
@@ -1,7 +1,7 @@
#include <simple-go/simple-gtp-func.h>
const char* const known_commands_string = "protocol_version\nname\nversion\nknown_command\nlist_commands\nquit\nboardsize\nclear_board\nkomi\nplay\ngenmove\nshowboard";
const char* known_commands_array[] = {"protocol_version","name","version","known_command","list_commands","quit","boardsize","clear_board","komi","play","genmove","showboard", NULL};
const char* const known_commands_string = "protocol_version\nname\nversion\nknown_command\nlist_commands\nquit\nboardsize\nclear_board\nkomi\nplay\ngenmove\nshowboard\nfinal_score";
const char* known_commands_array[] = {"protocol_version","name","version","known_command","list_commands","quit","boardsize","clear_board","komi","play","genmove","showboard", "final_score", NULL};
static char* cmd_error(const char* msg, const char* id)
{
@@ -101,7 +101,7 @@ char* komi_func(const Vector* arguments, const char* id, game_state* game)
char* clear_board_func(const Vector* arguments, const char* id, game_state* game)
{
unsigned int size = game->board->size;
go_coordinate size = game->board->size;
delete_board(game->board);
game->board = create_board(size);
return cmd_success(NULL, id);
@@ -110,32 +110,42 @@ char* clear_board_func(const Vector* arguments, const char* id, game_state* game
char* play_func(const Vector* arguments, const char* id, game_state* game)
{
char* color = malloc(6);
char x;
int y;
if((arguments->length == 2 || arguments->length == 3) && //either its "a 10" or "a10"
(snprintf(color, 6, "%s", (char*)vector_at(arguments,0)) > 0) && //"white" and "black" are only 6 chars
(strcmp(color, "white") == 0 || strcmp(color, "black") == 0 ||
strcmp(color, "w") == 0 || strcmp(color, "b") == 0) && // check color
(sscanf(vector_at(arguments,1), "%c", &x) > 0) && // get horizontal coordinate
((unsigned char)(tolower(x) - 'a') < game->board->size) && // check range
((sscanf((char*)vector_at(arguments,1)+1, "%d", &y) > 0) || // get vertical coordinate if no space between
((arguments->length == 3) && (sscanf((char*)vector_at(arguments,2), "%d", &y) > 0))) && // get vertical coordinate if space between
((unsigned int)y <= game->board->size) && y > 0) // check range
char xchar;
size_t x;
size_t y;
if(!(arguments->length == 2 || arguments->length == 3)) //allow "a 10" or "a10"
goto error;
if(snprintf(color, 6, "%s", (char*)vector_at(arguments,0)) <= 0) //"white" and "black" are only 6 chars
goto error;
if(!(strcmp_nocase(color, "white") == 0 || strcmp_nocase(color, "black") == 0 || // check color
strcmp_nocase(color, "w") == 0 || strcmp_nocase(color, "b") == 0))
goto error;
if(sscanf(vector_at(arguments,1), "%c", &xchar) <= 0) // get horizontal coordinate
goto error;
x = (size_t)tolower(xchar) - 'a';
x = x >= 9 ? x-1 : x; //skip J
if((x < 'i' && x >= game->board->size) || (x > 'i' && x-1 >= game->board->size)) // check range
goto error;
if(!((arguments->length == 2) && (sscanf((char*)vector_at(arguments,1)+1, "%zu", &y) > 0)) && // get vertical coordinate if no space between
!((arguments->length == 3) && (sscanf((char*)vector_at(arguments,2), "%zu", &y) > 0))) // get vertical coordinate if space between
goto error;
if(y > game->board->size)
goto error;
if(play_at(game, game->board->size-y, x, (strcmp(color, "white") == 0 || strcmp(color, "w") == 0) ? WHITE : BLACK))
{
if(play_at(game, game->board->size-(unsigned int)y, (unsigned char)(x-'a'), (strcmp(color, "white") == 0 || strcmp(color, "w") == 0) ? WHITE : BLACK))
{
free(color);
return cmd_success(NULL, id);
} else {
free(color);
return cmd_error("illegal move", id);
}
free(color);
return cmd_success(NULL, id);
} else {
free(color);
return cmd_error("invalid color or coordinate", id);
return cmd_error("illegal move", id);
}
error:
free(color);
return cmd_error("invalid color or coordinate", id);
}
char* genmove_func(const Vector* arguments, const char* id, game_state* game)
▾Msrc/test.c
@@ -4,7 +4,8 @@
static void test1(void)
{
puts("test1 running");
go_board* test_board = create_board(5);
game_state* test_game = create_game(5, 6.5);
go_board* test_board = test_game->board;
set_board_at(test_board, 2, 2, WHITE);
set_board_at(test_board, 2, 3, WHITE);
@@ -22,13 +23,13 @@ static void test1(void)
print_board(test_overlay);
printf("liberties: %d\n", count_liberties(test_board,test_overlay));
printf("liberties: %ld\n", count_liberties(test_board,test_overlay));
kill_group(test_board, test_overlay);
kill_group(test_game, test_overlay);
print_board(test_board);
delete_board(test_board);
delete_game(test_game);
delete_board(test_overlay);
puts("test1 finished");
}
▾Asubprojects/cutils.wrap
@@ -0,0 +1,4 @@
[wrap-git]
directory=cutils
url=https://github.com/marcschulze98/libcutils
revision=head