【问题标题】:While loop ignores initial condition and the browser crashesWhile 循环忽略初始条件并且浏览器崩溃
【发布时间】:2016-10-07 06:17:39
【问题描述】:

长话短说 - 我正在尝试构建一个简单的网球比赛模拟(代码如下)。不幸的是,我的代码有问题,因为我创建的 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);

【问题讨论】:

  • 作为第一眼,您是否尝试放置一个“其他”案例?
  • 你能在工作中发布一个简单的jsfiddle吗!

标签: javascript loops browser while-loop crash


【解决方案1】:

如果您传递给函数的随机数不匹配任何if 或else 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());

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

您可以通过将if (Math.random() &lt; 0.5) 更改为使用变量而不是硬编码0.5 来扩展此功能,以使一个或另一个玩家更有可能获胜(模拟不同的技能水平)。

附:我懒得查网球规则来确认你是如何赢得一盘的,但我模糊的回忆是你必须至少获得 6 场比赛并且至少领先 2 场比赛另一个玩家,所以这就是我展示的代码试图实现的......

【讨论】:

  • 非常感谢,工作就像一个魅力!我添加了一些额外的条件来预测所有可能的结果(包括抢七、五局两胜制等),我对最终结果非常满意。不过,在我擅长 JS 之前,我还有很长的路要走。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-07
    • 2018-02-23
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    相关资源
    最近更新 更多