循环忽略初始条件,浏览器崩溃

时间:2016-10-07 06:17:40

标签: javascript loops browser while-loop crash

故事很长 - 我试图建立一个简单的网球比赛模拟(下面的代码)。不幸的是,我的代码出了问题,因为我创建的while循环忽略括号中的条件,并开始产生无限多的行为(浏览器崩溃)。你能看看我的代码并告诉我错误在哪里吗?

var gamesPlayerOne = Math.floor(Math.random() * 8);
var gamesPlayerTwo = Math.floor(Math.random() * 8);
var tiebreak = Math.floor(Math.random() * 10);
var setsPlayerOne = 0;
var setsPlayerTwo = 0;
var scoreline = [];

function playTheGame(g1, g2) {

    while (setsPlayerOne < 2 && setsPlayerTwo < 2) {

        if (g1 === 6 && g2 < 5) {

            var result = g1.toString() + ":" + g2.toString();
            setsPlayerOne += 1;
            scoreline.push(result);

        } else if (g1 < 5 && g2 === 6) {

            var result = g1.toString() + ":" + g2.toString();
            setsPlayerTwo += 1;
            scoreline.push(result);

        } else if (g1 === 6 && g2 === 7) {

            var result = g1.toString() + ":" + g2.toString() + "(" + tiebreak + ")";
            setsPlayerTwo += 1;
            scoreline.push(result);

        } else if (g1 === 7 && g2 === 6) {

            var result = g1.toString() + ":" + g2.toString() + "(" + tiebreak + ")";
            setsPlayerTwo += 1;
            scoreline.push(result);

        }
    }
}

playTheGame(gamesPlayerOne,gamesPlayerTwo);
console.log(scoreline);

2 个答案:

答案 0 :(得分:0)

例如......当g1等于0且g2等于7时,你没有指定增加setsPlayer [One / Two]的任何条件。

所以你应该添加一些条件来检查它。

答案 1 :(得分:0)

如果您传递给函数的随机数与ifelse if条件中的任何一个都不匹配,那么您的所有变量都不会更新,因此while循环的条件仍然存在真的永远。

如果你试图模拟整个网球比赛,那么更有意义的是不要传递任何参数的函数,而是在while循环的每次迭代中随机决定哪个玩家赢得当前游戏和然后测试其中任何一个玩家是否已赢得一套,也许是这样的:

function playTheGame() {
    var g1 = 0;
    var g2 = 0;
    var setsPlayerOne = 0;
    var setsPlayerTwo = 0;
    var scoreline = [];

    while (setsPlayerOne < 2 && setsPlayerTwo < 2) {
        // determine a random winner for the current game
        if (Math.random() < 0.5)
          g1++;
        else
          g2++;
      
        // has one of the players just won a set?
        if (g1 >= 6 && g2 < g1 - 1) {
            var result = g1 + ":" + g2;
            setsPlayerOne += 1;
            scoreline.push(result);
            g1 = g2 = 0;
        } else if (g1 < g2 - 1 && g2 >= 6) {
            var result = g1 + ":" + g2;
            setsPlayerTwo += 1;
            scoreline.push(result);
            g1 = g2 = 0;
        }
    }
    return scoreline;
}

console.log(playTheGame());

请注意,您无需在.toString()g1上调用g2,因为将它们与字符串":"连接会隐式将数字转换为字符串。

您可以通过将if (Math.random() < 0.5)更改为使用变量而不是硬编码0.5来扩展此功能,以使其中一个或其他玩家更有可能获胜(模拟不同的技能级别)。

P.S。我不敢为查看网球规则而烦恼,以确认你是如何赢得比赛的,但我模糊的回忆是你必须至少获得6场至少两场比赛才能获胜。另一个玩家,这就是我所展示的代码试图实现的......