#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
, что предотвращает повторный запуск цикла.