Konane: simplify code, easier gameplay
authorBenjamin Auder <benjamin.auder@somewhere>
Wed, 24 Mar 2021 14:33:36 +0000 (15:33 +0100)
committerBenjamin Auder <benjamin.auder@somewhere>
Wed, 24 Mar 2021 14:33:36 +0000 (15:33 +0100)
client/src/translations/rules/Konane/en.pug
client/src/translations/rules/Konane/es.pug
client/src/translations/rules/Konane/fr.pug
client/src/variants/Konane.js

index 930f8c7..9384ac0 100644 (file)
@@ -24,18 +24,11 @@ p.
   on an empty square. The intermediate piece is thus removed.
   You may continue capturing, but only in the same direction,
   with the same stone.
   on an empty square. The intermediate piece is thus removed.
   You may continue capturing, but only in the same direction,
   with the same stone.
-  To stop a chain of captures (while more are available), play a move from the
-  current capturer until the location of the last captured stone:
-  g4 on this example.
 
 figure.diagram-container
 
 figure.diagram-container
-  .diagram.diag12
-    | fen:PpPpPpPp/pPpPpPpP/PpPpP2p/pPpPp1pP/PpP1Pp1p/pPpPpP1P/PpPpPpPp/pPpPpPpP:
-  .diagram.diag22
-    | fen:PpPpPp1p/pPpPpP1P/PpPpP1Pp/pPpPp1pP/PpP1Pp1p/pPpPpP1P/PpPpPpPp/pPpPpPpP g4,g7:
-  figcaption.
-    Before and after a first capture g8xg7.
-    The available continuations are indicated.
+  .diagram
+    | fen:PpPpPpPp/pPpPpPpP/PpPpP2p/pPpPp1pP/PpP1Pp1p/pPpPpP1P/PpPpPpPp/pPpPpPpP g4,g6:
+  figcaption Available captures from g8.
 
 p If a player has no possible capture, he loses.
 
 
 p If a player has no possible capture, he loses.
 
index ca17726..6d5ba5e 100644 (file)
@@ -24,18 +24,11 @@ p.
   en un cuadrado vacío justo detrás. Se quita así la pieza intermedia.
   Tienes derecho a seguir capturando, pero solo en el mismo
   dirección, con la misma piedra.
   en un cuadrado vacío justo detrás. Se quita así la pieza intermedia.
   Tienes derecho a seguir capturando, pero solo en el mismo
   dirección, con la misma piedra.
-  Para detener una cadena de capturas (mientras que otras son posibles),
-  hacer un movimiento de la captura actual a la ubicación de la última
-  pieza capturada: g4 en el ejemplo.
 
 figure.diagram-container
 
 figure.diagram-container
-  .diagram.diag12
-    | fen:PpPpPpPp/pPpPpPpP/PpPpP2p/pPpPp1pP/PpP1Pp1p/pPpPpP1P/PpPpPpPp/pPpPpPpP:
-  .diagram.diag22
-    | fen:PpPpPp1p/pPpPpP1P/PpPpP1Pp/pPpPp1pP/PpP1Pp1p/pPpPpP1P/PpPpPpPp/pPpPpPpP g4,g7:
-  figcaption.
-    Antes y después de una primera captura g8xg7.
-    Se indican las continuaciones disponibles.
+  .diagram
+    | fen:PpPpPpPp/pPpPpPpP/PpPpP2p/pPpPp1pP/PpP1Pp1p/pPpPpP1P/PpPpPpPp/pPpPpPpP g4,g6:
+  figcaption Capturas posibles desde g8.
 
 p Si un jugador no tiene más capturas disponibles, pierde.
 
 
 p Si un jugador no tiene más capturas disponibles, pierde.
 
