+++ /dev/null
-import { ChessRules } from "@/base_rules";
-
-export class SquatterRules extends ChessRules {
-
- static get Lines() {
- return [
- [[1, 0], [1, 8]],
- [[7, 0], [7, 8]]
- ];
- }
-
- // Find possible captures by opponent on [x, y]
- findCaptures([x, y]) {
- const color = this.getColor(x, y);
- const forward = (color == 'w' ? -1 : 1);
- let moves = [];
- const steps = {
- // Rook and bishop: included in queen case
- p: { s: [[forward, -1], [forward, 1]], one: true },
- n: { s: V.steps[V.KNIGHT], one: true },
- q: { s: V.steps[V.ROOK].concat(V.steps[V.BISHOP]) },
- k: { s: V.steps[V.ROOK].concat(V.steps[V.BISHOP]), one: true }
- };
- const oppCol = V.GetOppCol(color);
- Object.keys(steps).forEach(piece => {
- outerLoop: for (let loop = 0; loop < steps[piece].s.length; loop++) {
- const step = steps[piece].s[loop];
- let i = x + step[0];
- let j = y + step[1];
- while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
- if (steps[piece].one) continue outerLoop;
- i += step[0];
- j += step[1];
- }
- if (
- V.OnBoard(i, j) &&
- this.board[i][j] != V.EMPTY &&
- this.getColor(i, j) == oppCol
- ) {
- const oppPiece = this.getPiece(i, j);
- if (
- oppPiece == piece ||
- (
- piece == V.QUEEN &&
- (
- (oppPiece == V.ROOK && step.some(e => e == 0)) ||
- (oppPiece == V.BISHOP && step.every(e => e != 0))
- )
- )
- )
- // Possible capture (do not care about promotions):
- moves.push(this.getBasicMove([i, j], [x, y]));
- }
- }
- });
- return moves;
- }
-
- someValid(moves, color) {
- // Stop at first valid move found:
- for (let m of moves) {
- this.play(m);
- const res = !this.underCheck(color);
- this.undo(m);
- if (res) return true;
- }
- return false;
- }
-
- getCurrentScore() {
- // Try both colors (to detect potential suicides)
- for (let c of ['w', 'b']) {
- const oppCol = V.GetOppCol(c);
- const goal = (c == 'w' ? 0 : 7);
- if (
- this.board[goal].some(
- (b,j) => {
- return (
- b[0] == c &&
- (
- !this.isAttacked([goal, j], oppCol) ||
- !this.someValid(this.findCaptures([goal, j]), oppCol)
- )
- );
- }
- )
- ) {
- return c == 'w' ? "1-0" : "0-1";
- }
- }
- return super.getCurrentScore();
- }
-
- static get SEARCH_DEPTH() {
- return 2;
- }
-
-};