AI для Final Fantasy тактика-подобная игра
Я реализую небольшую сетку, основанную на поворотах стратегию в строках тактики Final Fantasy.
Есть ли у вас какие-либо идеи о том, как я могу подойти к выбору целевого выбора, движения и выбора навыков?
Я рассматриваю вопрос о том, что решения отключены, но все эти 3 решения в значительной степени связаны.
(например, я не могу решить, куда двигаться, если я не знаю, кого я собираюсь атаковать, и какой диапазон умения я буду использовать, и наоборот, я не могу решить, кто атаковать, если я не знаю, сколько его поворачивает возьмет меня, чтобы достичь каждой цели)
Я хочу двигаться к единой системе, но, исследуя вещи из Потенциального исследования поля, используемого таким образом, как в Killzone 1 AI, я застреваю в локальных максимумах.
=== Обновление 1
В настоящее время я пытаюсь использовать потенциальные карты полей/влияний для генерации данных, на которые я принимаю решения.
Я понятия не имею, как справляться с множеством навыков и умений, которые не наносят ущерба, а скорее баффы/дебаффы или изменяют мир.
Кто-то в другом месте предложил использовать поиск по дереву Монте-Карло, используемый в настоящее время в играх Go.
Я считаю, что пространство, которое будут использовать мои актеры, не очень хорошо для него, так как многие многие ходы в игре не приводят к позиции, с которой вы можете атаковать и влиять на мир (я в мире больше финала фэнтезийная тактика)
В финальной тактике фантазии она может быть успешно применена, хотя фактор ветвления намного больше, чем фактор 9x9 Go (из того, что я понимаю)
===
Заранее спасибо, Xtapodi.
ps.1 - Проблема в том, что для того, чтобы точно знать, насколько далеко у меня будет враг, ему нужно будет найти его, потому что, хотя враг близок, непроходимая утеса может отделять нас, что занимает 4 оборота, чтобы обойти. Или, что еще хуже, блок блокирует путь, позволяя сказать мост, поэтому на самом деле нет способа связаться с ним.
Ответы
Ответ 1
Один из подходов, который я использовал, - это сделать двухпроходную систему.
Во-первых, узнайте, куда может двигаться ваш блок. Используйте A * или что угодно, чтобы отметить местность, чтобы увидеть, как далеко устройство может перемещать этот ход.
Как только вы это узнаете, пройдите через вашу доступную тактику (рукопашный бой, исцеляйте дружественную единицу, что угодно) и назначьте функцию фитнеса для всех доступных видов использования тактики. Если вы пройдете по отмеченной местности, вы можете очень быстро определить, каково ваше пространство возможных тактик.
Это дает вам список доступных тактик и их фитнес-функции для каждого хода. Выберите лучший или рандомизируйте сверху. Если тактики не существует, повторите процесс с отметкой местности для двух ходов и т.д.
То, что я подразумеваю под функцией фитнеса, - это определить "ценность" выполнения тактики на определенной единице или месте. Например, ваша тактическая фаза "исцелить дружественную единицу" может пройти через все дружественные подразделения. Если дружественный юнит находится в радиусе действия (т.е. Достигнут с места, куда может дойти ваш объект), добавьте его в список возможных тактик и дайте ему рейтинг пригодности, равный, скажем, 100 * (1.0 - единице здоровья), где здоровье здоровья варьируется от 0 до 1. Таким образом, исцеление персонажа до оставшегося до 10% здоровья будет стоить 90 очков, тогда как единица только на 5% будет стоить всего 5, и блок даже не рассмотрит возможность исцеления неповрежденных Блок. Особые единицы (т.е. "Защищать босса", необходимые для сохранения условий победы) могут получить более высокий базовый номер, чтобы им уделялось больше внимания дружественными единицами.
Аналогично, ваша фаза принятия решения о "ближней атаке" будет проходить через все доступные вражеские юниты, вычислять вероятный урон и сравнивать это с здоровьем юнита. Дайте каждой единице "желательность" для атаки и умножьте ее на процент оставшегося здоровья, которое вы, вероятно, сделаете, и у вас есть довольно подробная функция фитнеса, которая способствует устранению единиц, когда вы можете, но по-прежнему идет за высокой стоимостью цели.
Используя такой процесс, вы получите список таких параметров, как "Переместить в местоположение A и исцелить дружественный блок B: 50 баллов", "Переместить в местоположение C и атаковать враждебную единицу D: 15 очков" и т.д. Внезапно очень легко выбрать тактику.
Дальнейшие подробности могут быть добавлены путем умножения пригодности тактики на пригодность для пути, который вы должны были бы предпринять для его реализации. Например, если место, в которое вы должны были бы двигаться, чтобы исцелить дружественную единицу, ставит вас в серьезную опасность (то есть, стоя на лавовом пространстве или что-то в этом роде), вы можете учитывать это путем умножения пригодности этой тактики на .2 или так, так что блок все еще может его рассмотреть, но только если это действительно важно. Все это требует написания алгоритма для оценки пригодности данного местоположения и может быть таким же простым, как предварительно вычисленное число "желательности местности" или сложное, как поддержание "карт угроз" вражеских юнитов.
Жесткая часть, конечно же, находит правильные меры, чтобы сделать двигатель умным. Но это забавная часть вашей системы для настройки.
Ответ 2
Если рельеф местности, где происходит битва, предварительно определен или не слишком широк, там есть статья о причинах местности в FPS, могут быть использованы в качестве основы для пошаговой игры.
Короче говоря, вы заранее вычисляете для каждой ячейки карты набор значений, таких как пригодность для съемки в заданном направлении, защита, видимость... и так далее. ИИ может затем использовать эти значения для выбора правильного действия. Например, истребитель будет как можно быстрее продвигаться к энтузиазму, используя защиту, если он доступен, в то время как вор будет идти по пути, где видимость от направления ennemy как можно ниже, с целью атаки с фланга или сзади.
если рельеф местности рандомизирован и/или слишком широк, предварительный подсчет может быть длинным, чтобы быть полезным.
С уважением
Гийом
Ответ 3
Хороший вопрос ответы могут быть повсюду. Лично у меня нет большого опыта в этом, но я бы поставил стратегию вокруг концепции, а не расстояния.
Вы собираетесь создать конечный автомат для каждого NPC. Он будет предсказывать атаку персонажа с помощью некоторых настроек.
Например, NPC будет помечен как атака слабее или атаковать сильнее или атаковать наиболее раненых. Затем я попытался расположить их так, чтобы они могли повредить желаемую цель.
Если у вас также есть целители, вы можете сделать то же самое в обратном направлении цели целителя.
Изменение цели также станет важной частью этой системы. Поэтому вам захочется подумать об этом. Простая версия состоит в том, чтобы переоценить переменную цель на определенный процент поворотов.
И, наконец, я бы добавил случайную возможность в систему. Например, символ можно установить следующим образом
Атака слабая .25
Атака сильнейшая .50
Атака наиболее ранена .25
Измените цель .1
Когда пришло время атаковать. Вы генерируете случайное число от 0 до 1. Если он под вами изменяет цели, вы изменяете цель, генерируя другое случайное число цели для атаки.
Вы можете начать измерять расстояние в вашей системе, увеличив процентное соотношение режима атаки.
Например, если потребуется три витка, чтобы напасть на самых раненых. Уменьшите его процент от таргетинга, разделив это значение на 3 и распределив разницу с двумя другими возможностями.