Использование пользовательского ввода, чтобы спросить игрока, хотят ли они играть снова. Проблема: циклы при определенных условиях

#javascript #console

#javascript #консоль

Вопрос:

Я создал игру в угадайку, в которой пользователь имеет 6 попыток угадать число, в данном случае 50. После того, как пользователь правильно угадал номер, ему будет предложено задать вопрос: «Вы хотите сыграть еще раз?». Если пользователь вводит «да», программа запускается снова. Проблема в том, что когда пользователь вводит «нет» после нескольких игр, ему предлагается одно и то же сообщение несколько раз.[лучший пример см. внизу]

Я пробовал помещать в разные условия циклы while. Я думаю, проблема в том, что циклы кода компенсируют каждый раз, когда пользователь вводит Yes.

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

Пользователю предлагается сообщение столько же раз, если он вводит «нет» вместо «да». Например, если я сыграл в игру 3 раза и набрал no после окончания игры, приглашение будет отображаться всего 3 раза.

Ответ №1:

Еще раз приношу извинения за мой совершенно неправильный (и теперь удаленный) ответ, который я дал ранее. Я полагаю, что теперь я понимаю истинную причину вашей проблемы и как ее исправить:

Причина, по которой пользователю несколько раз запрашивается запрос, по одному разу за каждый раз, когда он ранее сказал «Да», заключается в том, что для каждого ответа «Да» вы снова вызывали 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 , что предотвращает повторный запуск цикла.