import { ChessRules, Move, PiPo } from "@/base_rules";
+import { randInt } from "@/utils/alea";
export class JanggiRules extends ChessRules {
return false;
}
- static get LoseOnRepetition() {
- return true;
- }
-
static get ELEPHANT() {
return "e";
}
}
getPpath(b) {
- return "Jiangqi/" + b;
+ return "Janggi/" + b;
}
static get size() {
// TODO: next "if" is mutually exclusive with the block above
if (this.movesCount <= 1) {
const firstRank = (this.movesCount == 0 ? 9 : 0);
- const [initFile, destFile] = (this.subTurn == 1 ? [1, 2] : [7, 6]);
+ const initDestFile = new Map([[1, 2], [7, 6]]);
// Only option is knight / elephant swap:
- if (x == firstRank && y == initFile) {
+ if (x == firstRank && !!initDestFile.get(y)) {
+ const destFile = initDestFile.get(y);
moves.push(
new Move({
appear: [
if (move.vanish.length > 0) super.postUndo(move);
}
+ getComputerMove() {
+ if (this.movesCount <= 1) {
+ // Special case: swap and pass at random
+ const moves1 = this.getAllValidMoves();
+ const m1 = moves1[randInt(moves1.length)];
+ this.play(m1);
+ if (m1.vanish.length == 0) {
+ this.undo(m1);
+ return m1;
+ }
+ const moves2 = this.getAllValidMoves();
+ const m2 = moves2[randInt(moves2.length)];
+ this.undo(m1);
+ return [m1, m2];
+ }
+ return super.getComputerMove();
+ }
+
getNotation(move) {
if (move.vanish.length == 0) return "pass";
if (move.appear.length == 2) return "S"; //"swap"