From 5849809fcb10af85394474ab21fc71e9a9ea03cd Mon Sep 17 00:00:00 2001 From: Joe Moudrik Date: Tue, 20 Mar 2012 15:06:46 +0100 Subject: [PATCH] pattern.[ch]: Added CAPTURE feature counting number of stones. --- pattern.c | 9 ++++++++- pattern.h | 14 +++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/pattern.c b/pattern.c index 45712a0..98bde75 100644 --- a/pattern.c +++ b/pattern.c @@ -38,7 +38,7 @@ static const struct feature_info { char *name; int payloads; } features[FEAT_MAX] = { - [FEAT_CAPTURE] = { .name = "capture", .payloads = 64 }, + [FEAT_CAPTURE] = { .name = "capture", .payloads = 64 * 1 << CAPTURE_COUNTSTONES_PAYLOAD_SIZE }, [FEAT_AESCAPE] = { .name = "atariescape", .payloads = 16 }, [FEAT_SELFATARI] = { .name = "selfatari", .payloads = 4 }, [FEAT_ATARI] = { .name = "atari", .payloads = 4 }, @@ -185,6 +185,7 @@ pattern_match_capture(struct pattern_config *pc, pattern_spec ps, coord_t onelib = -1; int extra_libs = 0, connectable_groups = 0; bool onestone = false, multistone = false; + int captured_stones = 0; foreach_neighbor(b, m->coord, { if (board_at(b, c) != stone_other(m->color)) { @@ -246,6 +247,10 @@ pattern_match_capture(struct pattern_config *pc, pattern_spec ps, + neighbor_count_at(b, m->coord, S_OFFBOARD) == 4) f->payload |= 1 << PF_CAPTURE_KO; + if (PS_PF(CAPTURE, COUNTSTONES) + && captured_stones < (1 << CAPTURE_COUNTSTONES_PAYLOAD_SIZE) - 1) + captured_stones += group_stone_count(b, g, (1 << CAPTURE_COUNTSTONES_PAYLOAD_SIZE) - 1 - captured_stones); + if (group_is_onestone(b, g)) onestone = true; else @@ -259,6 +264,8 @@ pattern_match_capture(struct pattern_config *pc, pattern_spec ps, f->payload |= (extra_libs < 2) << PF_CAPTURE_TRAPPED; if (PS_PF(CAPTURE, CONNECTION)) f->payload |= (connectable_groups > 0) << PF_CAPTURE_CONNECTION; + if (PS_PF(CAPTURE, COUNTSTONES)) + f->payload |= captured_stones << PF_CAPTURE_COUNTSTONES; (f++, p->n++); } return f; diff --git a/pattern.h b/pattern.h index ebde884..d8103a0 100644 --- a/pattern.h +++ b/pattern.h @@ -32,16 +32,20 @@ enum feature_id { /* Simple capture move. */ /* Payload: [bit0] Capturing laddered group? */ #define PF_CAPTURE_LADDER 0 - /* [bit2] Enables our atari group get more libs? */ + /* [bit1] Enables our atari group get more libs? */ #define PF_CAPTURE_ATARIDEF 1 - /* [bit3] Capturing ko? */ + /* [bit2] Capturing ko? */ #define PF_CAPTURE_KO 2 - /* [bit4] Single-stone group? */ + /* [bit3] Single-stone group? */ #define PF_CAPTURE_1STONE 3 - /* [bit5] Unsafe move for opponent? */ + /* [bit4] Unsafe move for opponent? */ #define PF_CAPTURE_TRAPPED 4 - /* [bit6] Preventing connection to an outside group. */ + /* [bit5] Preventing connection to an outside group. */ #define PF_CAPTURE_CONNECTION 5 + /* [bit6] Are we counting captured stones? */ +#define PF_CAPTURE_COUNTSTONES 6 + /* How many bits of payload are used for counting captured stones. */ +#define CAPTURE_COUNTSTONES_PAYLOAD_SIZE 4 /* that is, payload bits 6,7,8,9 */ FEAT_CAPTURE, /* Atari escape (extension). */ -- 2.11.4.GIT