diff --git a/lib/mnswpr.js b/lib/mnswpr.js index 8eef78e..624e806 100644 --- a/lib/mnswpr.js +++ b/lib/mnswpr.js @@ -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)