【问题标题】:Javascript, about infinite looping prompt and stopping that loopJavascript,关于无限循环提示和停止该循环
【发布时间】:2017-02-01 01:55:58
【问题描述】:

我是 javascript 新手,所以这是我的背景故事 :) 这段代码一直让我的浏览器崩溃,如果我在第一次尝试时不取消,无论我输入一个数字,它都不会让我取消提示还是不行……反正游戏也行不通,就是要达到一个秘密数字就是人的猜测数字的地步。为了取消提示,我什至尝试过 if(answer===null||answer===false||answer==="null") 休息;但它不会工作。有人可以帮忙吗?谢谢。

这是我的代码:

<script>
var secret_number=Math.floor((Math.random() * 10) + 1); 
var answer=prompt("Enter a number you want to try");

while(secret_number!==Number(answer))
{
if(name===null||name===false||name==="null")
break;

if(Number(answer)>secret_number)
prompt("This number is too high!");

else if(Number(answer)<secret_number)
prompt("This number is too low!");

else
prompt("You got it!");
}

</script>

我有一个后续问题。我考虑了人们告诉我的内容并想出了这个:

var secret_number=Math.floor((Math.random() * 10) + 1); 
var answer=parseInt(prompt("Enter a number you want to try"));

while(secret_number!==answer)
{
if(answer == null || answer == "" ||isNaN(answer))
break;

if(answer>secret_number)
answer=prompt("This number is too high!");

else if(answer<secret_number)
answer=prompt("This number is too low!");

else
alert("You got it!");
}

我的问题是,我的“你明白了!”怎么来的?警报会无限持续吗?我知道我可以让它在那里打破,但我想知道它为什么一直这样做。它应该有那个 secret_number===answer 并跳出 while 循环,所以显然它没有这样做,我不明白为什么。再次感谢你。

【问题讨论】:

  • if(name===null||name===false||name==="null") 中是name 不应该是answer
  • 对不起,我的意思是回答,但是我的原始代码中有答案..
  • 谢谢大家,很有帮助!

标签: javascript loops prompt


【解决方案1】:

您已经了解了为什么 while 循环会很危险。这里最好的解决方案是限制用户的猜测数量,并且要做到这一点,您需要一个在循环内递增的计数器,并且可以简单地通过 for 循环来完成。

另外,使用花括号将您的 if 分支括起来。

最后,将字符串转换为数字的最佳方法是使用parseInt()parseFloat()。当你得到字符串时就进行正确的转换,然后你就不必每次想要使用它时都继续转换它。

var secret_number = Math.floor((Math.random() * 10) + 1);
alert("For testing only: The secret number is: " + secret_number);
var answer = parseInt(prompt("Enter a number you want to try"), 10);

const GUESSES = 3;

for(var i = 0; i < GUESSES; ++i){
  if(!isNaN(answer)){
    
    if(answer > secret_number) {
      answer = prompt("Try again...This number is too high! (" + (GUESSES - i - 1) + " guesses left.)");
    } else if(answer < secret_number) {
      answer = prompt("Try again...This number is too low! (" + (GUESSES - i - 1) + " guesses left.)");
    } else {
      alert("You got it!");
      break;
    }
  } else {
    alert("You didn't enter a number!");
    break;
  }
    
}

【讨论】:

    【解决方案2】:

    你有一个无限循环的原因是你没有在你的循环中改变answer的值。因此,每次评估 while 条件时,answer 仍然是输入到提示中的第一个数字,并且循环再次运行。另外值得注意的是,如果用户不输入任何内容,answer 将被设置为空字符串 ("")

    工作版本:

    var secret_number=Math.floor((Math.random() * 10) + 1); 
    var answer=prompt("Enter a number you want to try");
    
    while(secret_number!==Number(answer))
    {
      if(answer===null || answer = ""){
        break;
      }
    
      if(Number(answer)>secret_number){
        answer = prompt("This number is too high!");
      }
      else if(Number(answer)<secret_number){
        answer = prompt("This number is too low!");
      }
    
      else{
        alert("You got it!");
      }
    }
    

    【讨论】:

      【解决方案3】:

      问题是prompt 在循环之前。将while 更改为do while 可以修复它:

      var secret_number=Math.floor((Math.random() * 10) + 1); 
      
      do {
        var str = prompt("Enter a number you want to try"),
            answer = Number(str);
      
        if (!str || isNaN(answer)) {
          alert('Bye');
          break;
        }
        
        if (answer > secret_number) {
          alert("This number is too high!");
        } else if (answer < secret_number) {
          alert("This number is too low!");
        } else {
          alert("You got it!");
        }
        
      } while (secret_number !== answer);

      【讨论】:

        【解决方案4】:

        试试这个。希望对您有所帮助。

        <script>
        var secret_number=Math.floor((Math.random() * 10) + 1); 
        
        var answer=prompt("Enter a number you want to try");
        
        while(secret_number!=Number(answer)){
        
        	if(Number(answer)>secret_number){
        		answer = prompt("This number is too high!");
        	}
        	else if(Number(answer)<secret_number){
        		answer = prompt("This number is too low!");
        	}
        }
        
        prompt('correct!');
        </script>

        【讨论】:

          【解决方案5】:

          这与其他一些答案不同,只是在没有提供答案时试图保持放弃的意图:

          var secret_number=Math.floor((Math.random() * 10) + 1); 
          var answer=prompt("Enter a number you want to try");
          
          while(secret_number!==Number(answer)) {
              // "" covers case of clicking OK with nothing entered
            // null covers case of clicking Cancel
              if(answer == null || answer == "") {
                  break;
            }
          
              if(Number(answer)>secret_number) {
                  answer = prompt("This number is too high!");
              } else if(Number(answer)<secret_number) {
                  answer = prompt("This number is too low!");
              }
          }
          if (secret_number!==Number(answer)) {
              alert("You gave up :(");
          } else {
              alert("You got it!");
          }
          

          小提琴:https://jsfiddle.net/h10qt0nn/1/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-21
            • 2015-02-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多