X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FLosers.js;h=3ac46c2fdee410f1aea42a6940a8f5f6b6a87a06;hb=c3ff3a0c807d97c0311a06491318fe02440266db;hp=caebd2972dffe468005ed79ad1ca74d9241e0f4b;hpb=f35b9960e1c527fc400ebac85321bd4712459da3;p=vchess.git diff --git a/client/src/variants/Losers.js b/client/src/variants/Losers.js index caebd297..3ac46c2f 100644 --- a/client/src/variants/Losers.js +++ b/client/src/variants/Losers.js @@ -2,208 +2,77 @@ import { ChessRules } from "@/base_rules"; import { ArrayFun } from "@/utils/array"; import { randInt } from "@/utils/alea"; -export const VariantRules = class LosersRules extends ChessRules { - static get HasFlags() { - return false; - } - - getPotentialPawnMoves([x, y]) { - let moves = super.getPotentialPawnMoves([x, y]); - - // Complete with promotion(s) into king, if possible - const color = this.turn; - const shift = color == "w" ? -1 : 1; - const lastRank = color == "w" ? 0 : V.size.x - 1; - if (x + shift == lastRank) { - // Normal move - if (this.board[x + shift][y] == V.EMPTY) - moves.push( - this.getBasicMove([x, y], [x + shift, y], { c: color, p: V.KING }) - ); - // Captures - if ( - y > 0 && - this.canTake([x, y], [x + shift, y - 1]) && - this.board[x + shift][y - 1] != V.EMPTY - ) { - moves.push( - this.getBasicMove([x, y], [x + shift, y - 1], { c: color, p: V.KING }) - ); - } - if ( - y < V.size.y - 1 && - this.canTake([x, y], [x + shift, y + 1]) && - this.board[x + shift][y + 1] != V.EMPTY - ) { - moves.push( - this.getBasicMove([x, y], [x + shift, y + 1], { c: color, p: V.KING }) - ); - } - } - - return moves; - } - - getPotentialKingMoves(sq) { - // No castle: - return this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); +export class LosersRules extends ChessRules { + // Trim all non-capturing moves + static KeepCaptures(moves) { + return moves.filter(m => m.vanish.length == 2 && m.appear.length == 1); } // Stop at the first capture found (if any) atLeastOneCapture() { const color = this.turn; - const oppCol = V.GetOppCol(color); for (let i = 0; i < V.size.x; i++) { for (let j = 0; j < V.size.y; j++) { - if (this.board[i][j] != V.EMPTY && this.getColor(i, j) != oppCol) { - const moves = this.getPotentialMovesFrom([i, j]); - if (moves.length > 0) { - for (let k = 0; k < moves.length; k++) { - if ( - moves[k].vanish.length == 2 && - this.filterValid([moves[k]]).length > 0 - ) - return true; - } - } + if ( + this.board[i][j] != V.EMPTY && + this.getColor(i, j) == color && + this.getPotentialMovesFrom([i, j]).some(m => { + return ( + // Warning: discard castle moves + m.vanish.length == 2 && m.appear.length == 1 && + this.filterValid([m]).length == 1 + ); + }) + ) { + return true; } } } return false; } - // Trim all non-capturing moves - static KeepCaptures(moves) { - return moves.filter(m => { - return m.vanish.length == 2; - }); - } - getPossibleMovesFrom(sq) { let moves = this.filterValid(this.getPotentialMovesFrom(sq)); - // This is called from interface: we need to know if a capture is possible - if (this.atLeastOneCapture()) moves = V.KeepCaptures(moves); + const captureMoves = V.KeepCaptures(moves); + +console.log(this.atLeastOneCapture()); + + if (captureMoves.length > 0) return captureMoves; + if (this.atLeastOneCapture()) return []; return moves; } getAllValidMoves() { - let moves = super.getAllValidMoves(); - if ( - moves.some(m => { - return m.vanish.length == 2; - }) - ) - moves = V.KeepCaptures(moves); + const moves = super.getAllValidMoves(); + if (moves.some(m => m.vanish.length == 2 && m.appear.length == 1)) + return V.KeepCaptures(moves); return moves; } - underCheck() { - return false; //No notion of check - } - - getCheckSquares() { - return []; - } - - // No variables update because no royal king + no castling - updateVariables() {} - unupdateVariables() {} - getCurrentScore() { - if (this.atLeastOneMove()) - // game not over - return "*"; - - // No valid move: the side who cannot move wins + // If only my king remains, I win + const color = this.turn; + let onlyKing = true; + outerLoop: for (let i=0; i