Концептуально, як можна зробити двигун правил / обмежень (а не графіки / фізики) для гри


16

Я хочу скласти просту гру, схожу на книги-пригоди для вибору. Гравець отримує текст розповіді і отримує можливість вибрати свою дію зі списку можливостей. Це, у свою чергу, призводить до нового оповідного тексту, ad infinitum. Єдина уловка полягає в тому, що залежно від деяких попередніх рішень список можливостей може відрізнятися.

На перший погляд, це звучить як навантаження тверджень if-else, тобто, маючи на увазі, двигун правил буде на місці. Але це також звучить як машина скінченного стану.

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

Очевидно, що "ігровий двигун" з назви не стосується виявлення зіткнень чи іншої фізики / графічної механіки, але логіка, яка визначає, які варіанти гравцеві дали ситуацію та його поточний стан.


1
Чи краще це питання підходить для gamedev ?
Uwe Plonus

2
@Uwe Plonus Вважав це, але я не вірю в це. Моє запитання є чисто концептуальним і не має нічого спільного з графічними бібліотеками, 3D та іншими темами, які домінують у gamedev. Подумайте про це, це питання мало стосується ігор, як насправді ... але не знаєте, як краще назвати його.
kaqqao

Шахи та карткові ігри сильно відрізняються від пригод.
Мисливець на оленів

1
Здається, ваше питання стосується і розробки експертної системи. Коли діапазон запитань та можливих діагнозів обмежується кожною обраною відповіддю. Може бути, саме на що звернути увагу, щоб знайти ще якийсь "вхід"?
Мар'ян Венема

Відповіді:


7

Виходячи з того, що ви сказали в коментарях, ось так я б поводився:

Реалізуйте історію як кінцева державна машина, із поворотом. Кожен штат - це сторінка історії, і кожен Перехід - посилання з однієї сторінки на іншу. Але кожен перехід також має умови . Умови можуть бути нульовими, і в цьому випадку Перехід завжди відображається як доступний варіант, але якщо ні, то їх потрібно оцінювати, коли відображається сторінка, і якщо оцінка повертається False, Перехід не відображається.

Є два основні способи виконання цих Умов. Перший - це налаштування повномасштабного двигуна сценарію всередині гри, а потім виглядає такий стан return player.inventory.contains(GUN). Спочатку це складніше в налаштуванні, але дозволяє вдосконалити сценарії.

Друге - це жорстке кодування можливих умов у якийсь об’єкт. Це може мати RequiredItemполе, і якщо це поле має значення, ви перевіряєте, чи виконується умова. Цю систему простіше налаштувати. Це обмежує те, що ви можете зробити набагато більше, ніж сценарій, але якщо вам не потрібна гнучкість, яку надав би механізм сценаріїв, можливо, це набагато простіше у використанні.


1
Ми фактично використовуємо щось подібне в нашому повністю неігровому веб-додатку. Користувач має декілька штатів, і будь-яка кількість подій можна запустити в коді, багато з яких попередньо встановлені для переходу користувачів з одного стану в інший. Я думаю, що для описаних випадків запитання також було б корисно мати якусь рудиментарну мову сценаріїв (або повну на зразок Python / Lua) для визначення умов / тригерів.
Katana314

Цей підхід мені дуже подобається. Спасибі! Буде досліджено далі. Будь-який шанс ви знаєте корисну бібліотеку?
kaqqao

@veggen: Ні, вибач. Не розробник Java.
Мейсон Уілер

@MasonWheeler: Що ти думаєш про Лазара ?
Роберт Харві

1
Оскільки це запитання потрапило до списку популярних сьогодні питань, я повідомлю, що я реалізував це саме так, як я сказав у попередньому коментарі. Я зробив хороший DSL і реалізував логіку FSM, як це справді, дуже просто. Не можу бути задоволенішим рішенням. @MasonWheeler Ще раз дякую за чудову пораду!
kaqqao

5

Я думаю, що відповідь у назві: вам потрібен механізм з правилами. Якщо ви плануєте написати свою заявку на Java, ви, звичайно, можете написати свою власну, як запропонував Гілберт Ле Блан, АБО ви, можливо, захочете поглянути на Drools , систему управління правилами.

які варіанти гравцеві дали ситуація та його поточний стан

За допомогою Drools або будь-якого іншого механізму правил фактично ви можете визначити параметризовану ситуацію, яка виводить список можливих дій. Ви можете кодувати прості правила, які має:

  • гравець на сторінціX:

    • вибір 1: назва: "йти вліво", дія: "сторінка45"
    • вибір 2: назва: "йти направо", дія: "сторінка56"
    • ЯКЩО у гравця є персонал Fireballs ТОЛЬ вибір 3: назва "запустити fireball", дія: "page32"
    • ЯКЩО гравець має майстерність сприйняття 10 THEN вибір 4: назва "перевірка написів на стіні", action: "page67"

Що цікаво з Drools, це те, що ви можете кодувати всі свої правила у файлі Excel, а потім на початку гри змусити Drools прочитати цей файл. Після цього все в пам’яті, вам потрібно лише потурбуватися про свій інтерфейс користувача.

Ось декілька ресурсів, які допоможуть вам почати роботу з Drools:


Взагалі - шукайте алгоритм Rete, реалізований у будь-якому механізмі правил на ваш смак.
Мисливець на оленів

Так, Drools була однією з речей, з яких я починав. Мені потрібно ще трохи дослідити, щоб побачити, чи можу я оцінити лише один пакет правил за один раз, оскільки це досить важливо в моєму випадку. Спасибі!
kaqqao

@veggen радий допомогти!
Джалайн


2

Концептуально ваша гра відверта. У psudeocode це виглядатиме приблизно так:

while not at end of adventure story
    display text
    get response

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

Трохи важче бути більш конкретним, не знаючи, якою комп'ютерною мовою ви хочете користуватися. Оскільки ви згадали про Яву, я більше схиляюся до структури дерева.

Створіть клас відповідей, який містить одну відповідь та посилання на текстовий клас.

Створіть текстовий клас, який містить пригодний текст, та список відповідей як екземпляри класу відповідей.

Відредаговано, щоб відповісти на коментар:

Ви нічого не обчислюєте на основі цієї моделі. Використовуючи ваш приклад, дерево виглядатиме приблизно так, де 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

Так, є деяке дублювання тексту, але, слідуючи ланцюжку, майбутні дії можуть враховувати прийняті рішення. Це величезне дерево рішень.


Моє питання - підрахунок можливих відповідей. Минулі рішення впливають на поточні варіанти. Отже, якщо гравець, представлений із "ти натрапиш на мертвого поліцейського", обере "вкрасти його пістолет", а не "нічого не чіпай", пізніше він отримує можливість "застрелити переслідувача" на додаток до "втечі, як божевільний ", що було б єдиним варіантом, якби вони раніше не придбали пістолет.
kaqqao

@veggen: Дивіться оновлену відповідь.
Гілберт Ле Бланк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.