X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FAmbiguous.js;h=17e5283a906257d27be4b92a63e5f245248561f3;hb=40bd6d5477933cb1bcee82eb4462911856af164e;hp=dea19d55c6cd500d744cbda43b76de6c8422d0af;hpb=5b18515f0b7dbfab8a2770d9b0fc7aace09267dc;p=vchess.git diff --git a/client/src/variants/Ambiguous.js b/client/src/variants/Ambiguous.js index dea19d55..17e5283a 100644 --- a/client/src/variants/Ambiguous.js +++ b/client/src/variants/Ambiguous.js @@ -1,4 +1,6 @@ import { ChessRules } from "@/base_rules"; +import { randInt, shuffle } from "@/utils/alea"; +import { ArrayFun } from "@/utils/array"; export class AmbiguousRules extends ChessRules { static get HasFlags() { @@ -18,8 +20,21 @@ export class AmbiguousRules extends ChessRules { const oppCol = V.GetOppCol(color); if (this.subTurn == 2) { // Just play a normal move (which in fact only indicate a square) + let movesHash = {}; return ( super.getPotentialMovesFrom([x, y]) + .filter(m => { + // Filter promotions: keep only one, since no choice now. + if (m.appear[0].p != m.vanish[0].p) { + const hash = V.CoordsToSquare(m.start) + V.CoordsToSquare(m.end); + if (!movesHash[hash]) { + movesHash[hash] = true; + return true; + } + return false; + } + return true; + }) .map(m => { if (m.vanish.length == 1) m.appear[0].p = V.GOAL; else m.appear[0].p = V.TARGET_CODE[m.vanish[1].p]; @@ -118,11 +133,17 @@ export class AmbiguousRules extends ChessRules { let potentialMoves = []; for (let i = 0; i < V.size.x; i++) { for (let j = 0; j < V.size.y; j++) { + const colIJ = this.getColor(i, j); if ( this.board[i][j] != V.EMPTY && - this.getColor(i, j) == color && - this.board[i][j][1] != V.GOAL && - !(Object.keys(V.TARGET_DECODE).includes(this.board[i][j][1])) + ( + (this.subTurn == 2 && colIJ == color) || + ( + this.subTurn == 1 && colIJ != color && + this.board[i][j][1] != V.GOAL && + !(Object.keys(V.TARGET_DECODE).includes(this.board[i][j][1])) + ) + ) ) { Array.prototype.push.apply( potentialMoves, @@ -243,6 +264,23 @@ export class AmbiguousRules extends ChessRules { ); } + getComputerMove() { + let moves = this.getAllValidMoves(); + if (moves.length == 0) return null; + // Random mover for now + const color = this.turn; + const m1 = moves[randInt(moves.length)]; + this.play(m1); + let m = undefined; + if (this.turn != color) m = m1; + else { + const moves2 = this.getAllValidMoves(); + m = [m1, moves2[randInt(moves2.length)]]; + } + this.undo(m1); + return m; + } + getNotation(move) { if (this.subTurn == 2) return "T:" + V.CoordsToSquare(move.end); // Remove and re-add target to get a good notation: