2015-06-22 3 views
1

Я программирую текстовую RPG-игру для Android, чтобы познакомиться с Java и XML. Я хочу показать строковый массив вариантов в ListView кнопок, и в зависимости от того, какая кнопка нажата, я хочу обновить действие соответствующим новым набором вариантов.Альтернатива 1000s операторов if-then-else

Например, позволяет сказать, что игра начинается со следующими вариантами:

{option1, option2, option3, option4} 

Если пользователь нажимает на option2 я хочу, чтобы отобразить:

{2-option1, 2-option2, 2-option3, 2-option4} 

или позволяет сказать, что пользователь нажал на 4 вместо 2. Затем:

{4-option1, 4-option2, 4-option3, 4-option4} 

Итак, я пытаюсь определить скорость, эффективную/память eff способ определения следующего String[] для отображения.

Первоначально я думал о построении дерева GIANT if-then-else (или оператора switch - не имеет значения), где бы была инструкция if для каждой возможной опции. Например:

// choice это выбранный пользователем вариант

if(choice==option1){ 
    return {"1-option1", "1-option2", "1-option3"} 
}else if(choice== 1-option1){ 
    return {"1-1-option1","1-1-option2","1-1-option3"} 

И список будет продолжаться и дальше, пока каждый возможный выбор не возвращает String [], который соответствует следующей группе вариантов, которые являются для отображения.

Тогда я начал думать, может быть, было бы чище и проще это сделать с объектами:

MyObject newObject = MyObject(choice) 
    newObject.getOptions() 

где choice является параметр конструктора, который инициализирует String[] к надлежащему следующему набору параметров; и getOptions() возвращает это String[]

Однако, это будет много объектов, и я не уверен, что это упростит работу над методом if/switch.

Итак, любые идеи эффективного способа справиться с чем-то подобным?

+0

Уродливые, ломкие, неподъемные. Вы должны беспокоиться об этом, прежде чем думать об эффективности. – duffymo

+0

Я согласен, поэтому я хочу решить эту «головоломку» с надлежащей структурой, и я считаю, что метод if/switch или метод объекта, который я предложил, недостаточны. –

+0

Имеет ли он более двух уровней? Он может быть определен в XML и unmarshalled в иерархическом наборе объектов набора опций. – laune

ответ

5

Используйте Map (возможно, HashMap) внутри вашего объекта, чтобы связать "option2" с {"2-option1", "2-option2", "2-option3", "2-option4"}.

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

+0

то, что он возвращает, является массивом .. поэтому вам нужно сохранить массив в значении стороны hashmap .. не может использовать {"abcd", "aa", "bb"} напрямую –

+0

Конечно, вы можете сохранить массив в значение карты. – duffymo

0

Преобразование концепции в более общую: всегда существует текущее состояние, и для этого состояния может быть множество параметров. Затем выбор можно понять просто как запуск состояний.

Таким образом, вы могли бы просто смоделировать, что в XML как:

<state name="Main Menu"> 
    <option name="Buy" newState="Shop"/> 
</state> 
<state name="Shop> 
    <option name="Exit" newState="Main Menu"/> 
</state> 

государственных и вариант могут быть легко моделируются как классы. Нет необходимости в сложном коде, просто поместите все существующие состояния в карту. Для изменения состояния просто спросите карту для состояния, которое принадлежит этому имени состояния, и установите это состояние как текущее состояние ...

1

Вы будете нуждаться в одноэлементный объект как OptionProvider методами, такими как:

- List<Option> getFirstOptions() 
- List<Option> getNextOptions(Option option) 

Этот объект может содержать информацию о том, какие варианты приходят после того, какой вариант в карте, как Map<Option,List<Option>>. Вы можете заполнить карту вручную или заполнить данные из файла XML или базы данных.

Тогда вы можете иметь служебный класс, как DisplayOptionUtils с методом, как:

- String getOptionPrompt(List<Option> chosenOptions, List<Option> nextAvailableOptions) 

Это будет возвращать так, как вы хотите, чтобы ваши варианты, по всей видимости пользователя (он может, например, использовать StringBuilder для создайте то, что вам нужно).

Затем в главном классе вы можете иметь что-то вроде этого:

List<Option> chosenOptions = new ArrayList<>(); 
List<Option> nextOptions = OptionProvider.getInstance().getFirstOptions(); 
while(!nextOptions.isEmpty()) { 
    System.out.println(DisplayOptionUtils.getOptionPrompt(chosenOptions, nextOptions); 
    Option selectedOption = Option.getByValue(getUserInput()); 
    chosenOptions.add(selectedOption); 
    nextOptions = OptionProvider.getInstance().getNextOptions(selectedOption); 
} 

Этот проект не является совершенным (я пришел с ней в течение 10 минут), но, надеюсь, это даст вам в идее о том, как достичь что ты хочешь.