Cache neighbours of squares

This commit is contained in:
Florine W. Dekker 2020-08-03 18:57:12 +02:00
parent 3b336a6a03
commit d40cdb2d43
Signed by: FWDekker
GPG Key ID: B1B567AF58D6EE0F
4 changed files with 26 additions and 23 deletions

View File

@ -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",

View File

@ -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;
})

View File

@ -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));
}
}
}

View File

@ -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);