Javascript 当循环崩溃或未执行所需操作时-非常混乱

Javascript 当循环崩溃或未执行所需操作时-非常混乱,javascript,while-loop,minesweeper,Javascript,While Loop,Minesweeper,我正在用香草JavaScript构建一个扫雷游戏。我有一个处理网格上的逻辑的网格类,一个基本上充当空间属性容器的空间类,还有一个处理游戏逻辑的游戏类 在Grid类中,我有一个名为openadjuningspaces的方法。该方法的预期行为是在每个方向上打开板上所有连接的空间,从单击的空白空间开始,到下一个空间与矿井相邻时结束。如果你不熟悉扫雷舰,你可以在网站上看到这种行为 方法调用另一个方法,getBorderingSpaces。此方法接受单击的空间作为参数,并返回一个数组,该数组包含每个边界空

我正在用香草JavaScript构建一个扫雷游戏。我有一个处理网格上的逻辑的网格类,一个基本上充当空间属性容器的空间类,还有一个处理游戏逻辑的游戏类

在Grid类中,我有一个名为
openadjuningspaces
的方法。该方法的预期行为是在每个方向上打开板上所有连接的空间,从单击的空白空间开始,到下一个空间与矿井相邻时结束。如果你不熟悉扫雷舰,你可以在网站上看到这种行为

方法调用另一个方法,
getBorderingSpaces
。此方法接受单击的空间作为参数,并返回一个数组,该数组包含每个边界空间,包括在拐角处接触的空间

当调用
openadjuningspaces
时,它首先获取不包含地雷的边界空间,并将它们放入名为
toOpen
的数组中。然后,该方法使用while循环。在while循环中,打开
toOpen
中的每个空格,然后对于打开的每个空格,获取其边界空格,如果它们为空,则将它们添加到名为
next
的数组中。在循环结束时,如果
next
数组的长度大于0,则将
toOpen
变量重新分配给
next
,否则循环终止

这应该会导致期望的行为,但事实并非如此。每次我以另一种方式重写它时,它要么会使浏览器崩溃(即使它不是一个无限循环),要么只会打开单击空间的周围空间,然后终止。以下是方法本身:

打开邻接空间(空格)
{
if(空格.isEmpty){
让循环=真;
var toOpen=[…this.getBorderingSpaces(space).filter(space=>!space.hasMine)];
while(循环){
常量next=[];
toOpen.forEach(空格=>{
this.openSpace(space.id);
const neighboration=this.getBorderingSpaces(space);
forEach(空格=>{
如果(!space.hasMine&&space.isEmpty){
下一步。推(空格);
}
});
});
如果(next.length>0){
toOpen=next;
打破
}否则{
循环=假;
}
}
}
}

两天来,我一直在尝试创建这种空间开放行为。每次我接近成功时,网格仍然显示某种错误行为。整个下午我都在不断地尝试用不同的方式重写这个方法,但没有成功。我束手无策,真的需要一些外界的意见。请不要犹豫,请让我澄清有关代码的任何内容。我要澄清的一点是,空间物体有两个独立的属性
hasMine
isEmpty
。第一个只是指空间是否有地雷。第二个是指它是否包含一个数字。可能是一个设计缺陷,我不知道,但我想我应该提一下。

这是一个有点棘手的发现,但在
开放邻接空间中有一个缺陷。将项目添加到
next
时,从不检查当前空间是否已打开。这导致
isOpen
数组在每次迭代中都变大,从而使循环永无止境。将此添加到代码中,并在
toOpen=next

改变这个

toOpen.forEach(space => {

                this.openSpace(space.id);

                const neighbouring = this.getBorderingSpaces(space);

                neighbouring.forEach(space => {
                    if (!space.hasMine && space.isEmpty) {
                        next.push(space);
                    }
                });
            });
为此

toOpen.forEach(space => {

                this.openSpace(space.id);

                const neighbouring = this.getBorderingSpaces(space);

                neighbouring.forEach(space => {
                    if (!space.hasMine && space.isEmpty && space.status !== 'open') {
                        next.push(space);
                    }
                });
            });

为了澄清,while循环应该一直持续到
next.length==0
?如果是这种情况,在代码中,您总是以任何方式结束循环(
break
中断循环),因此您应该删除
break
。在任何情况下,您是否可以将
this.getBorderingSpaces
的代码包括在内?如果您还可以添加一些测试“空格”和预期结果,那就更好了。这有助于发布有效代码,因为第一行中似乎缺少一个关键字。@RobG没有缺少的关键字。JavaScript中的方法省略了
函数
关键字。发布的代码包含语法错误。我无法在此处发布
getBorderingSpaces
方法,因为它太长。但是,它确实可以正确获取所有与目标空间接触的空间。感谢您的努力。这确实修复了一个bug,但该方法仍然不能产生预期的结果。方法仍然只打开直接接触单击的空间的空间,而不是扇形展开。不过,我删除了
break
语句。人们期望的行为几乎达到了目的。现在唯一的问题是它只会打开所有的空白空间。实际上,我应该一直打开空间,直到它找到一个与地雷相邻的空间,然后打开该空间并终止。不过越来越近了。我很受鼓舞。再次感谢你的帮助。如果你感兴趣的话,这是一个克隆:大约完成了98%。