perf: improve mines lookup

This commit is contained in:
ayo 2026-07-02 20:31:14 +02:00
parent 81f310e7cc
commit 1bd3135dac

View file

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