Концептуально, как создать движок правил / ограничений (не графики / физики) для игры

16

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

На первый взгляд, это звучит как нагрузка операторов if-else, что подразумевает наличие механизма правил. Но это также звучит как конечный автомат для меня.

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

Очевидно, что «игровой движок» из названия не относится к обнаружению столкновений или другой физике / графической механике, но к логике, решающей, какие варианты игрок предоставил ситуации и его текущему состоянию.

kaqqao
источник
1
Этот вопрос лучше подходит для Gamedev ?
Уве Плонус
2
@ Uwe Plonus Обдумал это, но я не верю в это. Мой вопрос носит чисто концептуальный характер и не имеет ничего общего с графическими библиотеками, 3D и другими темами, которые доминируют в игровом процессе. Если задуматься, этот вопрос не имеет ничего общего с играми как таковыми ... но не уверен, как лучше его назвать.
kaqqao
Шахматы и карточные игры очень отличаются от приключений.
Охотник на оленей
1
Похоже, ваш вопрос касается и разработки экспертных систем. Где диапазон последующих вопросов и возможных диагнозов ограничен с каждым выбранным ответом. Может быть, это то, что нужно искать, чтобы найти больше «входных данных»?
Марьян Венема

Ответы:

7

Исходя из того, что вы сказали в комментариях, я бы с этим справился:

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

Есть два основных способа выполнения Условий. Во-первых, нужно настроить полноценный скрипт-движок внутри игры, а затем условие выглядит следующим образом return player.inventory.contains(GUN). Это изначально сложнее в настройке, но допускает более сложные сценарии.

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

Мейсон Уилер
источник
1
На самом деле мы используем что-то подобное в нашем совершенно не связанном с игрой веб-приложении. У пользователя есть несколько состояний, и в коде может быть запущено любое количество событий, многие из которых предварительно настроены на переход пользователей из одного состояния в другое. Я думаю, что для описанных случаев вопроса было бы полезно иметь некоторый элементарный язык сценариев (или полноценный язык, такой как Python / Lua) для определения условий / триггеров.
Katana314
Мне очень нравится этот подход. Благодарность! Будем расследовать это дальше. Есть ли шанс, что вы знаете полезную библиотеку?
Какако
@veggen: Нет, прости. Не разработчик Java.
Мейсон Уилер
@MasonWheeler: Что ты думаешь о Lazarus ?
Роберт Харви
1
Поскольку этот вопрос попал в список популярных вопросов сегодня, я сообщу, что реализовал его именно так, как сказал в предыдущем комментарии. Я сделал хороший DSL и сам применил логику FSM, поскольку она действительно очень проста. Не может быть более доволен решением. @MasonWheeler Еще раз спасибо за отличный совет!
Какако
5

Я думаю, что ответ в заголовке: вам нужен механизм правил. Если вы планируете написать свое приложение на Java, вы, конечно, можете написать свое собственное, как предложил Гилберт Ле Блан, ИЛИ вы можете взглянуть на Drools , движок правил.

какие варианты дает игроку ситуацию и его текущее состояние

С помощью Drools или любого другого движка правил вы можете определить параметризованную ситуацию, которая выводит список возможных действий. Вы можете закодировать простые правила, которые есть у suc:

  • игрок находится на странице X:

    • выбор 1: заголовок: «идти налево», действие: «страница45»
    • выбор 2: название: "идти направо", действие: "страница 56"
    • ЕСЛИ у игрока есть Посох огненных шаров, ТОГДА выбор 3: название «запустить огненный шар», действие: «стр. 32»
    • ЕСЛИ у игрока есть навык восприятия 10 ТОТ выбор 4: заголовок «проверить надписи на стене», действие: «стр. 67»

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

Вот несколько ресурсов, которые помогут вам начать работу с Drools:

Jalayn
источник
В общем - ищите алгоритм Rete, реализованный в любом механизме правил по вашему вкусу.
Охотник на оленей
Да, Drools был одной из вещей, с которых я начал. Мне нужно еще немного изучить, чтобы понять, могу ли я оценивать только один пакет правил за раз, поскольку это довольно важно в моем случае. Благодарность!
Какако
@veggen рад помочь!
Джалайн
2

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

http://en.wikipedia.org/wiki/Category:Text_adventure_game_engines

не упоминается в википедии, в настоящее время шпагат очень популярен.

Саймон Бергот
источник
2

Концептуально ваша игра проста. В psudeocode это будет выглядеть примерно так:

while not at end of adventure story
    display text
    get response

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

Немного сложно быть более конкретным, не зная, какой компьютерный язык вы хотите использовать. Поскольку вы упомянули Java, я бы больше склонялся к древовидной структуре.

Создайте класс ответа, который содержит один ответ и ссылку на текстовый класс.

Создайте текстовый класс, который содержит текст приключения и Список ответов в качестве экземпляров класса ответа.

Отредактировано, чтобы ответить на комментарий:

Вы ничего не рассчитываете на основе этой модели. Используя ваш пример, дерево будет выглядеть примерно так, где T - текст, а A - выбор действия:

T You stumble on a dead police officer
    A Take the gun
    T You hear footsteps
      A Run away
      A Hide and see who comes
    A Don't touch anything
    T You hear footsteps
      A Run away

Да, есть некоторое дублирование текста, но, следуя цепочке, будущие действия могут учитывать прошлые решения. Это огромное дерево решений.

Гилберт Ле Блан
источник
Моя проблема в расчете возможных ответов. Прошлые решения влияют на текущие варианты. Таким образом, если игрок, которому предъявлено «вы наткнетесь на мертвого полицейского», выберет «украсть его пистолет» вместо «не трогайте ничего», он позже получит возможность «застрелить преследователя» в дополнение к «убежать как сумасшедший ", который был бы единственным вариантом, если бы они ранее не приобрели пистолет.
Каккао
@veggen: смотрите обновленный ответ.
Гилберт Ле Блан