From 65b68f2b7fb0fb7a659d17a7f9aff8a12aa0132b Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Fri, 3 Dec 2010 04:32:23 +0100 Subject: [PATCH] fbook: Properly flip not just sequences, but also the final coordinate --- fbook.c | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/fbook.c b/fbook.c index 4731eeb..3713d3f 100644 --- a/fbook.c +++ b/fbook.c @@ -7,6 +7,26 @@ #include "debug.h" #include "fbook.h" + +static coord_t +coord_transform(struct board *b, coord_t coord, int i) +{ +#define HASH_VMIRROR 1 +#define HASH_HMIRROR 2 +#define HASH_XYFLIP 4 + if (i & HASH_VMIRROR) { + coord = coord_xy(b, coord_x(coord, b), board_size(b) - 1 - coord_y(coord, b)); + } + if (i & HASH_HMIRROR) { + coord = coord_xy(b, board_size(b) - 1 - coord_x(coord, b), coord_y(coord, b)); + } + if (i & HASH_XYFLIP) { + coord = coord_xy(b, coord_y(coord, b), coord_x(coord, b)); + } + return coord; +} + + struct fbook * fbook_init(char *filename, struct board *b) { @@ -57,19 +77,7 @@ fbook_init(char *filename, struct board *b) coord_t *c = str2coord(line, fbook->bsize); for (int i = 0; i < 8; i++) { -#define HASH_VMIRROR 1 -#define HASH_HMIRROR 2 -#define HASH_XYFLIP 4 - coord_t coord = *c; - if (i & HASH_VMIRROR) { - coord = coord_xy(b, coord_x(coord, b), board_size(b) - 1 - coord_y(coord, b)); - } - if (i & HASH_HMIRROR) { - coord = coord_xy(b, board_size(b) - 1 - coord_x(coord, b), coord_y(coord, b)); - } - if (i & HASH_XYFLIP) { - coord = coord_xy(b, coord_y(coord, b), coord_x(coord, b)); - } + coord_t coord = coord_transform(b, *c, i); struct move m = { .coord = coord, .color = stone_other(bs[i]->last_move.color) }; int ret = board_play(bs[i], &m); assert(ret >= 0); @@ -85,6 +93,7 @@ fbook_init(char *filename, struct board *b) coord_t *c = str2coord(line, fbook->bsize); for (int i = 0; i < 8; i++) { + coord_t coord = coord_transform(b, *c, i); #if 0 char conflict = is_pass(fbook->moves[bs[i]->hash & fbook_hash_mask]) ? '+' : 'C'; if (conflict == 'C') @@ -98,13 +107,13 @@ fbook_init(char *filename, struct board *b) if (fbook->hashes[hi & fbook_hash_mask] == bs[i]->hash) hi = 'c'; } - fprintf(stderr, "%c %"PRIhash" (<%d> %s)\n", conflict, - bs[i]->hash & fbook_hash_mask, i, linebuf); + fprintf(stderr, "%c %"PRIhash":%"PRIhash" (<%d> %s)\n", conflict, + bs[i]->hash & fbook_hash_mask, bs[i]->hash, i, linebuf); #endif hash_t hi = bs[i]->hash; while (!is_pass(fbook->moves[hi & fbook_hash_mask]) && fbook->hashes[hi & fbook_hash_mask] != bs[i]->hash) hi++; - fbook->moves[hi & fbook_hash_mask] = *c; + fbook->moves[hi & fbook_hash_mask] = coord; fbook->hashes[hi & fbook_hash_mask] = bs[i]->hash; } coord_done(c); -- 2.11.4.GIT