Вам действительно не нужно передавать event
в вашей рекурсивной функции, и вам не нужно устанавливать значение параметра по умолчанию для вашей функции. Используйте ваш обработчик событий и передайте значения event.target
функции l_click
Вместо вложенного l oop, вы можете создать массив направлений dirs
и использовать его для итерации 8 соседей в 8 направление в одном l oop.
Проверьте соседние координаты, чтобы увидеть, находится ли оно в пределах границ . В своем коде вы не проверяете границы. Предположим, вы начинаете с координат [1,1]
, каждый раз, когда вы вызываете свою функцию, ваш i
начинается с coordinate_i - 1, coordinate_j -1
, после 1 стека вызовов координаты переходят в [0,0]
, если ячейка пуста, функция вызывается снова, и затем он начинается с [-1,-1]
, что нарушает ваш код, потому что block[-1]
- это undefined
.
Для демонстрации он не будет проверять nearBombsNum
, он будет продолжать проверять пустые ячейки и отмечать их как посещенные клетки.
const dirs = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]]
function l_click(coordinate_i, coordinate_j)
{
if(block[coordinate_i][coordinate_j].isBomb)
{
// lots of irrelevant cocde
}
else {
block[coordinate_i][coordinate_j].src = "blank.png";
//iterate 8 neibors
for(const [x,y] of dirs){
//i1,j1 are neibor coordinates
const i1 = coordinate_i + x, j1 = coordinate_j + y;
//check i1,j1 boundary, proceeds only if cell is not a bomb and empty
if(i1>=0&&i1<block.length&&j1>=0&&j1<block[i1].length&&!block[i1][j1].isBomb&&block[i1][j1].src === 'empty-block.png'){
if(block[i1][j1].nearBombsNum === 0)
l_click(i1, j1)
else
block[i1][j1].src = block[i1][j1].nearBombsNum + ".png";
}
}
}
}
//1 is bomb, 2 is visited or clicked cell, 0 is empty
function l_clickDemo(coordinate_i, coordinate_j)
{
if(demo[coordinate_i][coordinate_j] === 1)
{
// lots of irrelevant cocde
}
else {
demo[coordinate_i][coordinate_j] = 2;
//iterate 8 neibors
for(const [x,y] of dirs){
//i1,j1 are neibor coordinates
const i1 = coordinate_i + x, j1 = coordinate_j + y;
//check i1,j1 boundary, proceeds only if cell is not a bomb and empty
if(i1>=0&&i1<demo.length&&j1>=0&&j1<demo[i1].length&&demo[i1][j1]!==1&&demo[i1][j1] === 0){
l_clickDemo(i1, j1)
}
}
}
}
const demo = [[0,1,0,0,0],[0,0,0,1,0],[0,0,1,0,0],[0,0,0,0,0],[0,0,0,0,1]]
l_clickDemo(0,0)
console.log(demo)