index 7cdc286..8df21e9 100644 (file)
@@ -24,18 +24,11 @@ p.
   sur une case vide juste derrière. La pièce intermédiaire est ainsi retirée.
   Vous avez le droit de continuer de capturer, mais seulement dans la même
   direction, avec la même pierre.
   sur une case vide juste derrière. La pièce intermédiaire est ainsi retirée.
   Vous avez le droit de continuer de capturer, mais seulement dans la même
   direction, avec la même pierre.
-  Pour arrêter une chaîne de captures (alors que d'autres sont possibles),
-  jouez un coup depuis le capturant actuel vers l'emplacement de la dernière
-  pièce capturée : g4 sur l'exemple.
 
 figure.diagram-container
 
 figure.diagram-container
-  .diagram.diag12
-    | fen:PpPpPpPp/pPpPpPpP/PpPpP2p/pPpPp1pP/PpP1Pp1p/pPpPpP1P/PpPpPpPp/pPpPpPpP:
-  .diagram.diag22
-    | fen:PpPpPp1p/pPpPpP1P/PpPpP1Pp/pPpPp1pP/PpP1Pp1p/pPpPpP1P/PpPpPpPp/pPpPpPpP g4,g7:
-  figcaption.
-    Avant et après une première capture g8xg7.
-    Les continuations disponibles sont indiquées.
+  .diagram
+    | fen:PpPpPpPp/pPpPpPpP/PpPpP2p/pPpPp1pP/PpP1Pp1p/pPpPpP1P/PpPpPpPp/pPpPpPpP g4,g6:
+  figcaption Captures possibles depuis g8.
 
 p Si un joueur n'a plus de captures à disposition, il perd.
 
 
 p Si un joueur n'a plus de captures à disposition, il perd.
 
index 1daad7a..8031181 100644 (file)
@@ -49,10 +49,6 @@ export class KonaneRules extends ChessRules {
     );
   }
 
     );
   }
 
-  setOtherVariables(fen) {
-    this.captures = []; //reinit for each move
-  }
-
   hoverHighlight([x, y], side) {
     const c = this.turn;
     if (this.movesCount >= 2 || (!!side && side != c)) return false;
   hoverHighlight([x, y], side) {
     const c = this.turn;
     if (this.movesCount >= 2 || (!!side && side != c)) return false;
@@ -101,57 +97,31 @@ export class KonaneRules extends ChessRules {
       const mv = this.doClick([x, y]);
       return (!!mv ? [mv] : []);
     }
       const mv = this.doClick([x, y]);
       return (!!mv ? [mv] : []);
     }
-    const L = this.captures.length;
-    const c = (L > 0 ? this.captures[L-1] : null);
     const color = this.turn;
     const oppCol = V.GetOppCol(color);
     const color = this.turn;
     const oppCol = V.GetOppCol(color);
-    let step = null;
     let moves = [];
     let moves = [];
-    if (!!c) {
-      if (x != c.end.x || y != c.end.y) return [];
-      step = [(c.end.x - c.start.x) / 2, (c.end.y - c.start.y) / 2];
-      // Add move to adjacent empty square to mark "end of capture"
-      moves.push(
-        new Move({
-          appear: [],
-          vanish: [],
-          start: { x: x, y: y },
-          end: { x: x - step[0], y: y - step[1] }
-        })
-      );
-    }
-    // Examine captures from here
-    for (let s of (!!step ? [step] : V.steps[V.ROOK])) {
-      let [i, j] = [x + 2*s[0], y + 2*s[1]];
-      if (
-        !!c || //avoid redundant checks if continuation
-        (
-          V.OnBoard(i, j) &&
-          this.board[i][j] == V.EMPTY &&
-          this.board[i - s[0]][j - s[1]] != V.EMPTY &&
-          this.getColor(i - s[0], j - s[1]) == oppCol
-        )
-      ) {
-        let mv = new Move({
-          appear: [
-            new PiPo({ x: i, y: j, c: color, p: V.PAWN })
-          ],
-          vanish: [
-            new PiPo({ x: x, y: y, c: color, p: V.PAWN }),
-            new PiPo({ x: i - s[0], y: j - s[1], c: oppCol, p: V.PAWN })
-          ]
-        });
-        // Is there another capture possible then?
-        [i, j] = [i + 2*s[0], j + 2*s[1]];
+    for (let s of V.steps[V.ROOK]) {
+      let curmv = new Move({
+        appear: [ new PiPo({ x: -1, y: -1, c: color, p: V.PAWN }) ],
+        vanish: [ new PiPo({ x: x, y: y, c: color, p: V.PAWN }) ]
+      });
+      for (let mult = 2; ; mult += 2) {
+        let [i, j] = [x + mult * s[0], y + mult * s[1]];
         if (
           V.OnBoard(i, j) &&
           this.board[i][j] == V.EMPTY &&
           this.board[i - s[0]][j - s[1]] != V.EMPTY &&
           this.getColor(i - s[0], j - s[1]) == oppCol
         ) {
         if (
           V.OnBoard(i, j) &&
           this.board[i][j] == V.EMPTY &&
           this.board[i - s[0]][j - s[1]] != V.EMPTY &&
           this.getColor(i - s[0], j - s[1]) == oppCol
         ) {
-          mv.end.moreCapture = true;
+          curmv.vanish.push(
+            new PiPo({ x: i - s[0], y: j - s[1], c: oppCol, p: V.PAWN }));
+          let mv = JSON.parse(JSON.stringify(curmv));
+          mv.appear[0].x = i;
+          mv.appear[0].y = j;
+          mv.end = { x: i, y: j };
+          moves.push(mv);
         }
         }
-        moves.push(mv);
+        else break;
       }
     }
     return moves;
       }
     }
     return moves;
@@ -170,59 +140,14 @@ export class KonaneRules extends ChessRules {
     return (this.turn == "w" ? "0-1" : "1-0");
   }
 
     return (this.turn == "w" ? "0-1" : "1-0");
   }
 
