因此,我正在用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',并在每次您希望检查时清空它为地雷。

10-07 22:49