diff --git a/src/games/reversi/core.ts b/src/games/reversi/core.ts index 481b5b0f758ef296bad2adbbd5eceef45f4a47c4..e2a2289f18c2e47f2d208ba564684d7ea4c7a39e 100644 --- a/src/games/reversi/core.ts +++ b/src/games/reversi/core.ts @@ -238,87 +238,55 @@ export default class Reversi { /** * 指定ã®ãƒžã‚¹ã«çŸ³ã‚’ç½®ã„ãŸæ™‚ã®ã€å転ã•ã›ã‚‰ã‚Œã‚‹çŸ³ã‚’å–å¾—ã—ã¾ã™ * @param color 自分ã®è‰² - * @param pos ä½ç½® + * @param initPos ä½ç½® */ - public effects(color: Color, pos: number): number[] { + public effects(color: Color, initPos: number): number[] { const enemyColor = !color; - // ã²ã£ãã‚Šè¿”ã›ã‚‹çŸ³(ã®ä½ç½®)リスト - let stones: number[] = []; - - const initPos = pos; - - // 走査 - const iterate = (fn: (i: number) => number[]) => { - let i = 1; - const found = []; - + const diffVectors: [number, number][] = [ + [ 0, -1], // 上 + [ +1, -1], // å³ä¸Š + [ +1, 0], // å³ + [ +1, +1], // å³ä¸‹ + [ 0, +1], // 下 + [ -1, +1], // 左下 + [ -1, 0], // å·¦ + [ -1, -1] // 左上 + ]; + + const effectsInLine = ([dx, dy]: [number, number]): number[] => { + const nextPos = (x: number, y: number): [number, number] => [x + dx, y + dy]; + + const found: number[] = []; // 挟ã‚ã‚‹ã‹ã‚‚ã—ã‚Œãªã„相手ã®çŸ³ã‚’入れã¦ãŠãé…列 + let [x, y] = this.transformPosToXy(initPos); while (true) { - let [x, y] = fn(i); - // 座標ãŒæŒ‡ã—示ã™ä½ç½®ãŒãƒœãƒ¼ãƒ‰å¤–ã«å‡ºãŸã¨ã if (this.opts.loopedBoard) { - if (x < 0 ) x = this.mapWidth - ((-x) % this.mapWidth); - if (y < 0 ) y = this.mapHeight - ((-y) % this.mapHeight); - if (x >= this.mapWidth ) x = x % this.mapWidth; - if (y >= this.mapHeight) y = y % this.mapHeight; - - // for debug - //if (x < 0 || y < 0 || x >= this.mapWidth || y >= this.mapHeight) { - // console.log(x, y); - //} + x = ((x % this.mapWidth) + this.mapWidth) % this.mapWidth; + y = ((y % this.mapHeight) + this.mapHeight) % this.mapHeight; - // 一周ã—ã¦è‡ªåˆ†ã«å¸°ã£ã¦ããŸã‚‰ if (this.transformXyToPos(x, y) == initPos) { - // ↓ã®ã‚³ãƒ¡ãƒ³ãƒˆã‚¢ã‚¦ãƒˆã‚’外ã™ã¨ã€ã€Œç¾æ™‚点ã§è‡ªåˆ†ã®çŸ³ãŒéš£æŽ¥ã—ã¦ã„ãªã„ãŒã€ - // ãã“ã«ç½®ã„ãŸã¨ã™ã‚‹ã¨ãƒ«ãƒ¼ãƒ—ã—ã¦æœ€çµ‚çš„ã«æŒŸã‚“ã ã“ã¨ã«ãªã‚‹ã€ã¨ã„ã†ã‚±ãƒ¼ã‚¹ã‚’有効化ã—ã¾ã™ã€‚(Test4ã®ãƒžãƒƒãƒ—ã§é•ã„ãŒåˆ†ã‹ã‚Šã¾ã™) - // ã“ã®ã‚±ãƒ¼ã‚¹ã‚’有効ã«ã—ãŸæ–¹ãŒè‰¯ã„ã®ã‹ç„¡åŠ¹ã«ã—ãŸæ–¹ãŒè‰¯ã„ã®ã‹åˆ¤æ–ãŒã¤ã‹ãªã‹ã£ãŸãŸã‚ã¨ã‚Šã‚ãˆãšç„¡åŠ¹ã¨ã—ã¦ãŠãã¾ã™ - // (ã‚ã¨ç„¡åŠ¹ãªæ–¹ãŒã‚²ãƒ¼ãƒ ã¨ã—ã¦ãŠã‚‚ã—ã‚ãã†ã ã£ãŸ) - stones = stones.concat(found); - break; + // 盤é¢ã®å¢ƒç•Œã§ãƒ«ãƒ¼ãƒ—ã—ã€è‡ªåˆ†ãŒçŸ³ã‚’ç½®ãä½ç½®ã«æˆ»ã£ã¦ããŸã¨ãã€æŒŸã‚るよã†ã«ã—ã¦ã„ã‚‹ (ref: Test4ã®ãƒžãƒƒãƒ—) + return found; } } else { - if (x == -1 || y == -1 || x == this.mapWidth || y == this.mapHeight) break; + if (x == -1 || y == -1 || x == this.mapWidth || y == this.mapHeight) { + return []; // 挟ã‚ãªã„ã“ã¨ãŒç¢ºå®š (盤é¢å¤–ã«åˆ°é”) + } } const pos = this.transformXyToPos(x, y); - - //#region 「é…ç½®ä¸èƒ½ã€ãƒžã‚¹ã«å½“ãŸã£ãŸå ´åˆèµ°æŸ»çµ‚了 - const pixel = this.mapDataGet(pos); - if (pixel == 'null') break; - //#endregion - - // 石å–å¾— + if (this.mapDataGet(pos) === 'null') return []; // 挟ã‚ãªã„ã“ã¨ãŒç¢ºå®š (é…ç½®ä¸å¯èƒ½ãªãƒžã‚¹ã«åˆ°é”) const stone = this.board[pos]; + if (stone === null) return []; // 挟ã‚ãªã„ã“ã¨ãŒç¢ºå®š (石ãŒç½®ã‹ã‚Œã¦ã„ãªã„マスã«åˆ°é”) + if (stone === enemyColor) found.push(pos); // 挟ã‚ã‚‹ã‹ã‚‚ã—ã‚Œãªã„ (相手ã®çŸ³ã‚’発見) + if (stone === color) return found; // 挟ã‚ã‚‹ã“ã¨ãŒç¢ºå®š (対ã¨ãªã‚‹è‡ªåˆ†ã®çŸ³ã‚’発見) - // 石ãŒç½®ã‹ã‚Œã¦ã„ãªã„マスãªã‚‰èµ°æŸ»çµ‚了 - if (stone === null) break; - - // 相手ã®çŸ³ãªã‚‰ã€Œã²ã£ãã‚Šè¿”ã›ã‚‹ã‹ã‚‚リストã€ã«å…¥ã‚Œã¦ãŠã - if (stone === enemyColor) found.push(pos); - - // 自分ã®çŸ³ãªã‚‰ã€Œã²ã£ãã‚Šè¿”ã›ã‚‹ã‹ã‚‚リストã€ã‚’「ã²ã£ãã‚Šè¿”ã›ã‚‹ãƒªã‚¹ãƒˆã€ã«å…¥ã‚Œã€èµ°æŸ»çµ‚了 - if (stone === color) { - stones = stones.concat(found); - break; - } - - i++; + [x, y] = nextPos(x, y); } }; - const [x, y] = this.transformPosToXy(pos); - - iterate(i => [x , y - i]); // 上 - iterate(i => [x + i, y - i]); // å³ä¸Š - iterate(i => [x + i, y ]); // å³ - iterate(i => [x + i, y + i]); // å³ä¸‹ - iterate(i => [x , y + i]); // 下 - iterate(i => [x - i, y + i]); // 左下 - iterate(i => [x - i, y ]); // å·¦ - iterate(i => [x - i, y - i]); // 左上 - - return stones; + return [].concat(...diffVectors.map(effectsInLine)); } /** diff --git a/tslint.json b/tslint.json index ae0df46b96e06eb06856427bc61f6eac13aef505..1adc0a2aeda2feeea7b84ba9f22ae28fceccf172 100644 --- a/tslint.json +++ b/tslint.json @@ -17,6 +17,7 @@ "no-empty":false, "ordered-imports": [false], "arrow-parens": false, + "array-type": false, "object-literal-shorthand": false, "object-literal-key-quotes": false, "triple-equals": [false],