首页 > 解决方案 > JavaScript 在进行递归调用后是否会忽略函数中剩余的代码行?

问题描述

我正在用 JavaScript 构建一个扫雷游戏,当单击没有地雷的单元格时尝试清除相邻的空单元格时遇到问题。

我正在使用一个名为 clearEmptySpace() 的函数来检查与单击的单元格相邻的所有单元格上的变量 nextMines 是否大于 0。如果在任何选中的单元格上的相邻矿山变量为 0,我调用 checkCell() 函数来发现单元格,然后使用新的单元格位置调用 clearEmptySpace()。

如果 clearEmptySpace() 发现一个有 1 个或多个相邻地雷的单元格,它会调用 checkCell() 并带有一个标志,以确保 clearEmptySpace() 不会在该单元格位置再次调用。

问题是 clearEmptySpace() 检查其正上方的单元格,当它发现其上方的单元格的相邻矿山值为 0 时,它会调用 checkCell() 并按预期将单元格位置置于自身上方,但不会在函数之后继续检查其他方向调用。

下一次检查(左上单元格)的唯一时间是当上面的单元格有 1 个或多个相邻的单元格并且下面的 checkCell() 不重新调用 clearEmptySpace() 时。

第二个 clearEmptySpace() 调用是否会阻止当前的 clearEmptySpace() 进一步执行?如果是这样,我该如何解决这个问题?

为简单起见,提供的 clearEmptySpace() 代码仅检查正上方的单元格和左上角的单元格。

function checkCell(cell,onlyOnce = false){
    var cellLocation = cell.id.toString();
    var clickedCell = cellLocation.split(',');
    if(cellArray[clickedCell[0]][clickedCell[1]].hasMine){
        cell.innerHTML = "M"
        gameOver();
    }else{
        cellArray[clickedCell[0]][clickedCell[1]].flagged = false;
        if(cellArray[clickedCell[0]][clickedCell[1]].adjacentMines > 0){
            getFontColor(cell);
            cell.innerHTML = cellArray[clickedCell[0]][clickedCell[1]].adjacentMines.toString();
        }else{
            cell.innerHTML = "0";
        }
        cell.style.backgroundColor = "#EBEBEB";
        if(!onlyOnce && !cellArray[clickedCell[0]][clickedCell[1]].adjacentMines){
            clearEmptySpace(cell);
        }
    }
    cellArray[clickedCell[0]][clickedCell[1]].hidden = false;
}

_____________________________________________________________________________

function clearEmptySpace(inputCell){
    var cellLocation = inputCell.id.toString();
    var currentCell = cellLocation.split(',');

    var targetCellLocation = new Array();
    targetCellLocation = [currentCell[0]-1,currentCell[1]+1];
    var targetCell = document.getElementById(targetCellLocation[0].toString()+","+targetCellLocation[1].toString());

    if(currentCell[0] > 0){
        if(!cellArray[currentCell[0]-1][currentCell[1]].adjacentMines){
            alert("The cell directly above has no adjacent mines");
            targetCellLocation = [currentCell[0]-1,currentCell[1]];
            checkCell(document.getElementById(targetCellLocation[0].toString()+","+targetCellLocation[1].toString()));
        }else{
            alert("The cell directly above has at least one adjacent mine");
            targetCellLocation = [currentCell[0]-1,currentCell[1]];
            checkCell(document.getElementById(targetCellLocation[0].toString()+","+targetCellLocation[1].toString()),true);
        }
        if(currentCell[1] > 0 ){
            if(!cellArray[currentCell[0]-1][currentCell[1]-1].adjacentMines){
                alert("The cell on the upper left has no adjacent mines");
                targetCellLocation = [currentCell[0]-1,currentCell[1]-1];
                checkCell(document.getElementById(targetCellLocation[0].toString()+","+targetCellLocation[1].toString()));
            }else{
                alert("The cell on the upper left has at least one adjacent mine");
                targetCellLocation = [currentCell[0]-1,currentCell[1]-1];
                checkCell(document.getElementById(targetCellLocation[0].toString()+","+targetCellLocation[1].toString()),true);
            }
        }
       }
}

标签: javascript

解决方案


推荐阅读