Извините за плохое название, но у меня не было лучшего способа выразить это ...
Так что есть удивительная игра от Nintendo (да!) На Wii под названием WiiPlay . В ней 9 мини-игр, а моя любимая называется Tanks! , Это уничтожение вражеских танков СОМ без уничтожения себя. Вот скриншот уровня:
Один из способов уничтожения танков - стрельба пулями. Есть этот салатовый вражеский танк, который стреляет высокоскоростными пулями, которые рикошетят (против стен и блоков) дважды. Вы можете увидеть, как танк игрока может быть мгновенно уничтожен, если он останется там, где он сейчас находится, так как этот известковый танк в центре может выстрелить пулей, которая следует по зеленой траектории, которую я нарисовал на изображении.
Как самому программисту-любителю, меня интересовало, как может известковый танк определять, в каком направлении он должен стрелять, чтобы поразить танк игрока.
Я думал об этом сам, но не придумал ни одного возможного алгоритма. Я объясню свои выводы на случай, если они кого-то вдохновят. Просто для простоты во время моего объяснения я предполагаю, что стена - это любая поверхность, против которой пуля может рикошетить . Таким образом, изолированный прямоугольник из блоков образует четыре стены.
Я пришел к выводу, что две точки, в которых рикошеты пули всегда либо лежат на одной стороне параллелограмма, либо становятся противоположными вершинами параллелограмма. Стреляющий вражеский танк и танк игрока, к которому он стремится, не обязательно являются двумя другими вершинами, но определенно лежат на коллинеарных линиях к любой из четырех сторон параллелограмма. Вот иллюстрация 4 возможных способов формирования параллелограмма:
HOR-VER означает, что пуля сначала попадает в горизонтальную стену, а затем в вертикальную стенку.
И тогда я застрял. Я думал о перемещении по линии, соединяющей вражеский танк и танк игрока вокруг карты, чтобы увидеть, образует ли он параллелограмм с любыми двумя ударами любой стеной, но это не всегда работает, потому что вражеский танк и танк игрока не обязательно совпадает с вершинами параллелограмма.
Кроме того, я не уверен в общем потоке алгоритма. Принимает ли алгоритм какую-либо из следующих двух структур, или, может быть, я ошибаюсь в обеих?
- Продолжайте определять возможные пути и всегда отмечайте один из них как лучший (может быть самый короткий, самый непонятный, самый неизбежный или комбинированный и взвешенный анализ, основанный на множестве критериев) и забудьте об остальных. Лучше всего взять тот, который остался после всех расчетов.
- Сначала определите все стены, в первую очередь достижимые пулей (пуля не должна рикошетить по отношению к любой другой стене, чтобы достичь каждой из этих стен), затем определите все достижимые диапазоны на каждой из этих стен (иногда невозможно достичь удаленной точки на стена без рикошета, если рядом с вами стоит другая стена), затем снова определите все достижимые стены рикошетом и все диапазоны, достижимые на этих стенах. Эти 4 процесса могут быть выполнены способом, подобным трассировке лучей. Во время каждого процесса, если танк игрока поражен каким-либо лучом, определите путь пули в соответствии с этим лучом.
На мой взгляд, этот алгоритм трудно понять, потому что:
- пулю можно стрелять в любом направлении; а также
- на любой стене бесконечно много точек, как в математике, где на линии бесконечно много точек.
Но люди Nintendo сделали это в любом случае, так что ... кто-нибудь с идеей?