From efb20746c30ac26f258f9c5de6dfb70b91980de4 Mon Sep 17 00:00:00 2001 From: Benjamin Auder <benjamin.auder@somewhere> Date: Tue, 27 Nov 2018 11:50:49 +0100 Subject: [PATCH] Fix captures and some moves for Grand & Wildebeest --- public/javascripts/base_rules.js | 15 +++++++++------ public/javascripts/components/game.js | 7 ++++++- public/javascripts/variants/Grand.js | 1 - public/javascripts/variants/Wildebeest.js | 2 ++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/public/javascripts/base_rules.js b/public/javascripts/base_rules.js index 26c74477..42775dab 100644 --- a/public/javascripts/base_rules.js +++ b/public/javascripts/base_rules.js @@ -284,7 +284,7 @@ class ChessRules i += step[0]; j += step[1]; } - if (i>=0 && i<8 && j>=0 && j<8 && this.canTake([x,y], [i,j])) + if (i>=0 && i<sizeX && j>=0 && j<sizeY && this.canTake([x,y], [i,j])) moves.push(this.getBasicMove([x,y], [i,j])); } return moves; @@ -547,14 +547,15 @@ class ChessRules // Is square x,y attacked by pawns of color c ? isAttackedByPawn([x,y], colors) { + const [sizeX,sizeY] = VariantRules.size; for (let c of colors) { let pawnShift = (c=="w" ? 1 : -1); - if (x+pawnShift>=0 && x+pawnShift<8) + if (x+pawnShift>=0 && x+pawnShift<sizeX) { for (let i of [-1,1]) { - if (y+i>=0 && y+i<8 && this.getPiece(x+pawnShift,y+i)==VariantRules.PAWN + if (y+i>=0 && y+i<sizeY && this.getPiece(x+pawnShift,y+i)==VariantRules.PAWN && this.getColor(x+pawnShift,y+i)==c) { return true; @@ -605,16 +606,18 @@ class ChessRules // Generic method for non-pawn pieces ("sliding or jumping"): is x,y attacked by piece != color ? isAttackedBySlideNJump([x,y], colors, piece, steps, oneStep) { + const [sizeX,sizeY] = VariantRules.size; for (let step of steps) { let rx = x+step[0], ry = y+step[1]; - while (rx>=0 && rx<8 && ry>=0 && ry<8 && this.board[rx][ry] == VariantRules.EMPTY - && !oneStep) + while (rx>=0 && rx<sizeX && ry>=0 && ry<sizeY + && this.board[rx][ry] == VariantRules.EMPTY && !oneStep) { rx += step[0]; ry += step[1]; } - if (rx>=0 && rx<8 && ry>=0 && ry<8 && this.board[rx][ry] != VariantRules.EMPTY + if (rx>=0 && rx<sizeX && ry>=0 && ry<sizeY + && this.board[rx][ry] != VariantRules.EMPTY && this.getPiece(rx,ry) == piece && colors.includes(this.getColor(rx,ry))) { return true; diff --git a/public/javascripts/components/game.js b/public/javascripts/components/game.js index aaef522b..86f25210 100644 --- a/public/javascripts/components/game.js +++ b/public/javascripts/components/game.js @@ -17,6 +17,7 @@ Vue.component('my-game', { incheck: [], pgnTxt: "", expert: document.cookie.length>0 ? document.cookie.substr(-1)=="1" : false, + gameId: "", //used to limit computer moves' time }; }, render(h) { @@ -585,7 +586,6 @@ Vue.component('my-game', { this.newGame("computer"); }, newGame: function(mode, fenInit, color, oppId, moves, continuation) { - //const fen = "1n2T1n0/p2pO2p/1s1k1s2/8/3S2p1/2U2cO1/P3PuPP/3K1BR1 0100"; const fen = fenInit || VariantRules.GenRandInitFen(); console.log(fen); //DEBUG this.score = "*"; @@ -614,6 +614,8 @@ Vue.component('my-game', { } return; } + // random enough (TODO: function) + this.gameId = (Date.now().toString(36) + Math.random().toString(36).substr(2, 7)).toUpperCase(); this.vr = new VariantRules(fen, moves || []); this.pgnTxt = ""; //redundant with this.score = "*", but cleaner this.mode = mode; @@ -654,8 +656,11 @@ Vue.component('my-game', { playComputerMove: function() { const timeStart = Date.now(); const nbMoves = this.vr.moves.length; //using played moves to know if search finished + const gameId = this.gameId; //to know if game was reset before timer end setTimeout( () => { + if (gameId != this.gameId) + return; //game stopped const L = this.vr.moves.length; if (nbMoves == L || !this.vr.moves[L-1].notation) //move search didn't finish this.vr.shouldReturn = true; diff --git a/public/javascripts/variants/Grand.js b/public/javascripts/variants/Grand.js index db0543fc..8cdf6d7d 100644 --- a/public/javascripts/variants/Grand.js +++ b/public/javascripts/variants/Grand.js @@ -191,7 +191,6 @@ class GrandRules extends ChessRules if (move.vanish.length==2 && move.appear.length==1 && move.vanish[1].p != VariantRules.PAWN) { - // Capture: update this.captures this.captures[move.vanish[1].c][move.vanish[1].p] = Math.max(0, this.captures[move.vanish[1].c][move.vanish[1].p]-1); } diff --git a/public/javascripts/variants/Wildebeest.js b/public/javascripts/variants/Wildebeest.js index 2ecc01be..f198eeb0 100644 --- a/public/javascripts/variants/Wildebeest.js +++ b/public/javascripts/variants/Wildebeest.js @@ -165,6 +165,8 @@ class WildebeestRules extends ChessRules V.steps[V.KNIGHT].concat(V.steps[V.CAMEL])); } + // TODO: stalemate is a win (?!) + static get VALUES() { return Object.assign( ChessRules.VALUES, -- 2.44.0