Избегайте невозможных состояний в приключенческой игре

15

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

Это будет история с несколькими ветвлениями, и иногда ветви будут складываться сами собой, и ваши основные действия будут запоминаться, а предметы будут собираться. Например, если игрок идет в болото и лес, прежде чем идти в замок, он подобрал кость динозавра, убил единорога и вырастил дополнительную руку. Если игрок попадает в замок через пещеры и склеп, он подхватывает велосипед и странный запах. Теперь, когда я разрабатываю головоломки для замка, я не хочу создавать ситуацию, в которой, например, необходимы две невозможности - дополнительная рука и запах, необходимые для убийства людоеда.

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

ДАНДАН
источник

Ответы:

11

Звучит как проблема ориентированного графа.

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

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

Теперь, с вашим законченным графиком: для каждой из ваших проблем, требующих элементов X + Y + Z, найдите все узлы, которые имеют эту проблему, и посмотрите, могут ли записанные элементы удовлетворить этому условию. Если произошел сбой, просто вернитесь к графику, чтобы найти все решения, которые привели вас туда, без необходимых элементов для решения этой проблемы.

Если вам повезет, ваш оригинальный дизайн уже разработан таким образом, по крайней мере, концептуально, поэтому код должен отражать реальность и быть легко проверяемым.

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

Патрик Хьюз
источник
это означает разработку инструмента. Я поставлю это в крайнем случае.
Ali1S232
6
Инструментом будет либо ваш собственный мозг, ведение записей и объем памяти, либо это будет что-то автоматизированное, которое не устает и не пропускает сбои =) Я думаю, это зависит от того, насколько большой будет ваша игра и будете ли вы когда-нибудь построить другой из того же двигателя, чтобы решить, стоит ли потраченное время или нет.
Патрик Хьюз
Лучший способ сделать это может состоять в том, чтобы построить дерево зависимостей сверху вниз (перейти назад), и если два элемента в дереве имеют одинаковую зависимость (и зависимость требует выбора между ними), то у вас есть нарушение.
замедленная
0

это может показаться странным ответом, но вы можете легко проверить невозможные события, используя компиляторы (например, c ++)! Позвольте мне объяснить, как: у вас есть ровно один заголовочный файл для каждого этапа. и игра заканчивается в main.cppфайле. всякий раз, когда вы можете перейти от stage aк stage b, вы просто должны включить файл относится к stage aв stage b. всякий раз, когда вы получаете новый элемент на этапе, вы просто определяете значение для этого элемента. всякий раз, когда вы теряете или используете предмет, вы просто должны его отменить. в конце на каждом этапе вы просто должны использовать все определенные значения для элементов, необходимых на этом этапе. Вот пример, как использовать это в коде:

ах

#define itemA

ЬН

#include <a.h>
#undef itemA
#define itemB

ч

#include <a.h>

itemA;

#include <b.h>

itemB;

main.cpp

#include <c.h>
int main()
{
}

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

Ali1S232
источник
2
это настоящее неправильное использование компилятора!
Ali1S232
3
Это интересно, но это было бы довольно хрупко и работало бы, только если бы в моей истории был класс для каждого объекта / события / раздела. Я собирался больше ориентироваться на данные, читая из XML или чего-то еще. Спасибо за ваше предложение, хотя.
DanDan
3
Не очень хорошая идея принудительно перекомпилировать каждый раз, когда изменяется квест, плюс это не позволит обновлять данные конечным пользователям (например, DLC) или запускать с сервера и применять исправления без принудительной загрузки.
Патрик Хьюз
2
этот пример кода не имеет ничего общего с кодом, который собирается выпустить, и этот код на самом деле ничего не делает. это просто проверка, действительны ли ваша сюжетная линия и квесты. (если это не так, вы просто получаете ошибку компиляции, в противном случае вы можете реализовать это дерево квестов в своей игре!
Ali1S232
О, я вижу, я неправильно истолковал. Я подозреваю, что человек мог бы потратить больше времени на то, чтобы этот код отражал реальные данные, чем было бы сохранено при отладке ошибок логики квеста - это суждение, которое должен сделать автор игры.
Патрик Хьюз