Я делаю точку и кликаю в приключенческой игре и в настоящее время пытаюсь найти лучший способ реализации командной системы.
Предположим, что интерфейс в стиле Monkey Island или Maniac Mansion, с палитрой глаголов, а также объекты в сцене и в инвентаре. При нажатии на них, вы строите предложение выполнить.
например, вы можете щелкнуть, look at
а затем дерево, чтобы «взглянуть на дерево», или щелкнуть яблоко, а затем give
, а затем и девушку, получить «дать яблоко девушке».
Есть три возможных формы предложения:
verb
, Например «сохранить»verb noun
, Например, «забрать яблоко», «посмотреть на осьминога»verb noun noun
Например, "дать рассол бешеной собаке", "использовать лом с маринованной банкой"
В разных ситуациях я хочу, чтобы выполняемое действие определялось разными объектами.
Например, для give
глагола может быть определено действие по умолчанию, которое заставляет персонажа сказать что-то вроде «я бы предпочел держаться за это», или бешеная собака может определить действие, в котором она съедает все, что вы пытаетесь дать ему. ,
Если интерфейс должен работать как Maniac Mansion, то вы строите предложение, а затем приказываете его выполнить (в Maniac Mansion, либо щелкнув предложение, либо снова щелкнув по последнему нажатию).
Если это работает как Остров Обезьян, предложение выполняется, как только оно завершено, что создает проблему для глаголов, например, use
которые иногда могут принимать одно существительное, а другие - два.
Итак, как бы вы внедрили систему, которая обрабатывает это?
источник
look
же как и глагол с одним существительным и т. Д.Ответы:
Возможно, вам будет проще пользоваться, если вы измените порядок выбора. Таким образом, пользователь нажимает на существительное, а затем игра отображает набор глаголов, которые можно выполнить с этим существительным. Если для глагола требуется объект (т. Е. «Дать ___»), то игра ждет, пока пользователь не выберет объект, прежде чем выполнять действие.
Что-то типа:
С точки зрения реализации, каждый объект в игре должен иметь данные для:
Поскольку грамматика на самом деле не является гнездом или чем-то еще, вам не нужно что-то более сложное, чем образец интерпретатора.
источник
Я представляю упрощенное решение. Он может быть продлен конечно.
Я думаю, что простой список (глагол, object1, object2) решил бы это:
Как обращаться со значениями по умолчанию:
Некоторые примеры:
Он может быть продлен:
источник
Здесь есть две проблемы: интерпретировать входные данные игрока в синтаксическое дерево, а затем выполнить это дерево.
На первом этапе я хотел бы, чтобы каждая кнопка глагола создавала конкретный экземпляр глагола, полученный из некоторого интерфейса глагола. Этот экземпляр будет передан далее существительные или глаголы для проверки. Если он действителен, он присоединит существительное к своему внутреннему синтаксическому дереву, в противном случае он будет отклонен с соответствующей ошибкой.
После каждого нажатия кнопки, вы можете попросить дерево глагол, если он был в допустимом состоянии продолжить (для входа в островном стиле обезьяны).
После того, как на втором этапе, глагол бетон будет отвечать за разбор его собственное дерево и обновление состояния игры.
Более сложное решение предусматривало бы разбор дерева внешне глаголу. Каждый элемент дерева будет нести ответственность за небольшие действия, которые вместе производство желаемого результата. Такой подход позволит вам сделать больше эмерджентные предложения от небольших строительных блоков.
Проверьте шаблон интерпретатора для получения дополнительной информации на этапе синтаксического анализа.
источник