Алгоритм обчислення шляху кулі до цілі з макс. 2 рикошети


21

Вибачте за поганий заголовок, але я не мав кращого способу його викласти ...

Отже, ця дивовижна гра від Nintendo (так!) На Wii називається WiiPlay . У ньому 9 міні-ігор, і моя улюблена називається Танки! . Йдеться про знищення танків противника COM, не знищуючи себе. Ось скріншот рівня:

введіть тут опис зображення

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

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

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

Я зробив висновок, що 2 точки, в яких рикошети кулі завжди або лежать на одній стороні паралелограма, або стають протилежними вершинам паралелограма. Вогневий танк противника і танк гравця, на який він спрямований, - це не обов'язково дві інші вершини, але, безумовно, лежать на лініях, колінних до будь-якої з чотирьох сторін паралелограма. Ось ілюстрація чотирьох можливих способів формування паралелограма:

введіть тут опис зображення

HOR-VER означає, що куля спочатку потрапляє в горизонтальну стіну, потім потрапляє у вертикальну стіну.

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

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

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

На мою думку, цей алгоритм важко зрозуміти, оскільки:

  • куля може бути вистрілена в будь-якому напрямку; і
  • на будь-якій стіні є нескінченно багато точок, як у математиці, де на лінії є нескінченно багато точок.

Але люди з Nintendo все одно це зробили, так що ... хтось із ідеєю?


Просто для перевірки ви запитуєте, як це можна зробити, а не як Nintendo вирішив насправді зробити це, правда?
Іксрек

@lxrec ти маєш рацію, просто цікавишся можливим способом зробити це, а не тим, як вони це зробили .
привіт всім

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

2
Хоча є «нескінченно» багато кутів, ви можете легко звести їх до кількох класів еквівалентності. Приціл і світло Нікі Кейса - це прикольна демонстрація відтворення тіней між багатокутниками - це саме ваша проблема, за винятком того, що ви використовуєте шляхи кулі, а не світлові промені, і що ваші промені можуть відображатися два рази. Зауважте, що відображення не має значення для ШІ - відбиття просто розширює лінію зору, хоча це означає, що один і той же об'єкт може бути видно з різних кутів.
амон

@Mandrill Я боюся, що ти не дуже зрозумів моє запитання. Я запитував, як противник може створити шлях кулі, який потрапляє в танк гравця.
привіт всім

Відповіді:


9

З огляду на пряму зору, проблема, очевидно, банальна. Однак ми маємо справу з роздумом. Правильне з'ясування, які частини сцени можна побачити, є складним при здійсненні рефлексії як частини промінь-променів, оскільки це може пропустити деякі отвори. "Двійковий пошук" між двома перспективними кутами також не є життєздатним: завдяки відображенням фактично видимий простір не є безперервним, тому евристичний "якщо справа праворуч від А та зліва від В, повинна бути ціль рішення між A і B ” не допустимо , і воно не вистачить" креативних "рішень. Я б замість цього порекомендував здійснити роздуми, повторно запустивши слід у віртуальну позицію - положення, де здається наш танк , коли його бачать у дзеркалі:

target |obstacle
   X   |
    \  |  X real position
     \   /
      \ /
   ----------- mirror surface
        \
         \
          X virtual position

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

стрілянина по кутах

X позначає позицію стрільби, (X) ціль. Видно кольорові ділянки.

  1. Пряма лінія зору: ціль не видно. Однак ми можемо вражати поверхні (1) та (2).

  2. Одне відображення. В межах перешкод є дві віртуальні вогневі позиції. Нижнє положення має прямий ЛОС до цілі, тому у нас є наше перше рішення для стрільби: шлях кулі - це частина променя між ціллю та нижньою дзеркальною поверхнею, а також між точкою зіткнення промінь-дзеркало та реальною позицією стрільби.

  3. Два відбиття: у верхньому віртуальному положенні з першого відображення можна побачити частину нижньої перешкоди через її дзеркальну поверхню. Оскільки допускаються два відображення, ми можемо відобразити це положення на нижню перешкоду. Позиції позначаються як (I) реальна позиція, (II) віртуальна позиція з першого відображення і (III) віртуальна позиція з другого відображення.

    З (III) ми маємо прямий LOS до цілі (X), тому ми знайшли ще одне стрільби. Шлях кулі ведеться по лінії X – III до другої точки зіткнення дзеркала, потім по лінії III – II між точками зіткнення дзеркала і, нарешті, по лінії II – I від першої точки зіткнення дзеркала до реальної позиції I.

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

