AI для финальной фэнтезийной тактической игры - PullRequest
16 голосов
/ 28 июня 2010

Я реализую небольшую, основанную на сетке, пошаговую стратегию в соответствии с тактикой Final Fantasy.

Есть ли у вас какие-либо идеи о том, как я могу подойти к процессу выбора цели, движения и выбора навыков?

Я рассматриваю возможность отключения решений, но все эти 3 решения в значительной степени связаны между собой.(Например, я не могу решить, куда двигаться, если я не знаю, кого я собираюсь атаковать, и какой диапазон имеет навык, который я буду использовать, и наоборот, я не могу решить, кого атаковать, если я не знаю, сколько его превратитя доберусь до каждой цели)

Я хочу перейти к единой системе, но при испытаниях из Потенциальных полевых исследований, используемых таким образом, как в ИИ Killzone 1, я застрял на локальных максимумах.

=== Обновление 1

В настоящее время я пытаюсь использовать потенциальные поля / карты влияния для генерации данных, по которым я принимаю решения.

Я понятия не имею, как справиться смножество навыков и умений, которые не наносят урона, а скорее дают положительный эффект / дебафф или изменяют мир.

Кто-то в другом месте предложил использовать поиск по дереву Монте-Карло, используемый в настоящее время в играх Го.

Я считаю, что пространство, которое будут использовать мои актеры, не очень хорошо для него, так как многие ходы в игре не приводят к позиции, из которой вы можете атаковать и влиять на мир (я нахожусь в миребольше, чем заключительная фантазийная тактика)

В заключительной фантазийной тактике она может быть успешно применена, хотя коэффициент ветвления намного больше, чем у 9x9 Go (насколько я понимаю)

===

Заранее спасибо, Xtapodi.

ps.1 - Проблема в том, что чтобы точно знать, как далеко враг, мне нужно найти его, потому что, хотя враг рядом, непроходимыйскала может отделить нас, что занимает 4 хода, чтобы обойти.Или, что еще хуже, юнит блокирует путь, скажем, мост, так что на самом деле нет способа добраться до него.

Ответы [ 3 ]

14 голосов
/ 11 июля 2010

Один из подходов, которые я использовал, состоит в создании двухпроходной системы.

Сначала выясните, куда может направиться ваше подразделение.Используйте A * или что-то еще, чтобы отметить местность, чтобы увидеть, как далеко отряд может двигаться в этом ходу.

Как только вы это знаете, переберите свою доступную тактику (рукопашная атака, лечите дружественного отряда, что угодно) и назначьтефитнес-функция для всех доступных применений тактики.Если вы пройдете по помеченной местности, вы сможете очень быстро определить, какое у вас пространство возможных тактик.

Это дает вам список доступных тактик и их функций пригодности для каждого хода.Выберите лучший или рандомизируйте сверху.Если нет никакой доступной тактики, повторите процесс с пометкой местности в течение двух ходов и т. Д.

Что я имею в виду под функцией фитнеса, так это принять решение о «ценности» выполнения тактики наопределенная единица или местоположение.Например, ваша фаза тактического решения «исцелить дружественный отряд» может пройти все дружественные отряды.Если дружественный отряд находится в пределах досягаемости (т. Е. Доступен из местоположения, в котором он может дойти), добавьте его в список возможных тактик и присвойте ему рейтинг пригодности, скажем, 100 * (1,0 - здоровье отряда), гдездоровье юнита колеблется от 0 до 1. Таким образом, исцеление персонажа, у которого осталось только 10% здоровья, будет стоить 90 очков, в то время как юнит, уронивший всего 5%, будет стоить только 5, и юнит даже не будет рассматривать исцеление без повреждений.Блок.Специальным юнитам (т. Е. Сценариям «защитить босса», необходимым для сохранения условий победы) может быть присвоено более высокое базовое число, чтобы им было уделено больше внимания дружественными юнитами.

Аналогично, ваша «атака ближнего боя»Фаза принятия решения будет проходить через все достижимые вражеские юниты, рассчитывать вероятный урон и сравнивать его со здоровьем юнита.Присвойте каждому юниту «желательность» для атаки и умножьте его на процент оставшегося здоровья, который вы, вероятно, получите, и у вас есть довольно подробная функция фитнеса, которая поддерживает удаление юнитов, когда вы можете, но все еще идет после высокой стоимостицели.

Используя такой процесс, вы получите список параметров, таких как «Переместить в локацию A и вылечить дружественное подразделение B: 50 очков», «Переместиться в локацию C и атаковать вражеское подразделение D: 15».точки »и т. д. Внезапно выбрать тактику очень просто.

Дополнительные детали можно добавить, умножив пригодность тактики на соответствие пути, который вам нужно будет использовать для ее реализации.Например, если место, куда вы должны были бы переместиться, чтобы исцелить дружественный отряд, подвергает вас серьезной опасности (т. Е. Стоит на лавовом пространстве или чем-то еще), вы можете учесть это, умножив пригодность этой тактики на.2 или около того, чтобы устройство все еще могло это учитывать, но только если это действительно важно.Все, что для этого нужно - это написать алгоритм для оценки пригодности данного местоположения, и он может быть таким же простым, как предварительно вычисленное число «желательности местности», или таким же сложным, как ведение «карт угроз» вражеских подразделений.

Самая сложная часть, конечно, найти правильные меры, чтобы сделать двигатель умным.Но это забавная часть вашей системы для настройки.

3 голосов
/ 28 июня 2010

Если местность, где происходит битва, предопределена или не слишком широка, там - это статья о рассуждении о местности в FPS, которую можно использовать как основу для пошаговой игры.

Короче говоря, вы предварительно рассчитываете для каждой ячейки карты набор значений, таких как пригодность для стрельбы в заданном направлении, защита, видимость ... и так далее.ИИ может затем использовать эти значения, чтобы выбрать правильное действие.Например, боец ​​будет идти как можно быстрее к вражескому, используя защиту, если таковая имеется, в то время как вор выберет путь, где видимость с вражеского направления настолько низка, насколько это возможно, с целью атаки с фланга или сзади.однако, если местность рандомизирована и / или слишком широка, предварительное исчисление может быть длинным, чтобы быть полезным, однако.

касается Гийома

1 голос
/ 28 июня 2010

Хороший вопрос, ответы могут быть повсюду.Лично у меня нет большого опыта в этом, но я бы определил стратегию вокруг концепции, а не расстояния.

Вы собираетесь создать конечный автомат для каждого NPC.Он будет предсказывать атаку персонажа через некоторые настройки.

Например, NPC будет помечен как Атака слабейшая или Атака сильнейшая или Атака наиболее раненая.Затем я попытался бы расположить их так, чтобы они могли повредить желаемую цель.

Если у вас есть целители, вы можете сделать то же самое в обратном порядке для цели целителя.

Изменение цели также будет важной частью этой системы.Так что вы захотите подумать об этом.Простая версия состоит в том, чтобы переоценить изменение цели заданным процентом ходов.

И, наконец, я бы добавил случайный шанс в систему.Например, персонаж может быть установлен следующим образом:

Слабая атака .25 Сильнейшая атака .50 Сильнейшая атака .25

Смена цели .1

Когда наступает время атаки.Вы генерируете случайное число от 0-1.Если он находится под вами. Смените цели, вы измените цель, сгенерировав другое случайное число того, на какую цель атаковать.

Вы можете начать увеличивать расстояние в вашей системе, увеличивая процент режимов атаки.Например, если потребуется 3 хода, чтобы атаковать наиболее раненых.Уменьшите его процент от цели, разделив это значение на 3 и распределив разницу между двумя другими возможностями.

...