From 5188295933c6628a7f52473b8f61c93a0aaac179 Mon Sep 17 00:00:00 2001 From: Benjamin Auder Date: Thu, 27 Dec 2018 13:01:36 +0100 Subject: [PATCH] Fix MarseilleRules, remove debug traces --- public/javascripts/base_rules.js | 2 +- public/javascripts/components/game.js | 7 +- public/javascripts/playCompMove.js | 3 - public/javascripts/variants/Marseille.js | 124 +++++------------------ 4 files changed, 29 insertions(+), 107 deletions(-) diff --git a/public/javascripts/base_rules.js b/public/javascripts/base_rules.js index 9599fdbf..50766b07 100644 --- a/public/javascripts/base_rules.js +++ b/public/javascripts/base_rules.js @@ -186,7 +186,7 @@ class ChessRules // Argument is a move: const move = moveOrSquare; const [sx,sy,ex] = [move.start.x,move.start.y,move.end.x]; - if (this.getPiece(sx,sy) == V.PAWN && Math.abs(sx - ex) == 2) + if (move.appear[0].p == V.PAWN && Math.abs(sx - ex) == 2) { return { x: (sx + ex)/2, diff --git a/public/javascripts/components/game.js b/public/javascripts/components/game.js index 3f3b5556..4c369e4c 100644 --- a/public/javascripts/components/game.js +++ b/public/javascripts/components/game.js @@ -1312,7 +1312,7 @@ Vue.component('my-game', { this.endGame(this.mycolor=="w"?"0-1":"1-0"); }, newGame: function(mode, fenInit, color, oppId) { - const fen = "nrqkbrnb/pppppppp/8/8/8/8/PPPPPPPP/RKQBNRBN w 1111 -";//fenInit || VariantRules.GenRandInitFen(); + const fen = fenInit || VariantRules.GenRandInitFen(); console.log(fen); //DEBUG if (mode=="human" && !oppId) { @@ -1391,7 +1391,7 @@ Vue.component('my-game', { else if (mode == "computer") { this.compWorker.postMessage(["init",this.vr.getFen()]); - this.mycolor = "w";//(Math.random() < 0.5 ? 'w' : 'b'); + this.mycolor = (Math.random() < 0.5 ? 'w' : 'b'); if (this.mycolor != this.vr.turn) this.playComputerMove(); } @@ -1622,10 +1622,7 @@ Vue.component('my-game', { if (["human","computer","friend"].includes(this.mode)) this.updateStorage(); //after our moves and opponent moves if (this.mode == "computer" && this.vr.turn != this.mycolor && this.score == "*") - { - console.log(this.vr.moves.length + " " + this.vr.turn + " " + this.mycolor); this.playComputerMove(); - } }, undo: function() { // Navigate after game is over diff --git a/public/javascripts/playCompMove.js b/public/javascripts/playCompMove.js index f4aeaacb..fc69ce24 100644 --- a/public/javascripts/playCompMove.js +++ b/public/javascripts/playCompMove.js @@ -19,9 +19,6 @@ onmessage = function(e) self.vr.play(e.data[1]); break; case "askmove": - -console.log("IN playCompMove " + self.vr.moves.length + " " + self.vr.turn); - const compMove = self.vr.getComputerMove(); postMessage(compMove); break; diff --git a/public/javascripts/variants/Marseille.js b/public/javascripts/variants/Marseille.js index 0d228b0c..5f780952 100644 --- a/public/javascripts/variants/Marseille.js +++ b/public/javascripts/variants/Marseille.js @@ -43,15 +43,13 @@ class MarseilleRules extends ChessRules const parsedFen = V.ParseFen(fen); this.setFlags(parsedFen.flags); if (parsedFen.enpassant == "-") - this.epSquares = [ [undefined,undefined] ]; + this.epSquares = [ [undefined] ]; else { let res = []; const squares = parsedFen.enpassant.split(","); for (let sq of squares) res.push(V.SquareToCoords(sq)); - if (res.length == 1) - res.push(undefined); //always 2 slots in epSquares[i] this.epSquares = [ res ]; } this.scanKingsRooks(fen); @@ -153,32 +151,30 @@ class MarseilleRules extends ChessRules move.color = this.turn; } move.flags = JSON.stringify(this.aggregateFlags()); - let lastEpsq = this.epSquares[this.epSquares.length-1]; - const epSq = this.getEpSquare(move); - if (lastEpsq.length == 1) - lastEpsq.push(epSq); - else - { - // New turn - let newEpsqs = [epSq]; - if (this.startAtFirstMove && this.moves.length == 0) - newEpsqs.push(undefined); //at first move, to force length==2 (TODO) - this.epSquares.push(newEpsqs); - } V.PlayOnBoard(this.board, move); + const epSq = this.getEpSquare(move); if (this.startAtFirstMove && this.moves.length == 0) + { this.turn = "b"; + this.epSquares.push([epSq]); + } // Does this move give check on subturn 1? If yes, skip subturn 2 else if (this.subTurn==1 && this.underCheck(this.getOppCol(this.turn))) { - this.epSquares[this.epSquares.length-1].push(undefined); this.turn = this.getOppCol(this.turn); + this.epSquares.push([epSq]); move.checkOnSubturn1 = true; } else { if (this.subTurn == 2) + { this.turn = this.getOppCol(this.turn); + let lastEpsq = this.epSquares[this.epSquares.length-1]; + lastEpsq.push(epSq); + } + else + this.epSquares.push([epSq]); this.subTurn = 3 - this.subTurn; } this.moves.push(move); @@ -190,31 +186,28 @@ class MarseilleRules extends ChessRules undo(move) { this.disaggregateFlags(JSON.parse(move.flags)); - let lastEpsq = this.epSquares[this.epSquares.length-1]; - if (lastEpsq.length == 2) - { - if (!!move.checkOnSubturn1 || - (this.startAtFirstMove && this.moves.length == 1)) - { - this.epSquares.pop(); //remove real + artificial e.p. squares - } - else - lastEpsq.pop(); - } - else - this.epSquares.pop(); V.UndoOnBoard(this.board, move); if (this.startAtFirstMove && this.moves.length == 1) + { this.turn = "w"; + this.epSquares.pop(); + } else if (move.checkOnSubturn1) { this.turn = this.getOppCol(this.turn); this.subTurn = 1; + this.epSquares.pop(); } else { if (this.subTurn == 1) + { this.turn = this.getOppCol(this.turn); + let lastEpsq = this.epSquares[this.epSquares.length-1]; + lastEpsq.pop(); + } + else + this.epSquares.pop(); this.subTurn = 3 - this.subTurn; } this.moves.pop(); @@ -233,11 +226,10 @@ class MarseilleRules extends ChessRules const maxeval = V.INFINITY; const color = this.turn; const oppCol = this.getOppCol(this.turn); -//if (this.moves.length == 25) -// debugger; -console.log("turn before " + this.turn + " " + this.subTurn); + // Search best (half) move for opponent turn const getBestMoveEval = () => { + const turnBefore = this.turn + this.subTurn; let moves = this.getAllValidMoves(); if (moves.length == 0) { @@ -250,7 +242,8 @@ console.log("turn before " + this.turn + " " + this.subTurn); for (let m of moves) { this.play(m); - this.turn = color; //very artificial... + // Now turn is oppCol,2 if m doesn't give check + // Otherwise it's color,1. In both cases the next test makes sense if (!this.atLeastOneMove()) { const score = this.checkGameEnd(); @@ -259,26 +252,18 @@ console.log("turn before " + this.turn + " " + this.subTurn); else { // Found a mate - this.turn = oppCol; this.undo(m); return maxeval * (score == "1-0" ? 1 : -1); } } const evalPos = this.evalPosition(); res = (oppCol == "w" ? Math.max(res, evalPos) : Math.min(res, evalPos)); - this.turn = oppCol; this.undo(m); } return res; }; let moves11 = this.getAllValidMoves(); -console.log("turn after " + this.turn + " " + this.subTurn); - -if (this.moves.length == 25) - debugger; - - let doubleMoves = []; // Rank moves using a min-max at depth 2 for (let i=0; i { return (color=="w" ? 1 : -1) * (b.eval - a.eval); }); @@ -369,7 +298,6 @@ console.log("turn intermBIS " + this.turn + " " + this.subTurn); { candidates.push(i); } -console.log("turn END " + this.turn + " " + this.subTurn); const selected = doubleMoves[_.sample(candidates, 1)].moves; if (selected.length == 1) -- 2.44.0