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

680
09 августа 2017, 17:25

Нужно реализовать класс Quest в котором будут хранятся шаги.

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

Answer 1

В общем, @VladD абсолютно прав, вам нужен конечный автомат (в английской терминологии state machine), и желательно разобраться что это такое подробнее, но я попробую показать простой для понимания пример не используя пока специфическую терминологию.

Вам попадались книги-игры Дмитрия Браславского? В прочем если бы попадались, вопрос бы не возник.

И так, что такое текстовый квест? Это набор параграфов, описывающих некоторые игровые сцены в которых игроку требуется принять некоторое решение, чтобы перейти к другой сцене. Ок, от этого и пойдем.

  1. Пронумеруем все параграфы в произвольном порядке. Для книги нумерация имеет значение, для компьютерного варианта - нет.

  2. Размещаем параграфы в массив согласно сделанной нумерации.

  3. Каждый выбор игрока, фактически, означает выбор следующего параграфа, но выбор в слепую, т.к. игрок не знает содержимое параграфа (во всяком случае в первой игре). Таким образом, необходимо сопоставить предлагаемые игроку действия на текущей сцене с номерами параграфов на который они ведут.

  4. Когда игрок сделал свой выбор, мы просто показываем ему текст следующего параграфа с соответствующим индексом в массиве и ожидаем следующего выбора игрока, разумеется если это выбор у него есть в данной сцене.

Естественно возможен вариант, когда игрок может попасть на одну и туже сцену (параграф) разными путями.

Таким образом, вам достаточно одного единственного класса для описания модели вашего квеста, при этом ни чего мудреного не требуется. Для консольного варианта достаточно базовых знаний 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<Choise> Choises {get;} = new List<Choise>();
} 
class Choise
{
    public int NextParagraph {get; set;}
    public string Text {get; set;} //текст варианта выбора для игрока
} 
class Quest
{
    Paragraph Current {get; set;}
    //Если номера параграфов соответствуют индексам можно так
    List<Paragraph> {get;} = new List<Paragraph>();
    //Если лень следить за соответствием - так
    Dictionary<int, Paragraph> {get;} = new Dictionary<int, Paragraph>();
}                                    

Если знаете что такое направленный граф, то можно еще проще

class Paragraph //параграф (игровая сцена)
{
    public string Text {get; set;} //текст параграфа
    //доступные варианты, список может быть нулевой длины, но не null.
    public List<Choise> Choises {get;} = new List<Choise>();
} 
class Choise
{
    public Paragraph Next {get; set;}
    public string Text {get; set;} //текст варианта выбора для игрока
} 
class Quest
{
    Paragraph Current {get; set;}
    Paragraph StartPoint {get; set;};
}         

С кодом ввода выбора игрока и вывода текста на экран, думаю сами справитесь.

READ ALSO
Работа с HtmlAgilityPack

Работа с HtmlAgilityPack

Нужна помощьМне требуется распарсить HTML-страницу после нажатия на ней на некоторую кнопку

288
c# webbrowser запуск ролика youtube c кнопки

c# webbrowser запуск ролика youtube c кнопки

ЗдравствуйтеНе подскажите возможно ли запустить погруженный ролик с ютуба с кнопки? И если нет, то как можно сделать запрет на клик правой...

265
Получить fps сторонней игры

Получить fps сторонней игры

Нужно получить fps из, допустим, доты в реальном времени для того чтобы передать их в com-portУстройство на другом конце порта будет это отображать

260
Поле видимости ИД в паршалах

Поле видимости ИД в паршалах

Теоретический вопрос, в один view вложены два partialЕсли в одном прописан id(например id=name) видна ли id из другого partial?

314