X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FGrasshopper.js;h=fcc6bb101ee29efc961a841ed0ce3cb577452e77;hb=4313762da3237b04f204e121a20cab3ba7bb5dd2;hp=043c0fc4ecfa1b2626fc02dd6234969b62b239b8;hpb=a97bdbda4ecf83645d409b717e36828784d1450d;p=vchess.git diff --git a/client/src/variants/Grasshopper.js b/client/src/variants/Grasshopper.js index 043c0fc4..fcc6bb10 100644 --- a/client/src/variants/Grasshopper.js +++ b/client/src/variants/Grasshopper.js @@ -2,7 +2,20 @@ import { ChessRules } from "@/base_rules"; import { ArrayFun } from "@/utils/array"; import { randInt } from "@/utils/alea"; -export const VariantRules = class GrasshopperRules extends ChessRules { +export class GrasshopperRules extends ChessRules { + + static get HasEnpassant() { + return false; + } + + static get PawnSpecs() { + return Object.assign( + {}, + ChessRules.PawnSpecs, + { promotions: ChessRules.PawnSpecs.promotions.concat([V.GRASSHOPPER]) } + ); + } + static get GRASSHOPPER() { return "g"; } @@ -42,14 +55,14 @@ export const VariantRules = class GrasshopperRules extends ChessRules { return moves; } - isAttacked(sq, colors) { + isAttacked(sq, color) { return ( - super.isAttacked(sq, colors) || - this.isAttackedByGrasshopper(sq, colors) + super.isAttacked(sq, color) || + this.isAttackedByGrasshopper(sq, color) ); } - isAttackedByGrasshopper([x, y], colors) { + isAttackedByGrasshopper([x, y], color) { // Reversed process: is there an adjacent obstacle, // and a grasshopper next in the same line? for (const step of V.steps[V.ROOK].concat(V.steps[V.BISHOP])) { @@ -67,7 +80,7 @@ export const VariantRules = class GrasshopperRules extends ChessRules { if ( V.OnBoard(i, j) && this.getPiece(i, j) == V.GRASSHOPPER && - colors.includes(this.getColor(i, j)) + this.getColor(i, j) == color ) { return true; } @@ -78,56 +91,23 @@ 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]; + 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(options) { + return ChessRules.GenRandInitFen(options) + .slice(0, -2) + .replace( + "/pppppppp/8/8/8/8/PPPPPPPP/", + "/gggggggg/pppppppp/8/8/PPPPPPPP/GGGGGGGG/" + ); } + };