Нужно реализовать класс 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
class Choise
{
public int NextParagraph {get; set;}
public string Text {get; set;} //текст варианта выбора для игрока
}
class Quest
{
Paragraph Current {get; set;}
//Если номера параграфов соответствуют индексам можно так
List
Если знаете что такое направленный граф, то можно еще проще
class Paragraph //параграф (игровая сцена)
{
public string Text {get; set;} //текст параграфа
//доступные варианты, список может быть нулевой длины, но не null.
public List
class Choise
{
public Paragraph Next {get; set;}
public string Text {get; set;} //текст варианта выбора для игрока
}
class Quest
{
Paragraph Current {get; set;}
Paragraph StartPoint {get; set;};
}
С кодом ввода выбора игрока и вывода текста на экран, думаю сами справитесь.
Комментариев нет:
Отправить комментарий