Страницы

Поиск по вопросам

четверг, 18 октября 2018 г.

Как начать делать текстовый квест?

Нужно реализовать класс Quest в котором будут хранятся шаги.
Шаги представляют собой класс с каким-то текстом и вариантами выбора. Пользователь сам добавляет шаги и варианты выбора, которые в свою очереди ведут к следующим шагам (сценам) в зависимости от выбора игрока. Как я понимаю каждый выбор должен иметь ссылку на следующий шаг (сцену). Но как это реализовать в коде не понимаю.


Ответ

В общем, @VladD абсолютно прав, вам нужен конечный автомат (в английской терминологии state machine), и желательно разобраться что это такое подробнее, но я попробую показать простой для понимания пример не используя пока специфическую терминологию.
Вам попадались книги-игры Дмитрия Браславского? В прочем если бы попадались, вопрос бы не возник.
И так, что такое текстовый квест? Это набор параграфов, описывающих некоторые игровые сцены в которых игроку требуется принять некоторое решение, чтобы перейти к другой сцене. Ок, от этого и пойдем.
Пронумеруем все параграфы в произвольном порядке. Для книги нумерация имеет значение, для компьютерного варианта - нет. Размещаем параграфы в массив согласно сделанной нумерации. Каждый выбор игрока, фактически, означает выбор следующего параграфа, но выбор в слепую, т.к. игрок не знает содержимое параграфа (во всяком случае в первой игре). Таким образом, необходимо сопоставить предлагаемые игроку действия на текущей сцене с номерами параграфов на который они ведут. Когда игрок сделал свой выбор, мы просто показываем ему текст следующего параграфа с соответствующим индексом в массиве и ожидаем следующего выбора игрока, разумеется если это выбор у него есть в данной сцене.
Естественно возможен вариант, когда игрок может попасть на одну и туже сцену (параграф) разными путями.
Таким образом, вам достаточно одного единственного класса для описания модели вашего квеста, при этом ни чего мудреного не требуется. Для консольного варианта достаточно базовых знаний C#: синтаксис, условия, массивы, циклы. ну и немного стандартных классов для организации ввода/вывода.
В эту модель прекрасно вписывается и "боевка" с бросанием кубиков, и применение ранее приобретенных вещей, если сцена предполагает возможность их применения.
Какую к данной модели приделать "шкурку": консоль, или развесистый графический интерфейс с иллюстрациями и музыкой, не имеет значения, т.к. самое сложное в данном типе игр - создать сюжет и написать тексты игровых сцен, чтобы они не были все на одно лицо.
Единственное что я бы посоветовал лично от себя - не показывайте игроку настоящие номера параграфов, спрячьте их за кнопками с текстом, локальными номерами (1,2,3 и т.д. по количеству вариантов выбора в сцене) для консоли, ссылками для Web-версии. Так интереснее, и больше вероятность, что игрок хотя бы прочитает (а может и запомнит) текст над которым вы или ваш сценарист трудились, создавая квест.

Ну и немного кода для иллюстрации возможной (но не единственной) реализации такой модели:
Простейший вариант для консоли с одним классом:
class Quest { public string[] Paragraphs {get; set;} public int[][] Choises {get; set;} //Для консольного варианта вы просто отображаете номера для выбора прямо в тексте //параграфа, рядом с описанием выбора, как в книжном варианте. }
Более сложный пример:
class Paragraph //параграф (игровая сцена) { public int Num {get; set;}//не особо нужен, но для полной картины пусть будет public string Text {get; set;} //доступные варианты, список может быть нулевой длины, но не null. public List Choises {get;} = new List(); }
class Choise { public int NextParagraph {get; set;} public string Text {get; set;} //текст варианта выбора для игрока }
class Quest { Paragraph Current {get; set;} //Если номера параграфов соответствуют индексам можно так List {get;} = new List(); //Если лень следить за соответствием - так Dictionary {get;} = new Dictionary(); }
Если знаете что такое направленный граф, то можно еще проще
class Paragraph //параграф (игровая сцена) { public string Text {get; set;} //текст параграфа //доступные варианты, список может быть нулевой длины, но не null. public List Choises {get;} = new List(); }
class Choise { public Paragraph Next {get; set;} public string Text {get; set;} //текст варианта выбора для игрока }
class Quest { Paragraph Current {get; set;} Paragraph StartPoint {get; set;}; }
С кодом ввода выбора игрока и вывода текста на экран, думаю сами справитесь.

Комментариев нет:

Отправить комментарий