【问题标题】:Why does the variable always outputs 1, even though it's incremented in Javascript为什么变量总是输出1,即使它在Javascript中递增
【发布时间】:2018-07-01 13:39:58
【问题描述】:

我尝试解决我在网上找到的问题。我成功地解决了这个问题,但是有一个小错误我无法解决。

问题

编写一个猜谜游戏,用户必须猜出一个秘密数字。 每次猜测后,程序都会告诉用户他们的号码是否 太大或太小。最后,所需的尝试次数应该 打印出来。

这是我的代码:

// Generate a random number between 1 and 100
var num = Math.floor(Math.random() * (100)) + 1;
var running = true;    

while(running) {
    var tries = 1;
    var input = prompt("Take a guess");

    if (input == num) {
        console.log("Correct!");

        console.log("Number of tries: " + tries);
        running = false;
    }else if (input > num) {
        console.log("Too big");
    }else if (input < num) {
        console.log("Too small");
    }
    tries++;
}

错误

即使用户尝试了超过 1 次,程序仍然会说,

尝试次数:1

请解释我做错了什么。

谢谢。

【问题讨论】:

    标签: javascript variables scope


    【解决方案1】:

    您在 while 循环的每次迭代中重新初始化 tires

    while(running) {
        var tries = 1;
        ...
    }
    

    尝试在循环之外进行初始化。

    var num = Math.floor(Math.random() * (100)) + 1;
    var running = true;    
    var tries = 1;
    
    while(running) {
        var input = prompt("Take a guess");
    
        if (input == num) {
            console.log("Correct!");
    
            console.log("Number of tries: " + tries);
            running = false;
        }else if (input > num) {
            console.log("Too big");
        }else if (input < num) {
            console.log("Too small");
        }
        tries++;
    }
    

    【讨论】:

    • 哦,我没看到!谢谢。
    【解决方案2】:

    您的变量tries 贴在while 主体内。所以,任何循环迭代,这个变量的值都是 1。为了解决这个问题,你应该在循环之外声明和初始化变量:

    // Generate a random number between 1 and 100
    var num = Math.floor(Math.random() * 100) + 1;
    var running = true;
    var tries = 1;
    
    while (running) {
      var input = prompt("Take a guess");
    
      if (input == num) {
        console.log("Correct!");
        console.log("Number of tries: " + tries);
        running = false;
      } else if (input > num) {
        console.log("Too big");
      } else if (input < num) {
        console.log("Too small");
      }
    
      tries++;
    }
    

    注意:不要使用console.log(),而是使用alert()。控制台用于调试,而不是用于通知用户消息。

    【讨论】:

      【解决方案3】:

      我可以看到你的问题。如果你在 while 函数中放置一个变量,它每次都会被重置,这意味着它每次都是 1。

      如果你把它放在外面它运行得很好。另外,我相信 promt 返回的是字符串而不是数字,这就是为什么我建议您将数字转换为字符串或将 promt 转换为数字的原因。

      这是工作代码:

      var num = Math.floor(Math.random() * (100)) + 1;
      var running = true;    
      var tries = 1;
      
      while(running) {
      
          var input = parseFloat(prompt("Take a guess"));
      
          if (input == num) {
              console.log("Correct!");
      
              console.log("Number of tries: " + tries);
              running = false;
          }else if (input > num) {
              console.log("Too big");
          }else if (input < num) {
              console.log("Too small");
          }
          tries++;
      }
      

      【讨论】:

      • 感谢您的回答!但是,它无需转换即可工作。不这样做是不好的做法吗?
      • 不是,但有时在某些浏览器中会导致错误,因为它将数字显示为字符串。如果你不这样做,那很好,但在发布之前我会检查不同的浏览器和这些brosers的不同版本
      • 好的,我想我也不能使用 '===' 运算符作为 'input === num'。
      • 抱歉没有注意到运营商。如果你使用 '==' 那么就不会有问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 2020-06-26
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多