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

Я создал игру на угадывание, в которой у пользователя есть 6 попыток угадать число, в данном случае 50. После того, как пользователь правильно угадал число, ему предлагается вопрос «Хотите ли вы играть снова?».Если пользователь вводит yes, программа запускается снова.Проблема заключается в том, что когда пользователь вводит no после нескольких игр, ему предлагается одно и то же сообщение несколько раз.Я думаю, что проблема в том, что код циклически компенсирует каждый раз, когда пользователь вводит Да.

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

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

1 Ответ

0 голосов
/ 24 апреля 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...