import { randInt } from "@/utils/alea";
export const VariantRules = class GrasshopperRules extends ChessRules {
+ static get HasEnpassant() {
+ return false;
+ }
+
static get GRASSHOPPER() {
return "g";
}
}
}
+ getPotentialPawnMoves([x, y]) {
+ const color = this.turn;
+ let moves = [];
+ const [sizeX, sizeY] = [V.size.x, V.size.y];
+ const shiftX = color == "w" ? -1 : 1;
+ const lastRank = color == "w" ? 0 : sizeX - 1;
+
+ const finalPieces =
+ x + shiftX == lastRank
+ ? [V.ROOK, V.KNIGHT, V.BISHOP, V.QUEEN, V.GRASSHOPPER]
+ : [V.PAWN];
+ if (this.board[x + shiftX][y] == V.EMPTY) {
+ // One square forward
+ for (let piece of finalPieces) {
+ moves.push(
+ this.getBasicMove([x, y], [x + shiftX, y], {
+ c: color,
+ p: piece
+ })
+ );
+ }
+ // No 2-squares jump
+ }
+ // Captures
+ for (let shiftY of [-1, 1]) {
+ if (
+ y + shiftY >= 0 &&
+ y + shiftY < sizeY &&
+ this.board[x + shiftX][y + shiftY] != V.EMPTY &&
+ this.canTake([x, y], [x + shiftX, y + shiftY])
+ ) {
+ for (let piece of finalPieces) {
+ moves.push(
+ this.getBasicMove([x, y], [x + shiftX, y + shiftY], {
+ c: color,
+ p: piece
+ })
+ );
+ }
+ }
+ }
+
+ return moves;
+ }
+
getPotentialGrasshopperMoves([x, y]) {
let moves = [];
// Look in every direction until an obstacle (to jump) is met
static get VALUES() {
return Object.assign(
- // TODO: grasshoppers power decline when less pieces on board...
- { g: 3 },
+ // TODO: grasshoppers power decline with less pieces on board...
+ { g: 2 },
ChessRules.VALUES
);
}
- static GenRandInitFen() {
- let pieces = { w: new Array(10), b: new Array(10) };
- for (let c of ["w", "b"]) {
- let positions = ArrayFun.range(8);
-
- // Get random squares for grasshoppers (unconstrained)
- let randIndex = randInt(8);
- const grasshopper1Pos = positions[randIndex];
- positions.splice(randIndex, 1);
- randIndex = randInt(7);
- const grasshopper2Pos = positions[randIndex];
- positions.splice(randIndex, 1);
-
- // Knights
- randIndex = randInt(6);
- let knight1Pos = positions[randIndex];
- positions.splice(randIndex, 1);
- randIndex = randInt(5);
- let knight2Pos = positions[randIndex];
- positions.splice(randIndex, 1);
-
- // Queen
- randIndex = randInt(4);
- let queenPos = positions[randIndex];
- positions.splice(randIndex, 1);
-
- let rook1Pos = positions[0];
- let kingPos = positions[1];
- let rook2Pos = positions[2];
+ static get SEARCH_DEPTH() {
+ return 2;
+ }
- pieces[c][rook1Pos] = "r";
- pieces[c][knight1Pos] = "n";
- pieces[c][grasshopper1Pos] = "g";
- pieces[c][queenPos] = "q";
- pieces[c][kingPos] = "k";
- pieces[c][grasshopper2Pos] = "g";
- pieces[c][knight2Pos] = "n";
- pieces[c][rook2Pos] = "r";
- }
- return (
- pieces["b"].join("") +
- "/pppppppp/8/8/8/8/PPPPPPPP/" +
- pieces["w"].join("").toUpperCase() +
- " w 0 1111 -"
- );
+ static GenRandInitFen(randomness) {
+ return ChessRules.GenRandInitFen(randomness)
+ .slice(0, -2)
+ .replace(
+ "/pppppppp/8/8/8/8/PPPPPPPP/",
+ "/gggggggg/pppppppp/8/8/PPPPPPPP/GGGGGGGG/"
+ );
}
};