2016-03-10 3 views
3

Я в настоящее время работает на Android приложение для моего колледжа, позвольте мне дать вам быструю презентацию:Android, хранение и извлечение текста

Там есть история которой игрок может прочитать, и тогда он будет иметь 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 в Дереве?

Я вижу, что мои объяснения немного беспорядочны, поэтому, пожалуйста, скажите мне, что они что-то не понимают. (или если это мой сломанный английский)

Спасибо за ответ!

+0

Hm. Интересный вопрос. Позвольте мне спросить вас об этом: абсолютные пути? Как и тот же выбор всегда ведет по тому же пути? Или рассказы и варианты могут смешиваться друг с другом? Как я мог бы быть 5 уровней в глубине истории 1, а затем получить выбор 33 как один из моих выборов? Если нет, я думаю, что JSON может работать очень хорошо, чтобы построить эту структуру. – NoChinDeluxe

+0

Ну, я думал, чтобы пути были абсолютными и не смешивались, но я должен признать, что вы поднимаете интересный момент, это может избавить меня от многих ресурсов, чтобы привести к другой ветке дерева. Но я должен был бы вернуть значение, которое говорит мне, куда идти, поскольку оно будет проходить совершенно по-другому. Я не знаю JSON, я постараюсь это увидеть, спасибо за ваш ответ! – FloLp

ответ

2

Немного поучав этот вопрос, я в основном придумал аналогичную идею для ответа Кенни Бьюна, но я бы как бы наполнить его каким-то фактическим кодом, чтобы показать вам, как он будет работать.

Прежде всего, я бы сохранил каждую отдельную историю в своем собственном объекте JSON. Я не знаю, что они должны были быть в отдельных файлах, как предложил Кенни, так как они могли бы легко содержаться в отдельных объектах в массиве JSON в одном файле. Структура будет следующей.

Каждый объект в массиве будет «сюжетным» объектом. Это содержит индекс или какой-то идентификатор, чтобы идентифицировать его как уникальную историю. Затем он содержит текст истории и массив из трех объектов «выбор». Объекты выбора аналогичны тем, что каждый из них содержит идентификатор или индекс, некоторый текст и значение «lead_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 или что-то в этом роде. Итак, вы всегда можете проверить, есть ли leads_to_story < 0 и узнать, умер ли игрок.

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

6

Лично я бы поместил каждый сценарий в один файл JSON, каждый из которых имеет ключ, указывающий на следующее имя файла, если нет необходимости переводить какие-либо из ваших активов. Вы можете загрузить первый файл (или последнее сохранение) во время выполнения. Имя файла сценария будет самосохранение.

Однако, если вам нужен перевод для любой из сюжетных линий, вы можете захотеть сбросить его в «strings.xml», а затем создать дерево во время выполнения со ссылками на соответствующие идентификаторы R.string. Однако идентификатор R.string не должен использоваться в качестве сохранения в этом случае, поскольку он может изменяться между компиляциями.В каждом сценарии истории, вероятно, должен быть идентификатор сценария, который никогда не должен быть изменен (переименование сделало бы это)

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