X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FGrasshopper.js;h=a991035bb8f8a8e4555d63d103e615d48bbcf6eb;hb=7ba4a5bc5b64e19a1e7f26aa232d5c50770d07ad;hp=043c0fc4ecfa1b2626fc02dd6234969b62b239b8;hpb=a97bdbda4ecf83645d409b717e36828784d1450d;p=vchess.git diff --git a/client/src/variants/Grasshopper.js b/client/src/variants/Grasshopper.js index 043c0fc4..a991035b 100644 --- a/client/src/variants/Grasshopper.js +++ b/client/src/variants/Grasshopper.js @@ -3,6 +3,10 @@ import { ArrayFun } from "@/utils/array"; import { randInt } from "@/utils/alea"; export const VariantRules = class GrasshopperRules extends ChessRules { + static get HasEnpassant() { + return false; + } + static get GRASSHOPPER() { return "g"; } @@ -24,6 +28,51 @@ export const VariantRules = class GrasshopperRules extends ChessRules { } } + 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 @@ -78,56 +127,18 @@ export const VariantRules = class GrasshopperRules extends ChessRules { 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]; - - 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) + .replace("w 0 1111 -", "w 0 1111") + .replace( + "/pppppppp/8/8/8/8/PPPPPPPP/", + "/gggggggg/pppppppp/8/8/PPPPPPPP/GGGGGGGG/" + ); } };