-  play(move) {
-    V.PlayOnBoard(this.board, move);
-    if (!move.end.moreCapture) {
-      this.turn = V.GetOppCol(this.turn);
-      this.movesCount++;
-      this.captures = [];
-    }
-    else {
-      this.captures.push(
-        {
-          start: move.start,
-          end: { x: move.end.x, y: move.end.y }
-        }
-      );
-    }
-  }
-
-  undo(move) {
-    V.UndoOnBoard(this.board, move);
-    if (!move.end.moreCapture) {
-      this.turn = V.GetOppCol(this.turn);
-      this.movesCount--;
-    }
-    else this.captures.pop();
-  }
-
-  getComputerMove() {
-    const color = this.turn;
-    let mvArray = [];
-    let mv = null;
-    const undoAll = () => {
-      for (let i = mvArray.length - 1; i >= 0; i--) this.undo(mvArray[i]);
-    };
-    // Just play random moves (for now at least. TODO?)
-    while (this.turn == color) {
-      let moves = super.getAllValidMoves();
-      if (moves.length == 0) {
-        // Shouldn't happen, but...
-        undoAll();
-        return null;
-      }
-      mv = moves[randInt(moves.length)];
-      mvArray.push(mv);
-      this.play(mv);
-    }
-    undoAll();
-    return (mvArray.length > 1 ? mvArray : mvArray[0]);
+  static get SEARCH_DEPTH() {
+    return 4;
   }
 
   getNotation(move) {
     if (this.movesCount <= 1) return V.CoordsToSquare(move.start) + "X";
     if (move.vanish.length == 0) return "end";
   }
 
   getNotation(move) {
     if (this.movesCount <= 1) return V.CoordsToSquare(move.start) + "X";
     if (move.vanish.length == 0) return "end";
-    return V.CoordsToSquare(move.start) + "x" + V.CoordsToSquare(move.end);
+    return V.CoordsToSquare(move.start) + V.CoordsToSquare(move.end);
   }
 
 };
   }
 
 };