Fix captures and some moves for Grand & Wildebeest
authorBenjamin Auder <benjamin.auder@somewhere>
Tue, 27 Nov 2018 10:50:49 +0000 (11:50 +0100)
committerBenjamin Auder <benjamin.auder@somewhere>
Tue, 27 Nov 2018 10:50:49 +0000 (11:50 +0100)
public/javascripts/base_rules.js
public/javascripts/components/game.js
public/javascripts/variants/Grand.js
public/javascripts/variants/Wildebeest.js

index 26c7447..42775da 100644 (file)
@@ -284,7 +284,7 @@ class ChessRules
                                i += step[0];
                                j += step[1];
                        }
                                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;
                                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)
        {
        // 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);
                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])
                                {
                        {
                                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;
                                                && 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)
        {
        // 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];
                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];
                        }
                        {
                                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;
                                && this.getPiece(rx,ry) == piece && colors.includes(this.getColor(rx,ry)))
                        {
                                return true;
index aaef522..86f2521 100644 (file)
@@ -17,6 +17,7 @@ Vue.component('my-game', {
                        incheck: [],
                        pgnTxt: "",
                        expert: document.cookie.length>0 ? document.cookie.substr(-1)=="1" : false,
                        incheck: [],
                        pgnTxt: "",
                        expert: document.cookie.length>0 ? document.cookie.substr(-1)=="1" : false,
+                       gameId: "", //used to limit computer moves' time
                };
        },
        render(h) {
                };
        },
        render(h) {
@@ -585,7 +586,6 @@ Vue.component('my-game', {
                        this.newGame("computer");
                },
                newGame: function(mode, fenInit, color, oppId, moves, continuation) {
                        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 = "*";
                        const fen = fenInit || VariantRules.GenRandInitFen();
                        console.log(fen); //DEBUG
                        this.score = "*";
@@ -614,6 +614,8 @@ Vue.component('my-game', {
                                }
                                return;
                        }
                                }
                                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;
                        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
                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(
                                () => {
                        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;
                                        const L = this.vr.moves.length;
                                        if (nbMoves == L || !this.vr.moves[L-1].notation) //move search didn't finish
                                                this.vr.shouldReturn = true;
index db0543f..8cdf6d7 100644 (file)
@@ -191,7 +191,6 @@ class GrandRules extends ChessRules
                if (move.vanish.length==2 && move.appear.length==1
                        && move.vanish[1].p != VariantRules.PAWN)
                {
                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);
                }
                        this.captures[move.vanish[1].c][move.vanish[1].p] =
                                Math.max(0, this.captures[move.vanish[1].c][move.vanish[1].p]-1);
                }
index 2ecc01b..f198eeb 100644 (file)
@@ -165,6 +165,8 @@ class WildebeestRules extends ChessRules
                        V.steps[V.KNIGHT].concat(V.steps[V.CAMEL]));
        }
 
                        V.steps[V.KNIGHT].concat(V.steps[V.CAMEL]));
        }
 
+       // TODO: stalemate is a win (?!)
+
        static get VALUES() {
                return Object.assign(
                        ChessRules.VALUES,
        static get VALUES() {
                return Object.assign(
                        ChessRules.VALUES,