得到一个无限循环,可以';我不明白为什么-Javascript
我正在编写一个简单的Connect 4小游戏,在我的一个函数上运行一个无限循环:得到一个无限循环,可以';我不明白为什么-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 <
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。他们帮你修好了。