2016-02-17 2 views
0

У меня возникла проблема с проверкой ввода. Я написал программу, в которой два человека имитируют игру в кости. Фактический игровой код в порядке, но я просто не знаю, почему у меня бесконечный цикл, когда я снова пытаюсь запустить программу. В принципе, если пользователь вводит «Y», программа снова запустится, если они будут вводить «N», программа закончится, и если они поступят что-либо, кроме Y или N, появится приглашение: «Хотите снова сыграть?» Является ли следующий код правильным или мне нужно его немного изменить (в основном я имею в виду код проверки ввода)?Бесконечные петли при подтверждении ввода

do{ 
     System.out.print("Would you like to play again? (Y/N): "); 
     String command = input.next(); 
     if(input.hasNextLine()){ 
      if(command.equals("Y") || command.equals("y")){ 
       die1 = rand.nextInt(6) + 1; 
       die2 = rand.nextInt(6) + 1; 
       die3 = rand.nextInt(6) + 1; 
       die4 = rand.nextInt(6) + 1; 
       sum = die1 + die2; 
       sum2 = die3 + die4; 

       System.out.printf("%s rolled a %d and %d for a total of %d. %n", name1, die1, die2, sum); 
       System.out.printf("%s rolled a %d and %d for a total of %d. %n", name2, die3, die4, sum2); 

       if(sum > sum2){ 
        System.out.println(name1 + " " + "won!"); 
       } 
       else if (sum2 > sum){ 
        System.out.println(name2 + " " + "won!"); 
       } 
       else if (sum == sum2){ 
        System.out.println(name1 + " " + "and" + " " + name2 + " " + "tied!"); 
       } 

       game = input.nextLine(); 
     } 
     else if(command.equals("N") || command.equals("n")){ 
      System.exit(1); 
     } 
     } 
    }while(!validInput); 
} 

}

Edit: Я удалил весь код и просто вставить кусок кода, который был в вопрос, но это правильно ... Еще раз спасибо!

+4

'if (input.equals (YES) || input.equals (YES2)) {' никогда не будет 'истинным', потому что' input' является 'Scanner', вам нужно вызвать' nextLine' и сохранить его где-нибудь. –

+0

Есть ли способ вокруг него? –

+0

сначала после вопроса, напишите 'String command = input.next()' и измените 'if (input.equals (YES) || input.equals (YES2))', 'if (command.equals (" y ") || command.equals ("Y")) ' – MaxG

ответ

0

input является Scanner объектом и никогда не будет равен YES или YES2 которые String объектов. Вы должны использовать nextLine, чтобы прочитать следующий String и сохранить это значение в переменной, такой как response. Затем вы можете сравнить response с YES и другими строками.

do { 
     System.out.print("Would you like to play again? (Y/N): "); 
     String response = input.nextLine(); 
     if (response.equalsIgnoreCase(YES)) { 
      die1 = rand.nextInt(6) + 1; 
      die2 = rand.nextInt(6) + 1; 
      die3 = rand.nextInt(6) + 1; 
      die4 = rand.nextInt(6) + 1; 
      sum = die1 + die2; 
      sum2 = die3 + die4; 

      System.out.printf("%s rolled a %d and %d for a total of %d. %n", name1, die1, die2, sum); 
      System.out.printf("%s rolled a %d and %d for a total of %d. %n", name2, die3, die4, sum2); 
      game = input.nextLine(); 
      break; 
     } else if (response.equalsIgnoreCase(NO)) { 
      System.exit(1); 
     } 
    } while (validInput); 
0

Вы не должны получить все фантазии с петлей сделай в то время как, если ваш собирается прекратить программу через System.exit(), вы можете просто окружить вашу программу некоторое время (правда) цикла. Также не вижу необходимости в hasNextLine здесь. Вы можете сократить валидацию ввода с помощью equalsIgnoreCase («y»). Также обычно рекомендуется объявлять переменные за пределами цикла. (т. е. команда String, снаружи команда = «материал» внутри). Я не уверен, как это будет работать в этом конкретном случае, но много раз вы столкнетесь с ошибками, пытаясь переопределить переменные.

Проблема с вашей петлей, хотя я вижу, что у вас нет предложения else, которое касается ввода, если пользователь вводит что-то другое, кроме «Y» или «N». В конце вы можете сделать предложение else, которое завершает программу, если этот другой ввод введен, или вы можете просто использовать continue; чтобы начать программировать снова.

Смежные вопросы