From 1b6275b4fbc4ab7bcd876938f807aad9ce1900a6 Mon Sep 17 00:00:00 2001 From: nil Date: Fri, 13 Dec 2024 20:00:50 +0100 Subject: add liberties --- src/engine/liberty.js | 63 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 9 deletions(-) (limited to 'src/engine/liberty.js') diff --git a/src/engine/liberty.js b/src/engine/liberty.js index a006c62..d5d4448 100644 --- a/src/engine/liberty.js +++ b/src/engine/liberty.js @@ -12,13 +12,58 @@ export function hasLiberties({ position, team }) { - return Array.from(SURROUNDING) - .map(v => Vector2.sum(v, position)) - .filter(z => 0 <= z.x && z.x < board.size && - 0 <= z.y && z.y < board.size - ) - .some(z => board.stones[z.y][z.x] == undefined ? - true : - board.stones[z.y][z.x].team == team - ) + return checkLiberties({ + position, + team + }) +} + +function checkLiberties({ + position, + team, + checkedStones = [], + checkedLiberties = [], +}) { + if ( + Array.from(checkedStones) + .some(p => Vector2.equals(p, position)) + ) { + return false + } + + checkedStones.push(position) + + let surroundingSquares = Array.from(SURROUNDING) + .map(v => Vector2.sum(v, position)) + .filter(z => 0 <= z.x && z.x < board.size && + 0 <= z.y && z.y < board.size + ) + + surroundingSquares + .filter(z => board.stones[z.y][z.x] == undefined) + .forEach(z => { + if (!Array.from(checkedStones) + .some(p => Vector2.equals(p, z)) + ) { + checkedLiberties.push(z) + } + }) + + surroundingSquares + .filter(z => board.stones[z.y][z.x] != undefined) + .filter(z => board.stones[z.y][z.x].team == team) + .forEach(z => { + checkLiberties({ + position: z, + team: team, + checkedStones: checkedStones, + checkedLiberties: checkedLiberties, + }) + }) + + if (checkedLiberties.length > 0) { + return true + } + + return false } -- cgit v1.2.3