Як реалізувати розумного ворога в стрільбі?


13

Уявіть собі дуже просте зйомка, що ми всі знаємо:

стріляти-ем 1

Ти гравець (зелений). Ваш рух обмежений Xвіссю. Наш ворог (або вороги) знаходиться у верхній частині екрана, його рух також обмежений Xвіссю. Гравець вистрілює в ворога кулі (жовті).

Я хотів би реалізувати AI для ворога, який повинен бути справді хорошим уникнення куль гравців. Моя перша ідея полягала в тому, щоб розділити екран на окремі секції та призначити їм ваги:

зважена стрілянина

Є два ваги: ​​"кульова вага" (сірий) - це небезпека, яку наносить куля. Чим ближче куля до супротивника, тим вище "вага кулі" ( 0..1де 1 найбільша небезпека). Доріжки без кулі мають масу 0. Друга вага - "відстань-вага" (вапняно-зелений). Для кожної смуги руху я додаю 0.2вартість руху (це значення зараз є довільним і може бути налаштовано).

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

Тож ось що я шукаю:

тотальне знищення

  • Потрібно знайти шлях через штормову бурю, навіть коли немає місця, яке б не загрожує кулею.
  • Ворог може надійно ухилитися від кулі, вибравши оптимальне (або майже оптимальне) рішення.
  • Алгоритм повинен вміти враховувати швидкість руху кулі (оскільки вони можуть рухатися з різною швидкістю).
  • Способи налаштувати алгоритм, щоб можна було застосувати різні рівні складності (тупі до супер-розумних ворогів).
  • Алгоритм повинен допускати різні цілі, оскільки противник не хоче лише ухилятися від куль, він також повинен мати можливість стріляти по гравцеві. Це означає, що позиції, де противник може стріляти по гравцеві, слід віддавати перевагу при ухиленні від куль.

То як би ви вирішили це? На відміну від інших ігор цього жанру, я хотів би мати лише декількох, але дуже «кваліфікованих» ворогів замість маси німих ворогів.


2
Чи думали ви використовувати щось на кшталт поведінки керма? Там один для уникнення перешкод в зокрема: red3d.com/cwr/steer/Obstacle.html
Зошит

@Tetrad Я думав про поведінку в рульовому .. також тому, що вони можуть добре перемикатися, як, наприклад, "спробуйте вистрілити гравця" і коли небезпека попереду, перейдіть на "ухилення". Я боюся, що 1D (саме з цим я в основному маю справу) версія ухилення буде занадто тупою для прийняття хороших рішень. Я, можливо, помиляюся.
bummzack

Відповіді:


8

Я думаю, що ваша основна ідея є здоровою, але вона не є аналогом. Вам потрібно аналогове поле значення, яке працює по екрану. Отже, 1D градієнт дифузії, з якого ви можете отримати значення в точній точці на цій лінії, на льоту. Дифузійні градієнти є дешевими і можуть використовуватись декількома ворогами одночасно, оскільки вони описують навколишнє середовище, а не погляд сутності на це (трохи схоже на радіовипромінювання) - ймовірно, чому ви обрали підхід, який ви маєте у своєму питанні . Цей градієнт повинен бути відносно рівним, щоб викликати органічний рух від ворога, і, очевидно, оновлюється так, як це робить ваш ігор. Можливо, ковзний середній ?

Градієнт повинен поєднувати:

  • Близькість
  • Швидкість
  • Ширина кулі
  • (необов'язково) Позиція мішень (гравців)

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

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

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

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

Способи налаштування алгоритму складності ворога включають

  • введення затримки на оновлення до графіку (Народжений занадто повільно)
  • введення у графік випадкових, локалізованих неточностей
  • просто не маючи ворогів підкорятися тому, що їм підказує графік, через послідовність оновлень (скажімо, від 1 до 10 кадрів) через лінь AI лінь.

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


1
Шановний Нік. Я випереджав впроваджену невелику тестову версію такої поведінки у спалах, і я дуже задоволений результатом (кулі породжуються випадковим чином). Наразі я використовую 3 градієнти, один для загрози, вартості руху та статичний для країв (щоб краї екрану були менш бажаними). Вони візуалізуються у флеш-програмі. Я відчуваю, що за допомогою певного налаштування я можу досягти дуже хороших результатів, а також враховувати інші ваги, наприклад, стрілянину. Велике спасибі товаришу.
bummzack

1
Привіт @bummzack, це задоволення товариш, це класна маленька демонстрація! Ваш погляд на проблему був для мене новим і виглядав цікавим - я радий, що це працює! Радий допомогти з цим і дякую за те, що поділився.
Інженер

7

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

    E    
B  B**B
  B***B  B
 B***B   B
B**B** B 
 B**B**BB
B*****B B
      P

E = ворог
B = куля
P = гравець
* = параметри шляху до нижньої частини екрана

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

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


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

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

@bummzack Середовище не "швидке", принаймні, з точки зору комп'ютера. Для розробника ігор ви повинні розуміти, що майже кожна гра заснована на кроках, саме про розмір цього кроку. Але на кожному кроці можна проводити розрахунки, тож рішення Кверкі - це те, що вам потрібно.
Діель

Насправді я згоден з @bummzack. Хоча цей підхід логічно твердий, він буде дорожчим, ніж 1D підхід, запропонований у питанні. Це може бути передчасна оптимізація, але я вважаю, що цей підхід є набагато більш елегантним. Дивіться мою відповідь для розробки цього питання.
Інженер

2
Це, мабуть, правильна відповідь, але не зовсім реалістична . У той час, коли потрібно, щоб ворог розробив шлях, у полі може бути ще один набір кулей, що втрачає шлях повністю, а це означає, що перерахунок шляху був би необхідним. А перерахунок - сука . Крім того, ваше уявлення про розповсюдження до тієї точки, де це було безпечно, робить його ще дорожчим! @ Nick Wiggill Я не думаю, що це передчасна оптимізація, просто хороший передбачуваність для того, щоб не забити себе в промежину.
Рей Дей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.