В то время как цикл «игнорирует» ввод? - PullRequest
0 голосов
/ 01 ноября 2011

Хорошо, вот мой код:

public static void playAgain(Scanner in){
    System.out.print("Play again?: ");
    String again=in.next();
    if (again.equalsIgnoreCase("y")){
        playerScore=0;
        aiScore=0;
        playAgain=true;
        }
    else if (again.equalsIgnoreCase("n")){
        playAgain=false;
        }
    else {
        while (!again.equalsIgnoreCase("y") && !again.equalsIgnoreCase("n")){
            System.out.print("Invalid response.  Please enter \"y\" or \"n\": ");
            again=in.next();
            }
        }
    }

По какой-то причине, если я введу неправильную переменную, скажем 'boog', цикл while выводит сообщение об ошибке, но по какой-то причине по умолчанию используется значение 'y', даже если я ввожу 'n' - например, образец запуска будет быть:

Играть снова? Буг

Неверный ввод, пожалуйста, введите y или n. п

-программа воспроизводится снова, несмотря на мой ввод n-

Как мне это исправить? Это что-то с заказом? Заранее спасибо!

Ответы [ 5 ]

4 голосов
/ 01 ноября 2011

Я предполагаю, что вы используете какую-то глобальную переменную playAgain, чтобы указать, следует ли снова играть.Я бы вернул boolean из функции, но в любом случае я не вижу, чтобы playAgain был изменен в последнем else блоке:

 else {
        while (!again.equalsIgnoreCase("y") && !again.equalsIgnoreCase("n")){
            System.out.print("Invalid response.  Please enter \"y\" or \"n\": ");
            again=in.next();
            }
        }

Возможно, вам нужен весь набор if s в цикле while, поэтому again будет обрабатываться после того, как он содержит "y" или "n"?В любом случае, структура функции нуждается в переосмыслении.

РЕДАКТИРОВАТЬ: Мой подход будет выглядеть примерно так:

public static boolean playAgain(Scanner in){
   System.out.print("Play again?: ");
   String again=in.next();

   while (!again.equalsIgnoreCase("y") && !again.equalsIgnoreCase("n")) {
      System.out.print("Invalid response.  Please enter \"y\" or \"n\": ");
      again = in.next();
   }

   if (again.equalsIgnoreCase("y")){
      playerScore = 0;
      aiScore = 0;
      return true;
   }

   // there are only two valid options, so to get here it must be "n"
   return false;
}
3 голосов
/ 01 ноября 2011

Это может быть потому, что вы не устанавливаете playAgain в false после выхода из цикла while. Предыдущее значение playAgain true?

Я думаю, вам нужно подумать о рефакторинге, чтобы цикл while находился выше операторов 'y' и 'n' if / else. Таким образом, if / else всегда вызывается, когда пользователь вводит правильное значение. Проверка должна быть в начале метода.

3 голосов
/ 01 ноября 2011

В последней ветви else после того, как вы получили действительный ввод из цикла while, вы не устанавливаете переменную playAgain, поэтому она сохраняет то значение, которое имело - true в этом случае. Вы должны установить его в соответствии с вводом.

0 голосов
/ 01 ноября 2011

Плохой поток.Вы должны сделать что-то вроде этого (извините за любые ошибки, это было тщательно набрано на моем телефоне:

public static void playAgain(Scanner in){
   System.out.print("Play again?: ");
      while (true) {
         String again=in.next();
         if (again.equalsIgnoreCase("y")){
            playerScore=0;
            aiScore=0;
            playAgain=true;
                break; 
         } else if (again.equalsIgnoreCase("n")){
            playAgain=false;
            break;
         } else {
            // bad input, so allow to loop again
            System.out.print("Invalid input! Please enter y or n");
         } 
      }
}
0 голосов
/ 01 ноября 2011

Как я вижу, ваша программа имеет недостатки.

  1. if-else должен быть внутри другого цикла while (например, бесконечный цикл или выход в случае again ==n). так что каждый раз при вводе элемента scanner.next () будет выполняться логика повторного воспроизведения.
  2. цикл while выполняет код и работает нормально, так как вы не получили предупреждение «Неверный ввод, пожалуйста, введите y или n». еще раз.

Таким образом, значение again было "n" и, следовательно, логика вышла из вашего цикла while. поэтому проверьте, установлен ли playAgain как true

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