X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=public%2Fjavascripts%2Fvariants%2FCheckered.js;fp=public%2Fjavascripts%2Fvariants%2FCheckered.js;h=6ed73a8bf8131ccbbe8592d87ef3fb23e21653b2;hb=46302e643947a66a5593a8eb1140d314effcea95;hp=a74143b9c21e89424d96318981d4ef1d71fc8053;hpb=818ede16c09c2f5650d7a6b7b5ea42d6dd1a0c30;p=vchess.git diff --git a/public/javascripts/variants/Checkered.js b/public/javascripts/variants/Checkered.js index a74143b9..6ed73a8b 100644 --- a/public/javascripts/variants/Checkered.js +++ b/public/javascripts/variants/Checkered.js @@ -50,87 +50,58 @@ class CheckeredRules extends ChessRules return flags; } - // can color1 take color2? - canTake(color1, color2) + canTake([x1,y1], [x2,y2]) { + const color1 = this.getColor(x1,y1); + const color2 = this.getColor(x2,y2); // Checkered aren't captured return color1 != color2 && color2 != 'c' && (color1 != 'c' || color2 != this.turn); } - // Build regular move(s) from its initial and destination squares; tr: transformation - getBasicMove(sx, sy, ex, ey, tr) + addCaptures([sx,sy], [ex,ey], moves) { - if (this.board[ex][ey] == VariantRules.EMPTY) + const piece = this.getPiece(sx,sy); + if (piece != VariantRules.KING) { - // No capture, standard move construction - return [super.getBasicMove(sx,sy,ex,ey,tr)]; + moves.push(this.getBasicMove([sx,sy], [ex,ey], {c:'c',p:piece})); + const takePiece = this.getPiece(ex,ey); + if (takePiece != piece) + moves.push(this.getBasicMove([sx,sy], [ex,ey], {c:'c',p:takePiece})); } - let moves = []; //captures: generally 2 choices, unless 'tr' is specified or piece==king - const startPiece = this.getPiece(sx,sy); - const endPiece = this.getPiece(ex,ey); - const startColor = this.getColor(sx,sy); - const endColor = this.getColor(ex,ey); - for (let piece of !!tr ? [tr] : - (startPiece==VariantRules.KING ? VariantRules.KING : _.uniq([startPiece,endPiece]))) - { - var mv = new Move({ - appear: [ - new PiPo({ - x: ex, - y: ey, - c: startPiece==VariantRules.KING ? startColor : 'c', - p: piece - }) - ], - vanish: [ - new PiPo({ - x: sx, - y: sy, - c: startColor, - p: startPiece - }), - new PiPo({ - x: ex, - y: ey, - c: endColor, - p: endPiece - }) - ] - }); - moves.push(mv); - } - return moves; + else + moves.push(this.getBasicMove([sx,sy], [ex,ey])); } // Generic method to find possible moves of non-pawn pieces ("sliding or jumping") - getSlideNJumpMoves(x, y, color, steps, oneStep) + getSlideNJumpMoves([x,y], steps, oneStep) { - var moves = []; - let [sizeX,sizeY] = VariantRules.size; + const color = this.getColor(x,y); + let moves = []; + const [sizeX,sizeY] = VariantRules.size; outerLoop: for (var loop=0; loop=0 && i=0 && j=0 && i=0 && j=0 && i<8 && j>=0 && j<8 && this.canTake(color, this.getColor(i,j))) - moves = moves.concat(this.getBasicMove(x, y, i, j)); + if (i>=0 && i<8 && j>=0 && j<8 && this.canTake([x,y], [i,j])) + this.addCaptures([x,y], [i,j], moves); } return moves; } // What are the pawn moves from square x,y considering color "color" ? - getPotentialPawnMoves(x, y, color) + getPotentialPawnMoves([x,y]) { + const color = this.getColor(x,y); var moves = []; var V = VariantRules; let [sizeX,sizeY] = VariantRules.size; @@ -144,24 +115,18 @@ class CheckeredRules extends ChessRules // Normal moves if (this.board[x+shift][y] == V.EMPTY) { - moves.push(this.getBasicMove(x, y, x+shift, y)[0]); + moves.push(this.getBasicMove([x,y], [x+shift,y])); if (x==startRank && this.board[x+2*shift][y] == V.EMPTY && this.flags[1][c][y]) { // Two squares jump - moves.push(this.getBasicMove(x, y, x+2*shift, y)[0]); + moves.push(this.getBasicMove([x,y], [x+2*shift,y])); } } // Captures - if (y>0 && this.canTake(this.getColor(x,y), this.getColor(x+shift,y-1)) - && this.board[x+shift][y-1] != V.EMPTY) - { - moves = moves.concat(this.getBasicMove(x, y, x+shift, y-1)); - } - if (y0 && this.canTake([x,y], [x+shift,y-1]) && this.board[x+shift][y-1] != V.EMPTY) + this.addCaptures([x,y], [x+shift,y-1], moves); + if (y { // Normal move if (this.board[x+shift][y] == V.EMPTY) - moves.push(this.getBasicMove(x, y, x+shift, y, p)[0]); + moves.push(this.getBasicMove([x,y], [x+shift,y], {c:color,p:p})); // Captures - if (y>0 && this.canTake(this.getColor(x,y), this.getColor(x+shift,y-1)) - && this.board[x+shift][y-1] != V.EMPTY) - { - moves = moves.concat(this.getBasicMove(x, y, x+shift, y-1, p)); - } - if (y0 && 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:'c',p:p})); + if (y { const L = this.moves.length; if (L > 0 && this.oppositeMoves(this.moves[L-1], m)) return false; - return !this.underCheck(m, color); + return !this.underCheck(m); }); } - isAttackedByPawn([x,y], c) - { - const color = (c=="c" ? this.turn : c); - let pawnShift = (color=="w" ? 1 : -1); - if (x+pawnShift>=0 && x+pawnShift<8) - { - for (let i of [-1,1]) - { - if (y+i>=0 && y+i<8 && this.getPiece(x+pawnShift,y+i)==VariantRules.PAWN - && this.getColor(x+pawnShift,y+i)==c) - { - return true; - } - } - } - return false; - } - - underCheck(move, c) + isAttackedByPawn([x,y], colors) + { + for (let c of colors) + { + const color = (c=="c" ? this.turn : c); + let pawnShift = (color=="w" ? 1 : -1); + if (x+pawnShift>=0 && x+pawnShift<8) + { + for (let i of [-1,1]) + { + if (y+i>=0 && y+i<8 && this.getPiece(x+pawnShift,y+i)==VariantRules.PAWN + && this.getColor(x+pawnShift,y+i)==c) + { + return true; + } + } + } + } + return false; + } + + underCheck(move) { - const color = c == 'c' ? this.turn : c; + const color = this.turn; this.play(move); - let res = this.isAttacked(this.kingPos[color], this.getOppCol(color)) - || this.isAttacked(this.kingPos[color], 'c'); //TODO: quite inefficient... + let res = this.isAttacked(this.kingPos[color], [this.getOppCol(color),'c']); this.undo(move); return res; } - getCheckSquares(move, c) + getCheckSquares(move) { this.play(move); + const color = this.turn; this.moves.push(move); //artifically change turn, for checkered pawns (TODO) - const kingAttacked = this.isAttacked(this.kingPos[c], this.getOppCol(c)) - || this.isAttacked(this.kingPos[c], 'c'); + const kingAttacked = this.isAttacked(this.kingPos[color], [this.getOppCol(color),'c']); let res = kingAttacked - ? [ JSON.parse(JSON.stringify(this.kingPos[c])) ] //need to duplicate! + ? [ JSON.parse(JSON.stringify(this.kingPos[color])) ] //need to duplicate! : [ ]; this.moves.pop(); this.undo(move); @@ -387,8 +346,9 @@ class CheckeredRules extends ChessRules this.flags[1][move.start.x==6 ? "w" : "b"][move.start.y] = false; } - checkGameEnd(color) + checkGameEnd() { + const color = this.turn; if (!this.isAttacked(this.kingPos[color], this.getOppCol(color)) && !this.isAttacked(this.kingPos[color], 'c')) {