@logic-pad/core
Version:
52 lines (51 loc) • 1.92 kB
JavaScript
import BTModule, { BTTile, IntArray2D, createOneTileResult, getOppositeColor, } from '../data.js';
export default class ViewpointBTModule extends BTModule {
instr;
constructor(instr) {
super();
this.instr = instr;
}
checkGlobal(grid) {
const tile = grid.getTile(this.instr.x, this.instr.y);
if (tile === BTTile.Empty)
return createOneTileResult(grid, { x: this.instr.x, y: this.instr.y });
const tilesNeedCheck = IntArray2D.create(grid.width, grid.height);
const ratings = [];
let completed = 1;
let possible = 1;
const traverse = (dirX, dirY) => {
let connected = true;
let x = this.instr.x + dirX;
let y = this.instr.y + dirY;
while (grid.isInBound(x, y)) {
const curTile = grid.getTile(x, y);
if (connected) {
if (tile === curTile) {
completed += 1;
if (completed > this.instr.number)
return true;
}
else {
if (curTile === BTTile.Empty) {
tilesNeedCheck.set(x, y, 1);
ratings.push({ pos: { x, y }, score: 1 });
}
connected = false;
}
}
if (getOppositeColor(tile) === curTile ||
curTile === BTTile.NonExist)
break;
possible += 1;
x += dirX;
y += dirY;
}
return false;
};
if (traverse(-1, 0) || traverse(1, 0) || traverse(0, -1) || traverse(0, 1))
return false;
if (possible < this.instr.number)
return false;
return { tilesNeedCheck, ratings };
}
}