Javascript 扫雷游戏-超过最大调用堆栈边数

Javascript 扫雷游戏-超过最大调用堆栈边数,javascript,recursion,size,stack,max,Javascript,Recursion,Size,Stack,Max,所以我正在用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

所以我正在用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);
                            }
                        }
                    }
                }


            }
函数doSquare(x,y){//获取正方形的x,y坐标。根据正方形周围的坐标进行检查和操作
风险价值=[];
变量大小=电路板长度;
var=倒计时(x,y);
table.rows[x]。cells[y]。innerHTML=mines;
如果(矿山===0){

对于(变量i=Math.max(0,x-1),l=Math.min(x+1,size-1);i我认为问题在于“discovered”是在函数中定义的。这意味着每次调用函数时,都会在本地为函数创建一个新的“discovered”。因此,周围没有地雷的正方形会为相邻正方形调用doSquare,而相邻正方形可能会在原始正方形上调用doSquare。但是,doSquare不会记住,它已经检查了这个方块,因为为这个调用创建了一个新的本地版本的“discovered”

解决方案:


将“discovered”作为参数传递给doSquare,以便所有调用使用相同的变量(即
函数doSquare(x,y,discovered){…
,使初始调用成为
doSquare(x,y,[]);
,或者在doSquare外部声明'exposed',并在每次希望检查地雷时清空它。

我认为问题在于'exposed'是在函数内部定义的。这意味着每次调用函数时,都会在本地为函数创建一个新的'exposed'。因此,一个周围没有地雷的正方形将调用doSquare对于相邻的方块,它可能会在原始方块上调用doSquare。但是,doSquare不会记得它已经检查了此方块,因为为此调用创建了新的本地版本的“启示”

解决方案:


将“discovered”作为参数传递给doSquare,以便所有调用使用相同的变量(即
函数doSquare(x,y,discovered){…
,使初始调用成为
doSquare(x,y,[]);
,或者在doSquare之外声明“discovered”,每次你想检查地雷时清空它。

我猜你的循环/递归跑掉了。检查你的条件和限制器。我猜你的循环/递归跑掉了。检查你的条件和限制器。完全正确。我错过了……每次函数运行时,“discovered”被重置为空数组。Ex事实上,我错过了…每次函数运行时,“discovered”被重置为空数组。