Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
得到一个无限循环,可以';我不明白为什么-Javascript_Javascript_Jquery_Html_Css - Fatal编程技术网

得到一个无限循环,可以';我不明白为什么-Javascript

得到一个无限循环,可以';我不明白为什么-Javascript,javascript,jquery,html,css,Javascript,Jquery,Html,Css,我正在编写一个简单的Connect 4小游戏,在我的一个函数上运行一个无限循环: var reds = 0; var greens = 0; function checkEmpty(div) { var empty = false; var clicked = $(div).attr('id'); console.log(clicked); var idnum = parseInt(clicked.substr(6)); while (idnum <

我正在编写一个简单的Connect 4小游戏,在我的一个函数上运行一个无限循环:

var reds = 0;
var greens = 0;

function checkEmpty(div) {
    var empty = false;
    var clicked = $(div).attr('id');
    console.log(clicked);
    var idnum = parseInt(clicked.substr(6));
    while (idnum < 43) {
        idnum = idnum + 7;
    }
    console.log("idnum=" + idnum);
    while (empty == false) {
        for (var i = idnum; i > 0; i - 7) {
            idnumStr = idnum.toString();
            var checking = $('#square' + idnumStr);
            var str = checking.attr('class');
            empty = str.includes('empty');
            console.log(empty);
            var divToFill = checking;
        }
    }

    return divToFill;
}

function addDisc(div) {
    if (reds > greens) {
        $(div).addClass('green');
        greens++;
        console.log("greens=" + greens);
    } else {
        $(div).addClass('red');
        reds++;
        console.log("reds=" + reds);
    };
    $(div).removeClass('empty');
}

$(function() {
    var i = 1;
    //add a numbered id to every game square
    $('.game-square').each(function() {
        $(this).attr('id', 'square' + i);
        i++;
        //add an on click event handler to every game square

        //onclick functions
        $(this).on('click', function() {
            var divToFill = checkEmpty(this);
            addDisc(divToFill);
        })
    })
})
var=0;
var-greens=0;
函数checkEmpty(div){
var empty=false;
var clicked=$(div.attr('id');
console.log(单击);
var idnum=parseInt(单击.substr(6));
而(idnum<43){
idnum=idnum+7;
}
console.log(“idnum=“+idnum”);
while(空==假){
对于(var i=idnum;i>0;i-7){
idnumStr=idnum.toString();
风险值检查=$(“#平方”+idnumStr);
var str=checking.attr('class');
empty=str.includes('empty');
console.log(空);
var divToFill=检查;
}
}
返回divToFill;
}
函数addDisc(div){
如果(红色>绿色){
$(div.addClass('green');
绿色++;
console.log(“greens=“+greens”);
}否则{
$(div.addClass('red');
红色++;
console.log(“reds=“+reds”);
};
$(div.removeClass('empty');
}
$(函数(){
var i=1;
//为每个游戏方块添加编号id
$('.game square')。每个(函数(){
$(this.attr('id','square'+i);
i++;
//为每个游戏方块添加一个点击事件处理程序
//onclick函数
$(此)。在('单击',函数()上){
var divToFill=checkEmpty(此项);
addDisc(divToFill);
})
})
})
这里是代码笔的链接

如果你点击其中一个圆圈并观察浏览器的控制台,你会看到它返回真值超过3000次。我不知道我做了什么才让它这么做。我希望代码在返回empty=true时立即停止。empty以false开头,因为我只希望代码在尚未具有class.green或.red的div上运行

我在这里哪里出错了?

改为:

for (var i = idnum; i > 0; i = i - 7) {
您并不是在减少for循环中的i

对于(var i=idnum;i>0;i-7)

您不需要更改
i

你想把它减7吗

for
循环更改为如下所示的循环:

for (var i = idnum; i > 0; i -= 7) {
  // ...
}

在循环体中也不使用循环变量。相反,您使用的是
idnum
,我认为这可能是一个问题

while (empty == false) {
    for (var i = idnum; i > 0; i -= 7) {
        idnumStr = i.toString(); // changed to i
        var checking = $('#square' + idnumStr);
        var str = checking.attr('class');
        empty = str.includes('empty');
        console.log(empty);
        var divToFill = checking;
        // and don't forget to stop, when found empty
        if (empty) break;
    }
}
如果找到空,我会添加break,因为如果我们进入下一个迭代,我们将用最小的
I
相关值覆盖空变量

您还可以使用
if(!empty){empty=…;}
包装
empty
赋值,以防止此重写,但我假设您可以中断,因为:

我希望代码在返回empty=true时立即停止


场外提示:

while (idnum < 43) {
    idnum = idnum + 7;
}
while(idnum<43){
idnum=idnum+7;
}

可以很容易地替换为:
idnum=42+(idnum%7 | | 7)
基于其他人发布的内容,您需要更改for循环中的empty值。因为很明显,字符串仍然检查循环中的最后一个字符串,该字符串总是返回false

while(empty==false){

for (var i = idnum; i > 0; i -= 7) {
   // your other codes
  if (!empty) {
   empty = str.includes('empty');
   }
}

确保在
中调试代码,而
用于
循环。可能是您的
empty
变量从不
true
或者您的
i
变量从不等于
0
您是否已将“id”属性添加到game square类中?在您共享的代码笔中,它不在那里。请查看vp_arth的答案。你没有减少你的i.
while(idnum<43){idnum=idnum+7;}
这有什么意义?只要设置
idnum=49
就行了。@Rorymcrossan,这就像
idnum=42+(idnum%7 | | 7)
天哪。非常感谢。我知道这只是我的疏忽。不管我看了多少遍代码,这些代码对我来说从来都不突出。现在它可以完美地用于第一排。但是,如果我尝试将光盘放在第二行,它确实可以无限运行。而在它运行3000多次之前,它是真的,而现在它运行false,并且从不停止。#你没有在循环中使用
i
。检查答案,太棒了!非常感谢你。这很好用。我知道这是小事。谢谢你的帮助,谢谢。我错过了那个非常重要的小细节。然而,正如我在上面对副总裁arth所说的,我现在对循环有另一个问题。对于第一行,它运行得非常完美,但是如果我尝试将一个光盘放在第一行已经填充的列中,它将无限地运行为false。他们帮你修好了。