Zelya » 20 фев 2015, 11:56
Ну, если коротко, то алгоритм приблизительно таков.
1. Комп оценивает все юинты противника согласно их урона, плюс некоторые повышающие коэфициенты для летунов, прикрытых стрелков и неприкрытых стрелков. Абсолютно неважно против какой защиты расчитывать урон, хоть против крестьян, так как восновном он пропорционален.
2. Потом, при ходе совего юнита, расчитывется, сколько такого урона он мог бы уничтожить, если б ударил этот стек. Грубо говоря, насколько слабее этот стек будет бить после нашей атаки. Совершенно пофиг, можем ли мы достичь жтот стек или нет на данный ход. Причем, нужно учесть, что даже если мы не убиваем "жирный" юнит, мы его ослабляем. Т.е. считаем не только количесвто убитых юнитов, но снятые хитпоинты. Это есть "базовая полезность"
3. Теперь, создаем логическую карту полезности, аналог боевого поля. Расставляем "базовую полезность" по местам, где стоят вражины. От каждого врага пускаем "волну" по всем доспутным для хождения клеткам. "Волна" добавляет к каждой непосещенной ею до этого клетке "некоторую полезность". Это "некоторая полезность" уменшается с каждым ходом. В самом простом случае в два раза. Т.е. при условной полезности юнита в 1000, соседние клетки от него увеличатся на 500. Клетки на расстоянии в два хода на 250 и т.д. В местах, где нельзя пройти, либо где волна для текущего юнита уже побывала, она "глохнет". Ну, стандарт, для всех волновых алгоритмов.
4. Когда все волны прошли, мы имеем оценку "полезности" каждой клетки. Теперь очередь за перебором. ИИ перебирая все возможные варианты хода юнита выбирает такой, чтобы: юнит нанес наибольший урон по полезности врага, и чтобы при этом он стоял на наиболее ценной клетке.
Вот и все в простейшем случае. Можно учложнить, когда ИИ считает теоретическую ответку и добавляет штрафы.
При умелом подборе коэфициентов имеем прекрасные результаты, когда, например, ИИ игнорируя одинокого стрелка противника на его пути, не атакует лишь бы приблизится на ход-два к жирному опасному стеку.
Конечно, такой алгоритм тоже обманывается на раз-два, и можно добавить несколько "ограничителей". Например, летунов вне зоны досягаемости можно игнорировать (для первых-вторых героев). Для стрелков можно сдлеать принцип "убегания" от перекрытия.
В самом сложном случае (я не использовал), можно пробовать анализировать возможный ход противника по таким же критериям и строить перебор на несколько ходов вперед. Но насколько это будет качественно, я не знаю.
Если нужно, могу помочь с кодом.