因此,我正在用JS开发扫雷游戏。
我有这个功能:
function doSquare(x, y) { //takes x,y coordinates of a square. checks and acts accordingly to what's around it
var revealed = [];
var size = board.length;
var mines = countAround(x,y);
table.rows[x].cells[y].innerHTML = mines;
if (mines === 0) {
for (var i=Math.max(0,x-1), l = Math.min(x+1, size-1); i<=l; i++) {
for (var j=Math.max(0, y-1), k = Math.min(y+1, size-1); j<=k; j++) {
if (x == i && y==j) {continue;}
if (revealed.indexOf(i+"."+j) === -1) {
doSquare(i, j);
revealed.push(i+"."+j);
}
}
}
}
}
董事会的行和列均相等。
countAround(x,y)
返回(x,y)附近的地雷数量; revealed
是一个数组,用于存储已处理的正方形,以防止再次处理它们。当单击一个正方形时,此功能应该可以显示附近的地雷数量并将其写入单元格。然后,它检查周围的每个正方形,如果尚未处理过那个正方形(如果不在
revealed
数组中),则功能doSquare()
再次在其上运行。如果该方格旁边有任何地雷,该功能将不会从该方格“散布”。我收到一个错误:超出了最大调用堆栈大小。但是该功能在到达与地雷的正方形时停止其“扩展”,并且也不会在已经处理好的正方形上运行。因此,我想解释一下为什么会发生这种情况。
最佳答案
我认为问题是在函数内部定义了“显示”。这意味着每次调用该函数时,都会为该函数在本地创建一个新的“显示”。因此,周围没有地雷的正方形将为相邻的正方形调用doSquare,而该正方形又可以在原始正方形上调用doSquare。但是,doSquare不会记住它已经检查了该正方形,因为已为此调用创建了新的本地版本“ revealed”。
解:
要么将'revealed'作为参数传递给doSquare,以便所有调用都使用相同的变量(即function doSquare(x, y, revealed){...
,将初始调用设为doSquare(x, y, []);
,或者在doSquare之外声明'revealed',并在每次您希望检查时清空它为地雷。