perf: improve mines lookup
This commit is contained in:
parent
81f310e7cc
commit
1bd3135dac
1 changed files with 11 additions and 28 deletions
|
|
@ -82,7 +82,8 @@ const Minesweeper = function(appId, version, hooks = undefined) {
|
||||||
}
|
}
|
||||||
storageService.saveToLocal('setting', setting)
|
storageService.saveToLocal('setting', setting)
|
||||||
let flagsCount = setting.mines
|
let flagsCount = setting.mines
|
||||||
let minesArray = []
|
// Mine positions stored as a Set of numeric keys (row * cols + col) for O(1) lookup
|
||||||
|
let mines = new Set()
|
||||||
|
|
||||||
this.initialize = function() {
|
this.initialize = function() {
|
||||||
const headingElement = document.createElement('h1')
|
const headingElement = document.createElement('h1')
|
||||||
|
|
@ -188,7 +189,7 @@ const Minesweeper = function(appId, version, hooks = undefined) {
|
||||||
grid.innerHTML = ''
|
grid.innerHTML = ''
|
||||||
grid.oncontextmenu = () => false
|
grid.oncontextmenu = () => false
|
||||||
flagsCount = setting.mines
|
flagsCount = setting.mines
|
||||||
minesArray = []
|
mines.clear()
|
||||||
|
|
||||||
for (let i = 0; i < setting.rows; i++) {
|
for (let i = 0; i < setting.rows; i++) {
|
||||||
let row = grid.insertRow(i)
|
let row = grid.insertRow(i)
|
||||||
|
|
@ -447,7 +448,7 @@ const Minesweeper = function(appId, version, hooks = undefined) {
|
||||||
if (isMine(cell)) {
|
if (isMine(cell)) {
|
||||||
transferMine()
|
transferMine()
|
||||||
} else {
|
} else {
|
||||||
minesArray.push([row, col])
|
mines.add(mineKey(row, col))
|
||||||
}
|
}
|
||||||
if (TEST_MODE){
|
if (TEST_MODE){
|
||||||
cell.innerHTML = 'X'
|
cell.innerHTML = 'X'
|
||||||
|
|
@ -536,30 +537,12 @@ const Minesweeper = function(appId, version, hooks = undefined) {
|
||||||
return getStatus(cell) == 'flagged'
|
return getStatus(cell) == 'flagged'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function mineKey(row, col) {
|
||||||
|
return row * setting.cols + col
|
||||||
|
}
|
||||||
|
|
||||||
function isMine(cell) {
|
function isMine(cell) {
|
||||||
return getIndex(minesArray, cell) > -1
|
return mines.has(mineKey(getRow(cell), getCol(cell)))
|
||||||
}
|
|
||||||
|
|
||||||
function removeItem(arr, cell) {
|
|
||||||
const index = getIndex(arr, cell)
|
|
||||||
if (index > -1) {
|
|
||||||
arr.splice(index, 1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getIndex(arr, cell) {
|
|
||||||
const row = cell.parentNode.rowIndex
|
|
||||||
const col = cell.cellIndex
|
|
||||||
let index = -1
|
|
||||||
for (let i = 0; i < arr.length; i++) {
|
|
||||||
let rowCol = arr[i]
|
|
||||||
if (rowCol[0] === row && rowCol[1] === col) {
|
|
||||||
index = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return index
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkLevelCompletion() {
|
function checkLevelCompletion() {
|
||||||
|
|
@ -721,7 +704,7 @@ const Minesweeper = function(appId, version, hooks = undefined) {
|
||||||
return
|
return
|
||||||
} else if (isMine(cell) && firstClick) {
|
} else if (isMine(cell) && firstClick) {
|
||||||
// cell.setAttribute('data-mine', 'false');
|
// cell.setAttribute('data-mine', 'false');
|
||||||
removeItem(minesArray, cell)
|
mines.delete(mineKey(getRow(cell), getCol(cell)))
|
||||||
transferMine(cell)
|
transferMine(cell)
|
||||||
if (TEST_MODE) printMines()
|
if (TEST_MODE) printMines()
|
||||||
}
|
}
|
||||||
|
|
@ -749,7 +732,7 @@ const Minesweeper = function(appId, version, hooks = undefined) {
|
||||||
if (isMine(transferMineToCell) || isNeighbor(cell, transferMineToCell)) {
|
if (isMine(transferMineToCell) || isNeighbor(cell, transferMineToCell)) {
|
||||||
continue
|
continue
|
||||||
} else {
|
} else {
|
||||||
minesArray.push([row, col])
|
mines.add(mineKey(row, col))
|
||||||
if (TEST_MODE){
|
if (TEST_MODE){
|
||||||
transferMineToCell.innerHTML = 'X'
|
transferMineToCell.innerHTML = 'X'
|
||||||
if (TEST_MODE) loggerService.debug('transferred mine to: ' + row + ', ' + col)
|
if (TEST_MODE) loggerService.debug('transferred mine to: ' + row + ', ' + col)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue