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