Вибачте за поганий заголовок, але я не мав кращого способу його викласти ...
Отже, ця дивовижна гра від Nintendo (так!) На Wii називається WiiPlay . У ньому 9 міні-ігор, і моя улюблена називається Танки! . Йдеться про знищення танків противника COM, не знищуючи себе. Ось скріншот рівня:
Одним із способів знищення танків є стрілянина кулями. Ось цей вапняно-зелений ворожий танк, який двічі вистрілює високошвидкісні кулі, які рикошетом (до стін та блоків). Ви можете бачити, як танк гравця може миттєво знищуватися, якщо він залишається там, де він знаходиться зараз, так як той цистерна з вапном у центрі може вистрілити кулю, яка слідує зеленому шляху, який я намалював на зображенні.
Як сам аматорський програміст, мені було цікаво, як може вапняний бак визначити, в якому напрямку він повинен стріляти, щоб побити танк гравця.
Я думав про це сам, але не придумав жодного можливого алгоритму. Я поясню свої висновки, якщо вони когось надихнуть. Тільки для простоти під час мого пояснення я вважаю, що стіною є будь-яка поверхня, проти якої куля може рикошетувати . Ізольований прямокутник з блоків таким чином утворює чотири стіни.
Я зробив висновок, що 2 точки, в яких рикошети кулі завжди або лежать на одній стороні паралелограма, або стають протилежними вершинам паралелограма. Вогневий танк противника і танк гравця, на який він спрямований, - це не обов'язково дві інші вершини, але, безумовно, лежать на лініях, колінних до будь-якої з чотирьох сторін паралелограма. Ось ілюстрація чотирьох можливих способів формування паралелограма:
HOR-VER означає, що куля спочатку потрапляє в горизонтальну стіну, потім потрапляє у вертикальну стіну.
І тоді я застряг. Я думав про пересування лінії, яка з'єднує ворожий танк танка гравця навколо карти, щоб побачити, чи утворює паралелограм будь-які два удари будь-якою стіною, але це не завжди спрацьовує, оскільки ворожий танк і танк гравця не є обов'язково збігаються з вершинами паралелограма.
Також я не впевнений у загальній течії алгоритму. Чи приймає алгоритм будь-яку з наступних 2 структур, чи, можливо, я помиляюся з обома цими?
- Продовжуйте з'ясовувати можливі шляхи і завжди позначайте один як найкращий (може бути найкоротшим, найяскравішим, самим неминучим або комбінованим і зваженим оцінкою на основі декількох критеріїв) і забудьте про решту. Той, що залишився після всіх розрахунків, найкращий.
- Спочатку визначте всі стіни, які спочатку можна досягти кулею (куля не потребує рикошету проти будь-якої іншої стіни, щоб дістатися до кожної з цих стін), а потім визначте всі діапазони досяжності на кожній із цих стін (іноді неможливо досягти далекої точки на стіна без рикошету, якщо біля вас стоїть інша стіна), то знову визначте всі доступні стіни рикошетом, і всі діапазони, доступні на цих стінах. Ці 4 процеси можна здійснити способом, подібним до трасування променів. Під час кожного процесу, якщо будь-який промінь потрапляє в танк гравця, визначте шлях кулі відповідно до цього променя.
На мою думку, цей алгоритм важко зрозуміти, оскільки:
- куля може бути вистрілена в будь-якому напрямку; і
- на будь-якій стіні є нескінченно багато точок, як у математиці, де на лінії є нескінченно багато точок.
Але люди з Nintendo все одно це зробили, так що ... хтось із ідеєю?