У меня есть 2d игра сверху вниз, где ИИ появляется на краях карты и бежит к центру.
Я использую A * и узел сетки, чтобы найти путь.
Прямо сейчас ИИ появляется в точке на краю карты и все выбирают один и тот же путь, который является кратчайшим путем к центру.
Теперь я хочу, чтобы они были более удивительными и интересными и шли разными путями друг к другу.
Я могу сразу придумать две идеи для этого, но хотел бы знать, есть ли другие способы или способы, которыми люди часто пользуются?
Когда один враг появляется и генерирует путь к центру, временно увеличивайте стоимость всех узлов на этом пути, затем постепенно уменьшайте их обратно со временем. Тогда ИИ противника, который появится позже, будет вынужден пойти по более широкому пути.
Приведенный выше подход приведет к тому, что ИИ будет идти все шире и шире, и все же будет очень предсказуемым. Поэтому я подумал, что я бы также представил несколько промежуточных целевых узлов по всей карте. Когда ИИ появляется, они случайным образом выбирают одну из промежуточных целей и направляются туда, прежде чем направиться к центру карты. Сочетание этого с вышеупомянутым подходом к увеличению затрат может выглядеть довольно хорошо?
Какие подходы люди нашли работу лучше всего, чтобы заставить ИИ варьировать пути, которые они выбирают, выглядеть убедительно и удивительно?
источник
Для начала попробуйте добавить небольшое случайное значение к весу каждого узла при поиске пути. Таким образом, каждый агент будет искать путь в немного другой среде. Я не уверен, будет ли это работать в вашем случае, но это должно быть действительно легко попробовать.
источник
Мне нравится ответ Nevermind , однако, учитывая ограничение, описанное в комментариях, я бы попробовал:
(distanceToGoal) + Max(0, desiredDistance - distanceTravelled))
.Это заставит подразделения попытаться пойти дальше, что, вероятно, является другим путем, что приведет к тому, что они, возможно, выберут другие пути.
Вы также можете просто добавить его в свой начальный huerestic для каждого юнита, но случайный диапазон, вероятно, должен быть немного больше.
источник
Как указал Ник Виггилл, самый простой подход - создать круг вокруг цели.
Важная часть состоит в том, чтобы исключить все пути в круге для исходной точки пути, так как вы, вероятно, в конечном итоге встретите врагов, пересекающих круг, чтобы добраться до их начальной точки пути.
Отсюда вы можете получить любой вариант, играя с несколькими значениями, добавляя вторичные путевые точки в круге, близком к исходному и т. Д.
источник
Ваша проблема здесь заключается в том, что A * - это алгоритм для поиска самого быстрого маршрута к цели. Если это ваш главный критерий для «хорошего» пути, то неудивительно, что все ваши актеры принимают одинаковые решения.
То, что вам нужно сделать, это изменить критерии качества для пути, чтобы «самый короткий-лучший-лучший» не был единственным фактором. Элемент случайности является ключевым в этом, но не настолько, чтобы он отвлекал от разведывательного интеллекта (т. Е. Актеры тупо выбирают обходные пути к цели).
Поиск пути * изначально наивен, так как обычно предполагает, что актер отлично знает весь маршрут до его начала. Это всегда будет выглядеть нереально. Решение предполагало, что выбранные промежуточные цели - шаг от этого - ИИ пытается приблизиться к цели, но пытается перемещаться только небольшими участками за раз (это аналогично реальной жизни, где вы можете перемещаться только так далеко, как далеко). как вы можете видеть, и когда вы проходите большую часть пути, вы можете видеть дальше).
Возможно, я бы порекомендовал более простой способ взглянуть на это. Когда вы ищите пути, не просто поддерживайте единый лучший путь, который я нашел до сих пор. Вместо этого соберите набор из лучших 5 или 10 путей. Используйте порог, чтобы отбросить очевидные выбросы. Например, если лучший путь проходит через 20u, чтобы добраться до цели, следующий лучший путь проходит через 21u, а следующий - 50u. Установите порог на 20% больше, чем лучший путь, и поэтому откажитесь от пути 50u, потому что он тупо длиннее. Теперь у вас есть несколько путей на выбор, и, выбрав случайным образом из этого набора путей, ваши актеры будут принимать разные решения.
Однако вы не получите такую информацию при стандартном поиске A *, поэтому я думаю, что вам придется изменить алгоритм или использовать что-то еще, чтобы собрать множество возможных путей.
источник
Если у вас есть небольшой набор повторяющихся врагов (или типов врагов), вы можете попытаться дать им характер, который влияет на их движения. Они не должны быть большими вещами, просто вещами, которые появляются время от времени. Хорошим примером этого являются призраки из Pac-Man. Ваш A * разбит на несколько промежуточных целей. Возможно, один враг действительно глуп и легко теряется, направляясь в случайном направлении к каждому третьему узлу (кроме непосредственно назад). Будь креативным.
источник