Як тільки ви зможете зрозуміти, які частини перешкод видно (і тому їх можна використовувати для відображення кулі), реалізація дзеркального відображення за допомогою першого глибинного пошуку буде здаватися простою. Для пошуку відповідних дзеркальних поверхонь можна використовувати методи, викладені в прицілі та світлі Нікі Кейса : замість того, щоб випробувати 360 векторів - які можуть пропустити отвори, а також марно - ми запускаємо промені лише до країв перешкод.


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

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

Це геніально! Будь-яка порада, як створити дзеркальне представлення свого рівня, не надто вимагаючи своєї гри?
ретровіус

7

Щойно розширюючи ідею Карла Білефельдта для роздумів на дві стіни:введіть тут опис зображення

Дані А і В (танки). Спочатку ви повинні перелічити всі стіни, які може бачити A, і список усіх стін B, які можуть бачити. Потім ви робите пари там, де перша стінка знаходиться в списку кулаків, а друга стіна відрізняється від першої стіни і знаходиться у другій. Вам потрібно зробити цей тест для всіх можливих пар стін (якщо ви не знайдете способу усунення кандидатів). Як тільки ви знайдете R і S для даної пари стін, ви перевіряєте

1) якщо A має пряме бачення R

2) якщо R належить до стіни1 (стіна - це просто відрізок, немає всієї лінії)

3) якщо R має прямий доступ до S

4) якщо S належить до wall2 (стіна - це лише сегмент, не вся лінія)

5) якщо S має прямий доступ до B.

Щоб знайти R і S : Оскільки ви знаєте wall1, ви можете визначити дотичну лінію рівняння, дотичну до стіни1, оскільки R належить дотичній лінії до стіни 1, ви маєте відношення між двома координатами R (закінчуючи одним ступенем свободи для R) Аналогічно до S (у вас є відношення між координатами S, оскільки ця точка належить лінії, яка відзначається стіною2). Отже, у вас є 2 ступеня свободи, і ви повинні мати 2 додаткові незалежні рівняння, щоб визначити рішення. Одне рівняння:

(AA')/(RA')=(SS')/(RS')

інше рівняння:

(BB')/(SB')=(RR')/(SR')

зауважте, що у наведених рівняннях A, A ', B, B' знають або можуть бути обчислені безпосередньо. R 'і S' - функція координат R і S і рівняння стінки. Я не закінчив математику, тому не знаю, як виглядатимуть рівняння.


Це чудовий математичний підхід. Але алгоритм вимагає багато часу на обчислення для вирішення одночасних рівнянь, я думаю? Існує багато квадратних коренів і експоненцій, пов'язаних з відстанями.
привіт всім

3

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

схема рівняння

Просто вирішіть, xщоб отримати відстань уздовж стіни, на яку ви повинні прицілитися. Дві стіни працює так само. У вас просто два рівняння і дві невідомі.


1

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

Давайте називати поверхню , яка повинна бути вразити першу поверхню А , а другий, B .

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

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

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

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

Ось малюнок:

промені

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


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

Відповідь @ amon відповідь; Мені подобається ідея прямого дзеркального відображення. Також я припускаю, що алгоритм повинен перевірити, чи дійсно шлях попадання після його знаходження таким спрощеним способом. Ще цікавішою є можливість, коли мета лише частково закупорена (можливо, навіть розділена на дві видимі області). Метод Амона більше піддається поводженню з ним.
9000

-3

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


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