2015-10-30 2 views
0

Я пытаюсь создать игру из камня, бумаги, ножниц, которая требует действительного ввода от пользователя, прежде чем продолжить. Как я пытался это решить, это сделать цикл while и инструкцию if else, чтобы проверить вход. Если это что-то иное, чем выбранные варианты, то условие остается ложным и программа пеет. Однако я пытался выяснить, как вернуть правильное значение, которое вводит пользователь, который хранится в UserChoice, чтобы я мог получить доступ к переменной за пределами цикла и продолжить работу с программой.Как вернуть значение из цикла do while

Вот мой код:

do{ 
    System.out.println("Enter in rock, paper or scissors:"); 
    Scanner user = new Scanner(System.in); 
    String UserChoice = user.nextLine(); 

    if(!UserChoice.equals("rock") && (!UserChoice.equals("paper")) && (!UserChoice.equals("scissors"))){ 
     System.out.println("You must enter either rock, paper or scissors. Try again: "); 
    }else{ 
     isRight = true; 
    } 
}while(isRight==false); 
+2

объявляет переменную за пределами цикла и сохраняет ее в этой переменной – Stultuske

+1

предпочитает 'while (! IsRight)' – Bohemian

ответ

1

Просто переместите объявление переменной из цикла, чтобы сделать его доступным из объема блока делать-то время, так же, как:

String userChoice = null; 
do{ 
    System.out.println("Enter in rock, paper or scissors:"); 
    Scanner user = new Scanner(System.in); 
    userChoice = user.nextLine(); 

    if(!"rock".equals(userChoice) && (!"paper".equals(userChoice)) && (!"scissors".equals(userChoice))){ 
     System.out.println("You must enter either rock, paper or scissors. Try again: "); 
    }else{ 
     isRight = true; 
    } 

}while(isRight==false); 

//here you can still use it 
System.out.println(userChoice); 

Вы можете прочитать о переменных областях, например here.

И только некоторые замечания. Предполагается использовать нотацию "rock".equals(userChoice) при вызове equals, чтобы предотвратить NullPointerException, если ваш объект userChoice будет NULL по любой причине. Кроме того, вы можете переместить эту строку Scanner user = new Scanner(System.in); из цикла. Нет причин создавать новый экземпляр сканера на каждой итерации. И последнее, в то время как условие isRight==false может быть заменено !isRight, нет необходимости сравнивать его с чем-то, так как переменная имеет значение boolean.

1

Инициализировать UserChoice перед тем, как сделать.

String UserChoice = ""; 

do 
.... 

while(); 

System.out.println(UserChoice); 
1

Рядом объявить переменную вне цикла (как я предложил в комментариях ранее) несколько замечаний о вашем коде:

   System.out.println("Enter in rock, paper or scissors:"); 
       Scanner user = new Scanner(System.in); 
       String userChoice = user.nextLine(); //stick to naming conventions, it makes your code easier to read 



       while(!userChoice.equals("rock") && (!userChoice.equals("paper")) && (!userChoice.equals("scissors"))){ 
        System.out.println("You must enter either rock, paper or scissors. Try again: "); 
      System.out.println("Enter in rock, paper or scissors:"); 
       userChoice = user.nextLine(); //stick to naming 
      } 

Там нет никакой необходимости в цикле, что весь блок кода каждый раз. Все, что нужно повторить, - это сообщение об ошибке и чтение нового значения для userChoice, и только в том случае, если исходная запись была недействительной.

В вашем коде, например, вы создаете новый экземпляр сканера при каждом цикле, в то время как вы можете просто повторно использовать существующий.

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