From e5263301c1d8acca10051840ad4b57e6f16a5229 Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Mon, 16 Dec 2013 04:03:56 +0100 Subject: [PATCH] is_border_ladder() shortage of libs test: Properly test for potential self-atari condition --- tactics/ladder.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/tactics/ladder.c b/tactics/ladder.c index 6dd9567..add6f43 100644 --- a/tactics/ladder.c +++ b/tactics/ladder.c @@ -37,17 +37,24 @@ is_border_ladder(struct board *b, coord_t coord, enum stone lcolor) if (board_atxy(b, x + xd * 2, y + yd * 2) == lcolor && board_atxy(b, x - xd * 2, y - yd * 2) == lcolor) return false; + /* ...or can't block where we need because of shortage * of liberties. */ - int libs1 = board_group_info(b, group_atxy(b, x + xd - yd * dd, y + yd - xd * dd)).libs; - int libs2 = board_group_info(b, group_atxy(b, x - xd - yd * dd, y - yd - xd * dd)).libs; + group_t g1 = group_atxy(b, x + xd - yd * dd, y + yd - xd * dd); + int libs1 = board_group_info(b, g1).libs; + group_t g2 = group_atxy(b, x - xd - yd * dd, y - yd - xd * dd); + int libs2 = board_group_info(b, g2).libs; if (DEBUGL(6)) fprintf(stderr, "libs1 %d libs2 %d\n", libs1, libs2); + /* Already in atari? */ if (libs1 < 2 || libs2 < 2) return false; - if (board_atxy(b, x + xd * 2, y + yd * 2) == lcolor && libs1 < 3) + /* Would be self-atari? */ + if (libs1 < 3 && (board_atxy(b, x + xd * 2, y + yd * 2) != S_NONE + || coord_is_adjecent(board_group_info(b, g1).lib[0], board_group_info(b, g1).lib[1], b))) return false; - if (board_atxy(b, x - xd * 2, y - yd * 2) == lcolor && libs2 < 3) + if (libs2 < 3 && (board_atxy(b, x - xd * 2, y - yd * 2) != S_NONE + || coord_is_adjecent(board_group_info(b, g2).lib[0], board_group_info(b, g2).lib[1], b))) return false; return true; } -- 2.11.4.GIT