javascript - 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);
}
}
}
}
解决方案
推荐阅读
- amazon-web-services - AWS 无法创建 Fargate 配置文件
- angular - 如何使用密钥将登录凭据加密为 base64
- android - 如何使用 Framework7 为 Android 5 构建?
- git - 使用分叉和拉取请求进行协作
- swift - 如何在 XCTestCase 中的 viewModel 中正确测试通过发布者更改的 var
- pandas - 插值然后外推边界值
- mysql - 如何只返回一列中的不同结果,同时允许其他列中的重复?
- python - 使用存储单元创建表
- php - php 变量范围 - 包含/必需的脚本与 ajax
- javascript - Handlebars:访问已被拒绝解析“来自”的属性,因为它不是其父级的“自己的属性”