我正在为Android编写基于文本的RPG游戏,以便熟悉Java和XML。我想在按钮的ListView中显示一个字符串数组选项,并且根据用户按下的按钮,我想用一组新选项相应地更新活动。
例如,假设游戏开始时有以下选择:
{option1, option2, option3, option4}
如果用户点击option2,我想显示:
{2-option1, 2-option2, 2-option3, 2-option4}
或者说让用户点击4而不是2.然后:
{4-option1, 4-option2, 4-option3, 4-option4}
所以,我正在尝试确定一种速度有效/内存有效的方法来确定要显示的下一个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"}
List将继续,直到每个可能的选择都返回一个String [],该[]对应于要显示的下一组选项。
然后,我开始考虑用对象做这个会更简洁,更容易:
MyObject newObject = MyObject(choice)
newObject.getOptions()
其中choice
是一个构造函数参数,用于将String[]
初始化为正确的下一组选项;和getOptions()返回此String[]
但是,这将是很多对象,我不确定它会简化if / switch语句方法。
那么,有什么想法可以有效地处理这样的事情吗?
答案 0 :(得分:5)
使用对象内部的Map(可能是HashMap)将"option2"
与{"2-option1", "2-option2", "2-option3", "2-option4"}
相关联。
数据结构选择在编程中非常重要。
答案 1 :(得分:1)
您将需要像 OptionProvider 这样的单一对象,其方法如下:
- List<Option> getFirstOptions()
- List<Option> getNextOptions(Option option)
此对象可以保存有关哪些选项位于地图中哪个选项之后的信息,例如Map<Option,List<Option>>
。您可以手动填充Map,也可以填充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分钟内提出它)但希望它会让你知道如何达到你想要的效果。
答案 2 :(得分:0)
将概念转换为更一般的概念:总有一个当前状态,并且该状态可能有一组选项。然后可以将选择简单地理解为触发状态转换。
所以你可以简单地用XML格式化它:
<state name="Main Menu">
<option name="Buy" newState="Shop"/>
</state>
<state name="Shop>
<option name="Exit" newState="Main Menu"/>
</state>
状态和选项可以轻松地建模为类。不需要复杂的代码,只需将所有现有状态放入Map中。要更改状态,只需向地图询问属于该州名称的状态,并将该状态设置为当前状态...