Javascript, about infinite looping prompt and stopping that loop

天涯浪子 提交于 2019-12-02 12:43:10

The reason you have an endless loop is that you don't change answer's value inside your loop. As a result each time the while condition is evaluated answer is still the first number entered into the prompt and the loop runs again. Also it's worth noting that if the user enters nothing answer will be set to an empty string ("")

working version:

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!");
  }
}

You've found out why while loops can be dangerous. The best solution here is to limit the amount of guesses the user has and to do that you need a counter that is incremented inside the loop and that can simply be done with a for loop.

Also, use curly braces to surround your if branches.

Lastly, the best way to convert a string into a number is with parseInt() and parseFloat(). Do the conversion right when you get the string and then you don't have to keep converting it every time you want to use it.

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;
  }
    
}

The problem is that the prompt is before the loop. Changing while to do while can fix it:

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);

Try this. Hope it helps.

<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>

This is only different from some of the other answers in trying to retain your intent of giving up when no answer is provided:

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!");
}

Fiddle: https://jsfiddle.net/h10qt0nn/1/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!