2013-06-15 9 views
12

Я сейчас пишу 2D-игру в Javascript, используя HTML5 < холст > элемент. Это идет очень хорошо, но я столкнулся с проблемой.Что такое хороший алгоритм поиска путей на основе сетки 2D?

Дизайн уровня для моей игры - сетка (поэтому стоимость пути, перемещающаяся из одной ячейки в северную/южную/восточную/западную ячейку, равна 1) с различными препятствиями, занимающими различные местоположения в сетке – много похоже на лабиринт, но с гораздо большим количеством поворота. Каждый отдельный уровень составляет порядка 400 × 200 ячеек.

Я пытаюсь реализовать врага, который будет искать игрока независимо от того, где они могут быть, но у меня возникли проблемы с попыткой перевести один из различных алгоритмов поиска пути в соответствии с моей ситуацией. Большинство из тех, с которыми я сталкивался (например, A * и Dijkstra), по-видимому, лучше всего подходят для 3D или более сложных 2D-ситуаций. Мне было интересно, можно ли значительно упростить эти алгоритмы, чтобы лучше соответствовать моим целям или что-то вроде поиска по глубине было бы более эффективной альтернативой, учитывая размер уровня.

+0

Вы не будете делать лучше, чем A *, не дав ему предварительного знания о возможных путях (например, деление карты на сегменты с известной связностью). Глубина сначала была бы намного (намного намного) медленнее, чем ширина в первую очередь. – Dave

+0

На самом деле это не то, что Stackoverflow/Stack Exchange о; задайте вопрос с определенным ответом, а не вопросом для покупок. Во что бы то ни стало, используйте то, что предлагают люди, но возвращайтесь, когда вы сталкиваетесь с проблемой программирования. – Amelia

+0

@Dave: Вы можете легко найти [лучше, чем простой-ol 'A \ *] (http://programmers.stackexchange.com/questions/197894), когда он привязан к сетке; но JPS + A \ * сложнее, чем просто A \ *, и обычно это не обязательно. –

ответ

14

A * - очень распространенный алгоритм 2D-поиска пути. Может потребоваться немного времени, чтобы обернуть голову вокруг того, что происходит, если поиск путей незнакомо, но это не слишком сложно. Вы можете просто взглянуть на чей-либо примерный код, который был разработан для более сложного приложения, чем вы планируете. Там a good tutorial for understanding the algorithm here.

+0

Спасибо, я посмотрю. – creXALBO

+5

Ссылка кажется мертвой. –

+0

Если ссылка кажется мертвой, попробуйте отправить по электронной почте: patrick (at) policyalmanac (dot) org – Skrivener

2

EasyStar.js - это красиво выглядящая библиотека, которая, как представляется, делает то, что вы хотели бы. Я не использовал его сам, но документация на странице github проекта выглядит довольно неплохо, и это, вероятно, то, что я выбрал бы на вашем месте.

Смежные вопросы