首页 > 解决方案 > 使用用户输入询问玩家是否想再次玩。问题:特定条件下的循环

问题描述

我创建了一个猜谜游戏,其中用户有 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次。

标签: javascriptconsole

解决方案


再次为我之前给出的完全不正确(现已删除)的答案道歉。我相信我现在了解您的问题的真正原因,以及如何解决它:

用户被多次提示的原因,每次他们之前说“是”的时候,是因为,对于每个“是”的回答,你都在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- 从而防止循环再次运行。


推荐阅读