import { shuffle } from "@/utils/alea";
export class CircularRules extends ChessRules {
+
static get HasCastle() {
return false;
}
this.pawnFlags = flags;
}
- static GenRandInitFen(randomness) {
- if (randomness == 0)
- return "8/8/pppppppp/rnbqkbnr/8/8/PPPPPPPP/RNBQKBNR w 0 1111111111111111";
+ static GenRandInitFen(options) {
+ if (options.randomness == 0) {
+ return "8/8/pppppppp/rnbqkbnr/8/8/PPPPPPPP/RNBQKBNR " +
+ "w 0 1111111111111111";
+ }
let pieces = { w: new Array(8), b: new Array(8) };
// Shuffle pieces on first and last rank
for (let c of ["w", "b"]) {
- if (c == 'b' && randomness == 1) {
+ if (c == 'b' && options.randomness == 1) {
pieces['b'] = pieces['w'];
break;
}
if (rem2 == positions[1] % 2) {
// Fix bishops (on different colors)
for (let i=2; i<8; i++) {
- if (positions[i] % 2 != rem2)
+ if (positions[i] % 2 != rem2) {
[positions[1], positions[i]] = [positions[i], positions[1]];
+ break;
+ }
}
}
for (let i = 0; i < 8; i++) pieces[c][positions[i]] = composition[i];
getSlideNJumpMoves([x, y], steps, oneStep) {
let moves = [];
+ // Don't add move twice when running on an infinite file:
+ let infiniteSteps = {};
outerLoop: for (let step of steps) {
+ if (!!infiniteSteps[(-step[0]) + "." + (-step[1])]) continue;
let i = V.ComputeX(x + step[0]);
let j = y + step[1];
while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
moves.push(this.getBasicMove([x, y], [i, j]));
- if (oneStep !== undefined) continue outerLoop;
+ if (oneStep) continue outerLoop;
i = V.ComputeX(i + step[0]);
j += step[1];
}
- if (V.OnBoard(i, j) && this.canTake([x, y], [i, j]))
- moves.push(this.getBasicMove([x, y], [i, j]));
+ if (V.OnBoard(i, j)) {
+ if (i == x && j == y)
+ // Looped back onto initial square
+ infiniteSteps[step[0] + "." + step[1]] = true;
+ else if (this.canTake([x, y], [i, j]))
+ moves.push(this.getBasicMove([x, y], [i, j]));
+ }
}
return moves;
}
static get SEARCH_DEPTH() {
return 2;
}
+
};