2015-08-08 1 views
4

Я создаю текстовую игру, используя C++ для школьного проекта, игра работает, позволяя пользователю выбирать из списка вариантов в каждой сцене; аналогично тому, как работают игры, размещенные Choice of Games. В результате этого у меня есть большой объем текста, который должен отображаться в моей игре, однако я не уверен относительно правильных соглашений при работе с большим количеством текста в программе. Должен ли я просто использовать std :: cout и написать текст непосредственно в коде или написать в текстовых файлах std :: ifstream, чтобы прочитать текст.Должен ли текст в текстовой игре на C++ находиться в коде или во внешних файлах?

Мое единственное серьезное беспокойство, связанное с использованием файлов для хранения текста, заключается в том, что каждый выбор пользователя приводит к результатам в другом абзаце, который отображается, и в результате я считаю, что мне нужно будет создать текстовый файл для каждого абзаца, похоже, что это приведет к большему количеству проблем (например, использование неправильного имени файла или опечатка моего кода, ведущего к чтению игры из неправильного файла), чем писать текст прямо в код. Если есть способ прочитать определенные разделы текстового файла, тогда это было бы полезно знать, однако я в настоящее время не знаю о каком-либо таком методе. Однако я новичок в C++, и я уверен, что мне еще предстоит узнать много, поэтому я не удивлюсь, если бы такой метод существовал.

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

ответ

3

Я рекомендую использовать внешние файлы. Это значительно облегчает изменение содержимого и не требует перекомпиляции всей программы для простой опечатки.

Вы можете использовать один файл и просто разделить каждый абзац на пустую строку. Захват «всего текста между пустыми строками» в этом пункте тривиален.

Если выбор вызывает выбор абзаца для перемещения по файлу, вы можете предоставить им идентификаторы и загрузить их «на лету», выполнив линейный поиск по файлу для заданного идентификатора.

--EDIT--

По запросу здесь алгоритм или два:

Алгоритм 1:

  1. Раздайте пункт идентификатор, как правило, простой номер на линии непосредственно над абзацем.
  2. Отделите каждую пару пара-пара пустых строк.
  3. Разбор строки по строке ищет строку, содержащую только число.
  4. С этого момента вы нашли абзац, который вы ищете, все строки, пока следующий пробел не станет содержимым этого абзаца.
  5. Показать для пользователя.

Алгоритм 2 (рекомендуется):

  1. Использование XML для хранения пунктов и их идентификаторы.
  2. Использование TinyXML2 для разбора файла: http://www.grinninglizard.com/tinyxml2/index.html
+1

У вас есть объяснение (или ссылка на него) относительно того, как вы выбираете, с какого пункта читать? –

10

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

Конвенция для большинства языков программирования состоит в том, чтобы поместить весь отображаемый текст в (несколько) файлов ресурсов или файлов свойств в виде пар ключ-значение, где код ссылается только на ключ для отображаемого абзаца, и значение будет загруженный из этого внешнего файла. (Обычно один раз при запуске.) Не нужно использовать один файл для каждого абзаца, но пары kv должны быть проанализированы. Там будут утилиты для повторного использования.

3

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

  • текст источника: легко писать, текст рядом с местом где он используется.
  • текст в файлах ресурсов: проще удалять повторяющиеся строки, создает лучшую структуру текстовых данных.

Если вы просто представляете, что ваше приложение может быть переведено, вы должны поместить весь текст в файлы ressource. Вы даже можете найти фреймворк, который поможет вам в переводах как Gnu gettext, но вы можете найти другие, например qt имеет свои собственные инструменты перевода.

3

Хранение текста в файлах программы не является хорошей практикой кодирования. Это приведет к ненужному раздуванию кода (это даже не код) и необходимости перекомпиляции, если вам нужно изменить текст.

Простым решением было бы создать текстовый файл с тщательным форматированием, например номера строк или пробелы, которые позволят вам вытащить нужный текст.

Более элегантным решением было бы разместить необходимый текст в файлах xml или json и, если необходимо, прочитать их в своей программе. Это был бы отличный выбор.

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