javascript - 使用用户输入询问玩家是否想再次玩。问题:特定条件下的循环
问题描述
我创建了一个猜谜游戏,其中用户有 6 次尝试猜数字,在本例中为 50。在用户正确猜出数字后,系统会提示他们问题,你想再玩一次吗?如果用户输入yes,程序将再次运行。问题是当用户在玩多个游戏后输入 no 时,会多次提示他们相同的消息。[见底部更好的例子]
我尝试在 while 循环中放置不同的条件。我认为问题在于每次用户输入“是”时代码循环进行补偿。
function start(){
//var answer = Randomizer.nextInt(1, 100);
var answer = 50;
var guess;
var lastGuess;
var attempts = 1;
while(guess != answer){
guess = readInt("Guess the number. ");
//if correct
if(answer == guess){
println("Correct guess, it took you " + attempts + " tries. ");
playAgain();
//if too high
}else if(answer < guess){
if(lastGuess && answer < lastGuess){
println("Guess was STILL too high. ");
}else{
println("Guess was too high. ");
}
lastGuess = guess;
//if too low
}else if(answer > guess){
if(lastGuess && answer > lastGuess){
println("Guess was STILL too low. ");
}else{
println("Guess was to low. ");
}
lastGuess = guess;
}
//if 6 attempts done
if(attempts == 6){
break;
}
attempts++;
}
//end game at 6 attempts
if(guess != answer && attempts == 6){
println("The answer was " + answer + ". You did not guess the number. ");
playAgain();
}
}
function playAgain(){
var askPlayAgain = "Yes";
while(askPlayAgain != "No"){
askPlayAgain = readLine("Do you want to play again? [Yes/No] ");
if(askPlayAgain == "No"){
break;
}
if(askPlayAgain == "Yes"){
start();
}else{
println("Please type in your response again? ");
playAgain();
}
}
}
结果:
Guess the number. 50
Correct guess, it took you 1 tries.
Do you want to play again? [Yes/No] Yes
Guess the number. 50
Correct guess, it took you 1 tries.
Do you want to play again? [Yes/No] No
game has ended
Do you want to play again? [Yes/No] No
game has ended
预期成绩:
Guess the number. 50
Correct guess, it took you 1 tries.
Do you want to play again? [Yes/No] Yes
Guess the number. 50
Correct guess, it took you 1 tries.
Do you want to play again? [Yes/No] No
game has ended
如果用户输入 no 和 yes,则会提示用户相同次数的消息。比如我玩了3次游戏结束后输入no,提示一共显示3次。
解决方案
再次为我之前给出的完全不正确(现已删除)的答案道歉。我相信我现在了解您的问题的真正原因,以及如何解决它:
用户被多次提示的原因,每次他们之前说“是”的时候,是因为,对于每个“是”的回答,你都在start()
再次打电话。这当然是您重新启动游戏所需要做的事情 - 问题的原因不是它本身,而是在start
函数运行它的过程(包括它的调用playAgain
)之后,您将进入另一个迭代循环进入playAgain
。这当然意味着再次询问用户。
所以问题其实都在里面playAgain
。修复它的最干净的方法是我认为改变循环的结构方式,就像这样(几种方法中的一种):
function playAgain(){
var askPlayAgain;
while(true){
askPlayAgain = readLine("Do you want to play again? [Yes/No] ");
if(askPlayAgain == "No"){
break;
}
else if(askPlayAgain == "Yes"){
start();
break;
}else{
println("Please type in your response again? ");
}
}
}
这个循环将继续运行,并提示用户,直到用户键入"No"
或"Yes"
如果他们键入"No"
,循环将退出而不做任何其他事情,因此程序完成。如果他们键入"Yes"
游戏将重新启动。至关重要的是,虽然用户在完成后会再次被提示进入另一场比赛(即playAgain
在结束时的调用start
),但一旦他们说"No"
,那就是它,因为playAgain
堆栈上的任何调用都不会在用户之后做任何可观察到的事情类型"No"
。
真的,虽然我已经稍微整理了代码,但唯一有意义的更改是break
在调用之后添加start
- 从而防止循环再次运行。