#c_sharp
Нужно реализовать класс Quest в котором будут хранятся шаги. Шаги представляют собой класс с каким-то текстом и вариантами выбора. Пользователь сам добавляет шаги и варианты выбора, которые в свою очереди ведут к следующим шагам (сценам) в зависимости от выбора игрока. Как я понимаю каждый выбор должен иметь ссылку на следующий шаг (сцену). Но как это реализовать в коде не понимаю.
Ответы
Ответ 1
В общем, @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 ListChoises {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;}; } С кодом ввода выбора игрока и вывода текста на экран, думаю сами справитесь.
Комментариев нет:
Отправить комментарий