Як я можу реалізувати командну систему для пригодницької гри в стилі "натискання та натискання"?


11

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

Припустимо інтерфейс стилю Monkey Island або Maniac Mansion з палітрою дієслів та предметів на сцені та в інвентарі. Клацнувши на них, ви створюєте речення для виконання.

наприклад, ви можете натиснути, look atа потім дерево, щоб отримати "погляд на дерево" або натиснути на яблуко, а потім give, а потім дівчинку, щоб отримати "подарувати яблуко дівчині".

Існує три можливі форми речення:

  • verb, наприклад "зберегти"
  • verb noun, наприклад "зібрати яблуко", "подивитися на восьминога"
  • verb noun noun, наприклад, "подаруйте соління шаленому собаці", "використовуйте лом із баклажаном соління"

У різних ситуаціях я хочу, щоб дії, які виконувались, визначалися різними об'єктами.

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

Якщо інтерфейс повинен працювати як Maniac Mansion, тоді ви будуєте пропозицію, а потім повідомляєте його виконувати (в Maniac Mansion, клацаючи речення, або клацаючи ще раз останнє, на що натиснули).

Якщо він працює як Monkey Island, речення виконується, як тільки воно закінчиться, що створює проблему для дієслів типу, useякі іноді можуть приймати один іменник, а в інший раз два.

То як би ви реалізували систему, яка це справляє?


1
Здається, існує три типи дієслова: один тип для нульових іменників, інший - для двох тощо. Вони не є одним класом об’єктів. Ви не можете "дивитись на восьминога з солінням", так lookце дієслово з
одноіменником

Відповіді:


10

Можливо, вам буде простіше використовувати, якщо ви скасуєте порядок вибору. Таким чином, користувач натискає іменник, а потім у грі відображається набір дієслів, які можна виконувати на цьому іменнику. Якщо дієслово вимагає об'єкта (тобто "дай ___", то гра чекає, коли користувач вибере об'єкт перед виконанням дії.

Щось на зразок:

  1. Користувач натискає чизбургер.
  2. У грі показано меню: "забирай, їж, дивись, дай ___".
  3. Користувач вибирає "подарувати ___".
  4. У грі сказано: "давати кому?" і чекає, коли користувач натисне інший іменник (або кнопку скасувати).
  5. Користувач клацає мавпою.
  6. Гра дарує мавпу чизбургер.

Щодо впровадження, кожен об’єкт у грі повинен мати дані для:

  1. Який набір дієслів ви можете застосувати до нього.
  2. Для дієслів це дозволяє взяти об’єкт, який набір об'єктів можна застосувати.
  3. Для кожної пари дієслова або об’єкта дієслова поведінка, яку слід виконувати, коли користувач робить це.

Оскільки граматика насправді не гніздиться чи нічого, то вам не потрібно щось складне, як зразок перекладача.


+1, як на стороні моделювання речей, так і на стороні інтерфейсу. Так, здебільшого я згоден, бо саме так я б це зробив, але мені подобається ця відповідь.
drhayes

Якщо ми згодні, то однозначно ми повинні обидва мати рацію. ;)
чудовий

Отже, ви ефективно вважаєте, що поведінка, яку слід виконувати, завжди повинна визначатися першим іменником?
SpoonMeiser

1
Так, я думаю, що кілька іменників поділять поведінку (так що "підбирати" буде використовувати один і той же код для підбору різних об'єктів), але має сенс визначати набір дієслів, які можна застосувати йому. Зважаючи на те, що набір іменників дуже великий (кожна річ у грі), а набір дієслів малий (можливо, жменька операцій), я думаю, що користувачеві має сенс вибрати спочатку іменник, оскільки він знижує комбінації більше швидко. І, прагматично, це дозволяє користувачеві натиснути щось, щоб ініціювати взаємодію, а не якесь слово.
чудовий

Це свого роду, як це робив повний газ.
Jari Komppa

2

Я представляю спрощене рішення. Його можна, звичайно, продовжити.

Я думаю, що простий список (verb, object1, object2) вирішив би його:

  • якщо гравець клацав об'єкт (дієслово) "користуватися" і клацав об'єкт "повітряна куля", а гравець клацав об'єкт "насос" і існує триплет ("використання", "балон", "насос"), то ви "використовували балон з насосом"
  • Іноді object2 буде NULL, як у "use helium" (використання, гелій, NULL)
  • Потрібно, щоб гравець спочатку клацнув об’єктним дієсловом
  • якщо гравець натискає щось, що нічого не відповідає, скажіть: "Я не можу цього зробити, це дурниця"
  • Звичайно, слід перевіряти після кожного клацання, чи послідовність правильна.

Як попрацювати за замовчуванням:

  • Якщо першого клацання немає на об’єкті дієслова, знайдіть можливі дії за замовчуванням.
  • Один із способів зберігання значень за замовчуванням - це зробити чотирикласний (verb, object1, object2, is-default)
  • Іншим способом їх зберігання може бути список трійки за замовчуванням
  • ...

Деякі приклади:

  • (використання, балон, насос)
  • (дай, Іван, картопля)
  • (прогулянка, піраньї, NULL)
  • (використання, балон-інвентар, насос)
  • (відкрита, від дверей до даху, NULL), за замовчуванням .... приклад дії за замовчуванням

Його можна продовжити:

  • додайте кілька подій, які потрібно викликати (дайте гравцеві щось, гравець скаже "Я не можу цього зробити, бо я могучий пірат", почніть знімати сцени, щось змінити у світі ...)
  • додати деякі передумови. Іноді балон може бути в клітці, тому вам потрібно буде виразити "якщо балон не в клітці". Я думаю, що я можу підійти до цього з обчисленням подій чи прологом або зробити це за допомогою функції покажчика ...
  • Іноді речення в командному рядку не буде "дивитись у дірку", але переписується б на "погляд у діру", для цього потрібна лише змінна :)

1

Тут є дві проблеми: Інтерпретація вводу гравця в дерево синтаксису, а потім його виконання.

На першому етапі я мав би, щоб кожна кнопка дієслова створила конкретний екземпляр дієслова, похідного від деякого інтерфейсу дієслова. Цей екземпляр буде переданий подальшими іменниками чи дієсловами для підтвердження. Якщо дійсно, він би приєднав іменник до свого внутрішнього синтаксичного дерева, інакше він би відхилив відповідну помилку.

Після кожного натискання кнопки ви можете запитати дерево дієслова, чи воно було у дійсному стані для продовження (для введення в стилі Monkey Island).

Перейшовши на другий етап, конкретне дієслово буде відповідати за аналіз власного дерева та оновлення ігрового стану.

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

Перегляньте шаблон Інтерпретатора для отримання додаткової інформації на етапі розбору.


1
Я не думаю, що інтерпретувати введення гравців не є проблемою. Звичайно, тут немає нічого складного, як аналіз введення текстових пригод, необхідних тут. Дійсно, питання зводиться до того, як би ви створили свою ієрархію об’єктів та взаємодії, щоб забезпечити максимальну гнучкість щодо того, який об’єкт визначає фактичну дію, яку слід здійснити.
SpoonMeiser
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.