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)
|
||||
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() {
|
||||
const headingElement = document.createElement('h1')
|
||||
|
|
@ -188,7 +189,7 @@ const Minesweeper = function(appId, version, hooks = undefined) {
|
|||
grid.innerHTML = ''
|
||||
grid.oncontextmenu = () => false
|
||||
flagsCount = setting.mines
|
||||
minesArray = []
|
||||
mines.clear()
|
||||
|
||||
for (let i = 0; i < setting.rows; i++) {
|
||||
let row = grid.insertRow(i)
|
||||
|
|
@ -447,7 +448,7 @@ const Minesweeper = function(appId, version, hooks = undefined) {
|
|||
if (isMine(cell)) {
|
||||
transferMine()
|
||||
} else {
|
||||
minesArray.push([row, col])
|
||||
mines.add(mineKey(row, col))
|
||||
}
|
||||
if (TEST_MODE){
|
||||
cell.innerHTML = 'X'
|
||||
|
|
@ -536,30 +537,12 @@ const Minesweeper = function(appId, version, hooks = undefined) {
|
|||
return getStatus(cell) == 'flagged'
|
||||
}
|
||||
|
||||
function mineKey(row, col) {
|
||||
return row * setting.cols + col
|
||||
}
|
||||
|
||||
function isMine(cell) {
|
||||
return getIndex(minesArray, cell) > -1
|
||||
}
|
||||
|
||||
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
|
||||
return mines.has(mineKey(getRow(cell), getCol(cell)))
|
||||
}
|
||||
|
||||
function checkLevelCompletion() {
|
||||
|
|
@ -721,7 +704,7 @@ const Minesweeper = function(appId, version, hooks = undefined) {
|
|||
return
|
||||
} else if (isMine(cell) && firstClick) {
|
||||
// cell.setAttribute('data-mine', 'false');
|
||||
removeItem(minesArray, cell)
|
||||
mines.delete(mineKey(getRow(cell), getCol(cell)))
|
||||
transferMine(cell)
|
||||
if (TEST_MODE) printMines()
|
||||
}
|
||||
|
|
@ -749,7 +732,7 @@ const Minesweeper = function(appId, version, hooks = undefined) {
|
|||
if (isMine(transferMineToCell) || isNeighbor(cell, transferMineToCell)) {
|
||||
continue
|
||||
} else {
|
||||
minesArray.push([row, col])
|
||||
mines.add(mineKey(row, col))
|
||||
if (TEST_MODE){
|
||||
transferMineToCell.innerHTML = 'X'
|
||||
if (TEST_MODE) loggerService.debug('transferred mine to: ' + row + ', ' + col)
|
||||
|
|
|
|||
Loading…
Reference in a new issue