}
if (sumElts != V.size.y) return false;
}
- if (kings['k'] + kings['l'] != 1 || kings['K'] + kings['L'] != 1)
+ if (kings['k'] + kings['l'] == 0 || kings['K'] + kings['L'] == 0)
return false;
return true;
}
// Initialize captured pieces' counts from FEN
this.captured = {
w: {
- [V.ROOK]: parseInt(fenParsed.captured[0]),
- [V.KNIGHT]: parseInt(fenParsed.captured[1]),
- [V.BISHOP]: parseInt(fenParsed.captured[2]),
- [V.QUEEN]: parseInt(fenParsed.captured[3]),
- [V.KING]: parseInt(fenParsed.captured[4]),
- [V.PAWN]: parseInt(fenParsed.captured[5]),
+ [V.PAWN]: parseInt(fenParsed.captured[0]),
+ [V.ROOK]: parseInt(fenParsed.captured[1]),
+ [V.KNIGHT]: parseInt(fenParsed.captured[2]),
+ [V.BISHOP]: parseInt(fenParsed.captured[3]),
+ [V.QUEEN]: parseInt(fenParsed.captured[4]),
+ [V.KING]: parseInt(fenParsed.captured[5])
},
b: {
- [V.ROOK]: parseInt(fenParsed.captured[6]),
- [V.KNIGHT]: parseInt(fenParsed.captured[7]),
- [V.BISHOP]: parseInt(fenParsed.captured[8]),
- [V.QUEEN]: parseInt(fenParsed.captured[9]),
- [V.KING]: parseInt(fenParsed.captured[10]),
- [V.PAWN]: parseInt(fenParsed.captured[11]),
+ [V.PAWN]: parseInt(fenParsed.captured[6]),
+ [V.ROOK]: parseInt(fenParsed.captured[7]),
+ [V.KNIGHT]: parseInt(fenParsed.captured[8]),
+ [V.BISHOP]: parseInt(fenParsed.captured[9]),
+ [V.QUEEN]: parseInt(fenParsed.captured[10]),
+ [V.KING]: parseInt(fenParsed.captured[11])
}
};
this.firstMove = [];
const end = (color == 'b' && p == V.PAWN ? 7 : 8);
for (let i = start; i < end; i++) {
for (let j = 0; j < V.size.y; j++) {
- if (this.board[i][j] == V.EMPTY || this.getColor(i, j) == 'a') {
+ if (
+ this.board[i][j] == V.EMPTY ||
+ this.getColor(i, j) == 'a' ||
+ this.getPiece(i, j) == V.INVISIBLE_QUEEN
+ ) {
let m = this.getBasicMove({ p: p, x: i, y: j});
m.start = { x: x, y: y };
moves.push(m);
const L = this.firstMove.length;
const fm = this.firstMove[L-1];
switch (fm.end.effect) {
- // case 0: a click is required (banana or bomb)
case "kingboo":
// Exchange position with any piece,
// except pawns if arriving on last rank.
// Helper for getBasicMove()
getRandomSquare([x, y], steps) {
+ const color = this.turn;
const validSteps = steps.filter(s => {
const [i, j] = [x + s[0], y + s[1]];
return (
V.OnBoard(i, j) &&
- (this.board[i][j] == V.EMPTY || this.getColor(i, j) == 'a')
+ (this.board[i][j] == V.EMPTY || this.getColor(i, j) != color)
);
});
if (validSteps.length == 0)
return moves;
}
+ static get VALUES() {
+ return Object.assign(
+ {},
+ ChessRules.VALUES,
+ {
+ s: 1,
+ u: 5,
+ o: 3,
+ c: 3,
+ t: 9,
+ l: 1000,
+ e: 0,
+ d: 0,
+ w: 0,
+ m: 0
+ }
+ );
+ }
+
+ static get SEARCH_DEPTH() {
+ return 1;
+ }
+
getComputerMove() {
- // Random mover:
const moves = this.getAllValidMoves();
- let move1 = moves[randInt(moves.length)];
+ // Split into "normal" and "random" moves:
+ // (Next splitting condition is OK because cannot take self object
+ // without a banana or bomb on the way).
+ const deterministicMoves = moves.filter(m => {
+ return m.vanish.every(a => a.c != 'a' || a.p == V.MUSHROOM);
+ });
+ const randomMoves = moves.filter(m => {
+ return m.vanish.some(a => a.c == 'a' && a.p != V.MUSHROOM);
+ });
+ if (Math.random() < deterministicMoves.length / randomMoves.length)
+ // Play a deterministic one: capture king or material if possible
+ return super.getComputerMove(deterministicMoves);
+ // Play a random effect move, at random:
+ let move1 = randomMoves[randInt(randomMoves.length)];
this.play(move1);
let move2 = undefined;
if (this.subTurn == 2) {
)
);
}
- if (
- move.appear.length == 1 &&
- move.vanish.length == 1 &&
- move.appear[0].c == 'a' &&
- move.vanish[0].c == 'a'
- ) {
- // Bonus replacement:
- return move.appear[0].p.toUpperCase() + "@" + finalSquare;
+ if (move.appear.length == 1 && move.vanish.length == 1) {
+ const moveStart = move.appear[0].p.toUpperCase() + "@";
+ if (move.appear[0].c == 'a' && move.vanish[0].c == 'a')
+ // Bonus replacement:
+ return moveStart + finalSquare;
+ if (
+ move.vanish[0].p == V.INVISIBLE_QUEEN &&
+ move.appear[0].x == move.vanish[0].x &&
+ move.appear[0].y == move.vanish[0].y
+ ) {
+ // Toadette takes invisible queen
+ return moveStart + "Q" + finalSquare;
+ }
}
if (
move.appear.length == 2 &&