2013-08-25 4 views
2

Я создаю текстовую RPG-игру, и я создаю метод selectClass. Смотрите код:Пока не равно String

public static void classChoice(){ 
    String cont =null; 
    String[] classes = {"rogue", "wizard", "knight", "archer"}; 
    Scanner input = new Scanner(System.in); 
    do{ 
     System.out.println("Choose your class (Rogue, Wizard, Knight, Archer): "); 
     cont = input.next(); 
     if (cont.equalsIgnoreCase("rogue")){ 
      System.out.println("You have chosen the Rogue!"); 
     } else if (cont.equalsIgnoreCase("wizard")) { 
      System.out.println("You have chosen the Wizard!"); 
     } else if (cont.equalsIgnoreCase("knight")) { 
      System.out.println("You have chosen the Knight!"); 
     } else if (cont.equalsIgnoreCase("archer")) { 
      System.out.println("You have chosen the Archer!"); 
     } else { 
      System.out.println("Choose a valid class!"); 
     } 
    } while(!cont.equals(classes)); 
} 

Так что я сделал массив строк для всех классов, и я думал, что я мог бы сделать пользовательский ввод «прод» и сказать, что в то время как он не равен ни одному из «классов «значения массива», затем напечатайте сообщение «Выберите действительный класс!». Он не работает, никаких идей?

ответ

4

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

+0

Я думаю, что это лучший ответ. Это упростило бы код и обеспечило бы простые для использования значения. –

+0

Согласен. Каждый раз, когда у вас есть список констант, известных во время компиляции, вы должны автоматически думать об их выражении как 'enum'. Вы даже можете расширять перечисления Java, чтобы каждый объект перечисления мог содержать все метаданные для каждого класса символов, а также методы, которые работают на нем. Enums - это действительно способ пойти в таких случаях. – scottb

1

это будет проверить, если значение прод в массиве:

while (!classes.asList("rogue", "wizard", "knight", "archer").contains(cont)) 

Вы пытаетесь сравнить строку прод с классами массивов.

9

cont.equals(classes) не проверяет, cont находится в classes. Он проверяет, равен ли contclasses. Поскольку cont - это строка, а classes - это массив строк, это никогда не будет правдой.

Я рекомендую использовать Arrays.asList, чтобы составить список классов. Затем вы можете проверить, содержит ли список cont:

classes = Arrays.asList("rogue", "wizard", "knight", "archer"); 

... while (!classes.contains(cont)); 
+0

Кроме того, цикл foreach тщательно очищает многочисленные if-elseifs. – Vulcan

+0

@ Vulcan: Действительно. Довольно глупо определять «классы», а затем использовать его только для теста do-while. – user2357112

+0

Сделал ваш оператор while и получил сообщение об ошибке «Синтаксическая ошибка, вставить» в то время как (выражение); «для завершения DoStatement» –

1

заявление, в то время как блок неверен. Вы не должны сравнивать con с классами array

2

Вы не можете сравнить ни одну строку с массивом строк. Правильный способ думать об этой логике: «содержит ли набор допустимых классов то, что пользователь вводил?». Небольшой отрывок из того, что это может выглядеть следующим образом:

Set<String> classes = new HashSet<String>(Arrays.asList("Rogue", "Wizard")); // ...etc. 
while (!classes.contains(cont)); 
2

cont является String и classes является String[] (массив строк), поэтому они никогда не будут равны. То, что вы хотите знать, это classes содержит cont. Я бы предложил изменить классы на List<String>, чтобы вы могли использовать метод contains.

final List<String> CLASSES = Arrays.asList("rogue", "wizard", "knight", "archer"); 

А потом

while(!CLASSES.contains(cont)); 

Тем не менее, ваши имена переменных и общий дизайн мог бы использовать какую-то работу. Для стартеров cont следует, вероятно, назвать что-то более наглядным, как userClassChoice.

2

Я не знаю, если вы на самом деле нужно массив, но давайте предположим, что вы делаете:

String[] classes = {"rogue", "wizard", "knight", "archer"}; 
List<String> list = Arrays.asList(classes); 
    Scanner input = new Scanner(System.in); 
do (
    System.out.println("Choose your class (Rogue, Wizard, Knight, Archer): "); 
    cont = input.next(); 
} while (!list.contains(cont.toLowerCase())) 

Вы можете уточнить, но это основы то, что будет работать.

+0

Это сработало, я новичок в массивах благодаря помощи. –

1

Среди других вещей, у вас есть ошибка синтаксиса:

if (cont.equalsIgnoreCase("rogue")){ 
    System.out.println("You have chosen the Rogue!"); 
} // <<< -- syntax error 
}else if(cont.equalsIgnoreCase("wizard")){ 

Если вы отступом код правильно, что ошибка будет намного легче увидеть.

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