From: Benjamin Auder Date: Mon, 26 Nov 2018 11:39:13 +0000 (+0100) Subject: SPeed-up checkmate and king capture for Magnetic chess X-Git-Url: https://git.auder.net/doc/html/assets/current/%7B%7B%20targetUrl%20%7D%7D?a=commitdiff_plain;h=9e42b4dd8a70b9593cc44ab181b4df32032ca250;p=vchess.git SPeed-up checkmate and king capture for Magnetic chess --- diff --git a/public/javascripts/base_rules.js b/public/javascripts/base_rules.js index 85689369..9cfab5ae 100644 --- a/public/javascripts/base_rules.js +++ b/public/javascripts/base_rules.js @@ -785,17 +785,28 @@ class ChessRules }; } + static get INFINITY() { + return 9999; //"checkmate" (unreachable eval) + } + + static get THRESHOLD_MATE() { + // At this value or above, the game is over + return VariantRules.INFINITY; + } + // Assumption: at least one legal move - getComputerMove() + getComputerMove(moves1) //moves1 might be precomputed (Magnetic chess) { + const maxeval = VariantRules.INFINITY; const color = this.turn; - let moves1 = this.getAllValidMoves(); + if (!moves1) + moves1 = this.getAllValidMoves(); // Rank moves using a min-max at depth 2 for (let i=0; i { return (color=="w" ? 1 : -1) * (b.eval - a.eval); }); - // TODO: show current analyzed move for depth 3, allow stopping eval (return moves1[0]) - for (let i=0; i { return (color=="w" ? 1 : -1) * (b.eval - a.eval); }); } - moves1.sort( (a,b) => { return (color=="w" ? 1 : -1) * (b.eval - a.eval); }); let candidates = [0]; //indices of candidates moves for (let j=1; j { return [this.getNotation(m), m.eval]; })); return moves1[_.sample(candidates, 1)]; } alphabeta(depth, alpha, beta) { + const maxeval = VariantRules.INFINITY; const color = this.turn; if (!this.atLeastOneMove()) { switch (this.checkGameEnd()) { case "1/2": return 0; - default: return color=="w" ? -1000 : 1000; + default: return color=="w" ? -maxeval : maxeval; } } if (depth == 0) return this.evalPosition(); const moves = this.getAllValidMoves(); - let v = color=="w" ? -1000 : 1000; + let v = color=="w" ? -maxeval : maxeval; if (color == "w") { for (let i=0; i= VariantRules.THRESHOLD_MATE); + this.undo(moves1[i]); + if (finish) + return moves1[i]; + } + return super.getComputerMove(moves1); + } }