Cache neighbours of squares
This commit is contained in:
parent
3b336a6a03
commit
d40cdb2d43
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "minesweeper",
|
||||
"version": "0.0.71",
|
||||
"version": "0.0.72",
|
||||
"description": "Just Minesweeper!",
|
||||
"author": "Felix W. Dekker",
|
||||
"browser": "dist/bundle.js",
|
||||
|
|
|
@ -259,7 +259,7 @@ export class Display {
|
|||
// True if square should be covered
|
||||
if (this.field!.lost || this.field!.won) return true;
|
||||
if (!this.mouseHoldChord || this.mouseSquare === null) return true;
|
||||
if (this.mouseSquare === it || this.mouseSquare.getNeighbors().indexOf(it) >= 0) return it.hasFlag;
|
||||
if (this.mouseSquare === it || this.mouseSquare.neighbors.indexOf(it) >= 0) return it.hasFlag;
|
||||
|
||||
return true;
|
||||
})
|
||||
|
|
|
@ -165,11 +165,11 @@ export class Field {
|
|||
target.hasMine = true;
|
||||
}
|
||||
|
||||
square.getNeighbors()
|
||||
square.neighbors
|
||||
.filter(it => it.hasMine)
|
||||
.forEach(it => {
|
||||
const target = this.squareList
|
||||
.find(it => !it.hasMine && it !== square && square.getNeighbors().indexOf(it) < 0);
|
||||
.find(it => !it.hasMine && it !== square && square.neighbors.indexOf(it) < 0);
|
||||
if (target === undefined) return;
|
||||
|
||||
this.history.addAction(new SwapMineAction(it, target));
|
||||
|
@ -242,6 +242,7 @@ export class Field {
|
|||
*/
|
||||
export class Square {
|
||||
private readonly field: Field;
|
||||
private _neighbors: Square[] | undefined = undefined;
|
||||
readonly x: number;
|
||||
readonly y: number;
|
||||
isCovered: boolean;
|
||||
|
@ -282,21 +283,23 @@ export class Square {
|
|||
|
||||
|
||||
/**
|
||||
* Returns the `Square`s that are adjacent to this square.
|
||||
*
|
||||
* @returns the `Square`s that are adjacent to this square
|
||||
* The `Square`s that are adjacent to this square.
|
||||
*/
|
||||
getNeighbors(): Square[] {
|
||||
return [
|
||||
this.field.getSquareOrElse(this.x - 1, this.y - 1),
|
||||
this.field.getSquareOrElse(this.x, this.y - 1),
|
||||
this.field.getSquareOrElse(this.x + 1, this.y - 1),
|
||||
this.field.getSquareOrElse(this.x - 1, this.y),
|
||||
this.field.getSquareOrElse(this.x + 1, this.y),
|
||||
this.field.getSquareOrElse(this.x - 1, this.y + 1),
|
||||
this.field.getSquareOrElse(this.x, this.y + 1),
|
||||
this.field.getSquareOrElse(this.x + 1, this.y + 1),
|
||||
].filter(it => it !== undefined);
|
||||
get neighbors(): Square[] {
|
||||
if (this._neighbors === undefined) {
|
||||
this._neighbors = [
|
||||
this.field.getSquareOrElse(this.x - 1, this.y - 1),
|
||||
this.field.getSquareOrElse(this.x, this.y - 1),
|
||||
this.field.getSquareOrElse(this.x + 1, this.y - 1),
|
||||
this.field.getSquareOrElse(this.x - 1, this.y),
|
||||
this.field.getSquareOrElse(this.x + 1, this.y),
|
||||
this.field.getSquareOrElse(this.x - 1, this.y + 1),
|
||||
this.field.getSquareOrElse(this.x, this.y + 1),
|
||||
this.field.getSquareOrElse(this.x + 1, this.y + 1),
|
||||
].filter(it => it !== undefined);
|
||||
}
|
||||
|
||||
return this._neighbors!;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -306,7 +309,7 @@ export class Square {
|
|||
* @returns the number of neighbors that satisfy the given property
|
||||
*/
|
||||
getNeighborCount(property: (neighbor: Square) => boolean): number {
|
||||
return this.getNeighbors().filter(property).length;
|
||||
return this.neighbors.filter(property).length;
|
||||
}
|
||||
|
||||
|
||||
|
@ -320,7 +323,7 @@ export class Square {
|
|||
if (this.isCovered || this.field.won || this.field.lost) return;
|
||||
if (this.getNeighborCount(it => it.hasFlag) !== this.getNeighborCount(it => it.hasMine)) return;
|
||||
|
||||
this.getNeighbors()
|
||||
this.neighbors
|
||||
.filter(it => it.isCovered && !it.hasFlag)
|
||||
.forEach(it => it.uncover());
|
||||
}
|
||||
|
@ -353,7 +356,7 @@ export class Square {
|
|||
this.field.onUncover(next); // Also moves mine on first click and swaps mines through field
|
||||
|
||||
if (!next.hasMine && next.getNeighborCount(it => it.hasMine || it.hasFlag) === 0)
|
||||
uncoverQueue.push(...next.getNeighbors().filter(it => it.isCovered));
|
||||
uncoverQueue.push(...next.neighbors.filter(it => it.isCovered));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ export class Solver {
|
|||
|
||||
const knowns = field.squareList
|
||||
.filter(it => !it.isCovered)
|
||||
.filter(it => it.getNeighborCount(it => it.isCovered && !it.hasFlag));
|
||||
.filter(it => it.getNeighborCount(it => it.isCovered && !it.hasFlag) > 0);
|
||||
const neighs = field.squareList.filter(it => it.isCovered && !it.hasFlag);
|
||||
|
||||
if (knowns.length === 0 || neighs.length === 0) return;
|
||||
|
@ -59,7 +59,7 @@ export class Solver {
|
|||
const matrix: number[][] = [];
|
||||
knowns.forEach(square => {
|
||||
const row = Array(neighs.length).fill(0);
|
||||
square.getNeighbors()
|
||||
square.neighbors
|
||||
.filter(it => it.isCovered && !it.hasFlag)
|
||||
.forEach(it => row[neighs.indexOf(it)] = 1);
|
||||
|
||||
|
|
Loading…
Reference in New Issue