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