我正在为我的大学开发一个Android应用程序,让我给你一个快速的演示:
玩家可以阅读一个故事,然后他将有3个选择,他将选择一个,另一个故事将再次显示3个选项,所以它继续……(但每个选择都会导致完全不同故事)
你可以猜到,我有很多文本需要存储,分类和检索.第一页显示第一个故事和3个选项,如果玩家选择并点击按钮,则会出现以下故事,但它也可能意味着结束(显然,如果我总是保留3条路径X 3路径X 3路径…它会变得复杂)
_______________我在想什么____________________________
所以我的第一个猜测是使用一个xml文件,一个包含每个故事,另一个包含各种选择.
在应用程序打开时,我将使用解析器来运行该文件并将每个字符串放在树结构中. (故事中有一棵树,我想的是另一棵树)
我想使用数字来构建它,例如,如果你当前在1并且你点击选择2然后你在前一个故事的末尾再添加2,它将变为12,然后如果你点击选择3 ,它变成123等……
我虽然对树更容易,但是,xml只给出一个标签名称,所以我想使用story1,story11,story12,story13等…
What the structure of my xml should look like (or my tree)
但是因为我想使用数字,所以已经很难在树中对它进行分类,我必须得到一个带有parser.parName()的字符串,然后我需要子字符串来获取最后的数字,并且只是为了检索节点应该采取一些资源.
在其他方面,我越是想到它,我就越想到复杂的想法,所以我需要一些聪明的人来告诉我去哪里. (我明显迷失在路上)
__________________________________ 我的问题 ____________________________
如果你觉得这个很聪明,这是我的问题
你会用什么来存储文字?一个Xml文件?那之后你会用一棵树吗?你会怎么做,有效地将xml分类到树中?
我可以看到我的解释有点混乱,所以请告诉我他们是否是你不理解的东西. (或者如果是我破碎的英语)
谢谢回答 !
解决方法:
在仔细思考这个问题之后,我基本上想出了一个与Kenny Byun的答案类似的想法,但我想用一些实际的代码来充实它,以向你展示它是如何工作的.
首先,我会将每个故事存储在自己的JSON对象中.我不知道他们需要像Kenny建议的那样在单独的文件中,因为它们可以很容易地包含在单个文件中的JSON数组中的单独对象中.结构如下.
数组中的每个对象都是“故事”对象.这包含一个索引或某种id,以将其标识为一个独特的故事.然后它包含它的故事文本和3个“选择”对象的数组.选择对象是相似的,因为它们每个都包含一个id或索引,一些文本和一个“leads_to_story”值,它基本上标识了这个选择导致的故事.看起来像这样……
[
{
"story_index" : 0,
"story_text" : "It was a dark and stormy night. Three doors stand before you. You must choose one.",
"choices" : [
{
"choice_index" : 0,
"choice_text" : "Door 1",
"leads_to_story" : 1
},
{
"choice_index" : 1,
"choice_text" : "Door 2",
"leads_to_story" : 2
},
{
"choice_index" : 2,
"choice_text" : "Door 3",
"leads_to_story" : 3
}
]
},
{
"story_index" : 1,
"story_text" : "You choose door 1 and enter cautIoUsly. You find a bunny rabbit.",
"choices" : [
{
"choice_index" : 0,
"choice_text" : "Pet the bunny rabbit.",
"leads_to_story" : 4
},
{
"choice_index" : 1,
"choice_text" : "Kill the bunny rabbit.",
"leads_to_story" : 5
},
{
"choice_index" : 2,
"choice_text" : "Ask the bunny rabbit its name.",
"leads_to_story" : 6
}
]
}
]
现在您已经以有条理的方式存储了所有故事和选择数据,我将创建两个类来存储此数据以便在运行时进行访问.所以我会创建一个Story类和一个Choice类.他们可能看起来像这样……
public class Story {
public int index;
public String text;
public Choice[] choices;
public Story(int index, String text, Choice[] choices) {
this.index = index;
this.text = text;
this.choices = choices;
}
}
public class Choice {
public String text;
public int leads_to_story;
public Choice(String text, int leads_to_story) {
this.text = text;
this.leads_to_story = leads_to_story;
}
}
这将允许您将所有故事数据加载到有组织的对象中,然后可以从按数字顺序放置的Story对象数组中访问这些对象.因此,当您需要某个故事时,您只需从数组中调用该索引即可.您的工作流程可能看起来像这样……
//if this is a new game...
//Load and parse the JSON into a local array,
//placing the stories in numerical order
ArrayList<Story> stories = getStories();
//Present story 0, since this is a new game...
TextView textView = (TextView) findViewById(R.id.story_text);
Story story = stories.get(0);
String storyText = story.text;
textView.setText(storyText);
//The player makes his choice, so you Now
//get the leads_to_story value to find out
//where to go next...
int playerChoice = 1; //whatever they choose
int nextStory = story.choices[playerChoice].leads_to_story;
//New screen loads or is initialized,
//and we load the new story...
Story story = stories.get(nextStory);
//...repeat the process...
对于“死亡”场景,我可能只有一个索引为-1的故事对象或类似的东西.那么你可以随时测试lead_to_story< 0并知道玩家是否死亡. 希望这能为您提供一些如何使事情易于管理和组织的想法.在这些类型的场景中,我总是试图找到处理数据的“聪明”方式,但通常情况下,简单实用的方法可以更好地工作,并使事物更易读和易于管理.希望这可以帮助!