Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Искусственный интеллект в пошаговой стратегии


Автор: MMA 2.1.2006, 19:02
Люди, кто знает как организовать ИИ(искусственный игтеллект) в пошаговой стратегии. Написал игру для телефона, осталось только дописать рабочих и строительство. Солдаты ходят и воюют(пока только игрока, разумеется), наносят ущерб зданиям и врагам.

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

1) Готовимся к военным действиям: развиваем оружие и прочее что поможет в атаке и обороне.
2) Перед тем как решать военные вопросы, решаем, может докупить ещё
солдат.
3) Воюем...
4) Рабочие разгребают свои дела: ремонт и ресурсы, а также бегство если надо и строительство.

Более ничего в моей игре не используется(типа невоенного улучшения или ещё что).

Думаю с первым и вторым пунктом проблем не возникнет, как и с четвёртым. Нужно решить третий пункт.

Вот мои мысли по этому поводу:
1) Надо создать двойной массив целых чисел равный массиву местности,
проще говоря, если карта 10 на 10 то и массив 10 на 10, для каждого
игрока. Заполнять его нужно так: от каждого солдата вносятся числа - сколько ущерба он может нанести в каждую ячейку.
Например, есть солдат: 3 хода на удар, повреждение 2, всего ходов 7. Около себя, на 2 ячейки вокруг, он может ударить 2 раза(4 единицы ущерба), дальность от 3 до 4 ячеек - 2 еденицы ущерба. Если два солдата могут ударить в одну точку, их ущерб скадывается.

2) Из таких массивов видно(они, как уже сказано, для солдат каждого игрока заполняются отдельно): какие свои объекты под атакой и насколько это серьёзно, то же самое для своих содат: какой ущерб они могут нанести окружающим врагам и вражеским строениям, а какой им самим.
Теперь можно предпринимать какие-то действия.

Пока это мои собственные догадки, не реалезованные на практике.
Может кто знает как по иному описать действия ИИ? Хотелось бы знать побольше способов чтобы выбрать наиболее подходящий.
В интернете найти что-либо очень сложно, я нашёл только общие наброски ИИ для стратегий в реальном времени.

А если не трудно, мыльте мне свои мысли сюда: [email protected]

Автор: Guedda 4.1.2006, 22:10
Да. Ты прав. Необходимо реализовать массив.
ИИ будет на каждом шагу просматривать ячейки массива. Будет определять, сколько шагов осталось до противника. Если оптимально для боя, то стрелять.
Допустим (не знаю, про что пишешь, но вобщем так), у ИИ есть танк в ячейке 0 по вертикали.
Танк может нанести удар в 100 пунктов, когда противник будет на ячейке 1, 80 пунктов на ячейке 2, 60 пунктов на ячейке 3, 40 пунктов на ячейке 4, 20 пунктов на ячейке 5. В остальных случаях танк ничего не сможет сделать.
Данные о повреждениях хранить в десятичном сегменте таким образом: 3050040, где 30 - ID юнита (в данном случае - танк), 050 - количество пунктов жизни (доступно 50 пунктов), 040 - количество боевых единиц (типа боезапасов в танке).
Вот от этого и отрывайся.

Автор: Санчес_ 10.1.2006, 01:21
Поищи в Инете ссылки на тему "альфа-бета алгоритм". Используется в шахматных программах, а шахматы - фактически та же походовая стратегия...

Автор: Empirik 10.1.2006, 09:29
Одного я не понимаю, почему все пытаются мыслить такими абстрактными понятиями как "воюем", "собираем ресурсы". Ведь для компа (кому не нравится, то пусть читают программы) нет понятия ресурсы, то есть юнит компа этого даже не знает. Попробую объяснить юнитам, что хорошо, что плохо, исходя из предназначения юнита. Допустим для крестьянина плохо, когда его бьют, поэтому он должен увеличить расстояние от того, кто его атакует. Для воюющего юнита хорошо наносить повреждение врагу, поэтому он должен идти на сближение с ближайшим противником, и подойдя на расстояние подходящее для атаки, атаковать. В современных играх, по-моему, все строится по этому принципу. То есть создается критериальная функция, она отвечает за то, что хорошо и что плохо для юнита, в зависимости от этого юнит и действует.

Автор: mr.DUDA 10.1.2006, 16:22
(редактировал только грамматические ошибки)

Автор: Guedda 10.1.2006, 16:55
Я про то же и говорю.
А вообще, если хочешь все нормально понять, тогда тебе на gamedev нужно пойти smile

Автор: Empirik 11.1.2006, 13:54
Цитата(Guedda @ 10.1.2006, 16:55)
Я про то же и говорю.
А вообще, если хочешь все нормально понять, тогда тебе на gamedev нужно пойти smile

Пожалуйста дай линку, где на gamedev.ru написанно нормально по искусственному интелекту хоть что-то читабельное. Я видимо слепой был не нашел.

Автор: MMA 11.1.2006, 16:26
Цитата(Empirik @ 10.1.2006, 09:29)
Одного я не понимаю, почему все пытаются мыслить такими абстрактными понятиями как "воюем", "собираем ресурсы". Ведь для компа (кому не нравится, то пусть читают программы) нет понятия ресурсы, то есть юнит компа этого даже не знает.

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

Автор: Empirik 11.1.2006, 20:58
Цитата(MMA @ 11.1.2006, 16:26)
Цитата(Empirik @ 10.1.2006,  09:29)
Одного я не понимаю, почему все пытаются мыслить такими абстрактными понятиями как "воюем", "собираем ресурсы". Ведь для компа (кому не нравится, то пусть читают программы) нет понятия ресурсы, то есть юнит компа этого даже не знает.

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

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

Автор: MMA 13.1.2006, 16:13
Empirik, все гораздо сложнее.
Естественно у объекта есть методы атаки и ремонта, но решения о том что их пора применять принимают не сами эти методы. Есть какай-то глобальныйметод, который оценивает положение всех объектов, а также их положение своих объектов в тех местах, в которых они могут оказаться и то что они могут сделать. Оценки каждого действия выражаются каким-то числом. У каждого объекта выбирается действие с максимальной оценкой, после чего выбирается максимальная оценка из всех максимальных действий объектов(например, если носильщик принеёт 20 золота на скллад - это хорошо на 20 очков, а если копейщик не может ничего сделать - 0 очков(стоять на месте), если лучник палнёт по врагу - это хорошо на 35 очков. Развить технологию - 10 очков. Максимальноа оценка - 35 очков, это действие выполняется). После каждого действия цикл повторяется, пока у всех объектов не кончаться ходы, или пока все комбинации ходов только ухудшат положение компьютера.
Как видно, объектам не обязательно знать что для них хорошо, за все объекты отвечает один глобальный метод. Методы атаки, передвижения тоже глобальны. Все объекты имеют один тип(это так конкретно у меня), метод оценивающий ходы знает исходя из данных об объекте что он может делать. Например, если повреждение, наносимое объектом, равно нулю, то объект должен стремиться уходить из под зоны атаки противником.
Видно, что тут нет необходимости того о чём я думал раньше. А именно что делать сперва: собирать ресурсы, воевать и т.д.

Автор: Empirik 14.1.2006, 18:50
Цитата(MMA @ 13.1.2006, 16:13)
Empirik, все гораздо сложнее.
Естественно у объекта есть методы атаки и ремонта, но решения о том что их пора применять принимают не сами эти методы. Есть какай-то глобальныйметод, который оценивает положение всех объектов, а также их положение своих объектов в тех местах, в которых они могут оказаться и то что они могут сделать. Оценки каждого действия выражаются каким-то числом. У каждого объекта выбирается действие с максимальной оценкой, после чего выбирается максимальная оценка из всех максимальных действий объектов(например, если носильщик принеёт 20 золота на скллад - это хорошо на 20 очков, а если копейщик не может ничего сделать - 0 очков(стоять на месте), если лучник палнёт по врагу - это хорошо на 35 очков. Развить технологию - 10 очков. Максимальноа оценка - 35 очков, это действие выполняется). После каждого действия цикл повторяется, пока у всех объектов не кончаться ходы, или пока все комбинации ходов только ухудшат положение компьютера.
Как видно, объектам не обязательно знать что для них хорошо, за все объекты отвечает один глобальный метод. Методы атаки, передвижения тоже глобальны. Все объекты имеют один тип(это так конкретно у меня), метод оценивающий ходы знает исходя из данных об объекте что он может делать. Например, если повреждение, наносимое объектом, равно нулю, то объект должен стремиться уходить из под зоны атаки противником.
Видно, что тут нет необходимости того о чём я думал раньше. А именно что делать сперва: собирать ресурсы, воевать и т.д.

Приношу свои извинения за не корректную формулировку своих слов. Я под словами хорошо и плохо подразумевал понятия true или false. Можно сказать по другому, под словом хорошо, понимается оптимальное значения критерия поведения в данной ситуации, под словом плохо все остальное. Как, я понял у вас входными параметрами для критерия действия/бездействия юнита выступают следующие величины: окружение юнита, внутреннее его состояние, тип юнита. Каждое действие имеет свою ценовую оценку для заданной обстановки и заданного юнита. И юнит выполняет действие с наивысшей оценкой, если это сказать моими словами, то юнит выполняет то что для него является оптимальным(самым хорошим) в данной ситуации. Еще раз прошу меня извинить за не точность формулировок. Но мы с вами говорим уже одно и то же. Просто вы это называете понятиями отличными от моих

Автор: MMA 19.1.2006, 15:35
Процесс разработки AI теперь пошёл у меня вполне удачно.
Вот решил поделиться опытом.
Оказывается не нужно оценивать всевозможные действия каждого объекта.
Нужно разделить всё управление объектами на несколько задач, например: атака, поход или подготовка в атаку, оборона поселения(нужно как минимум 3 военных задачи сразу), сбор ресурсов(она же создаёт носильщиков, рабочих и т.д.), развитие поселения и т.п. в зависимости от конкретной игры.
Каждая задача будет оценивать игру только со специфическим для неё взглядом и выполнять только свои действия, а так же задавать действия другим задачам. Например, если на нас напали, задача атаки должна оценить положение и если нужно она сама создаст новых воинов, найдя ближайшее к стычке создающее строение(с учётом важности территории на которую напали и других заданных для создания объектов). Если мы собираемся в атаку, нам не так срочно нужены солдаты, и все запросы задачи "поход или подготовка в атаку" передаются задаче "развитие поселения", которая может построить солдат сразу, а может при недостатке ресурсов(ресурсов просто не хватает или они нужны на более важные мероприятия) или жил.площади, отложить создание войнов. Задачи должны следить за тем что они запрашивают на стройку, возможно нужный объект уже есть в очереди и два таких объекта не нужно, тогда выбираем объект с самым высоким приоритетом из заданных, и если новый приоритет выше этого, задаём новый.
Все задачи, кроме "атака" ищут ближайшую точку к уже известной цели, они знают что нужно делать и не тратят время на оценку каких-то посторонних действий. "Атака" же работает только во время драки, она более сложная в плане перемещения объектов, так как объекты могут не только перемещаться для возможности атаки, отступления или ухода из под огня, но и выбирать наиболее выгодное положение для атаки/обороны как одного отдельно взятого объекта, так и нескольких сразу, при этом положение какого-то отдельно взятог объекта может быть хуже некуда, но из-за этого шансы на победу возрастают, т.к. он, например, может отвести часть огня на себя, прикрыв тем самым более слабых/раненых солдат.
Как видно теперь процесс "мышления" направляется в нужную сторону, AI управляет объектами более связанно друг с другом, а значит более эффективно. Тут становиться возможным нападение сразу на несколько игроков, захват новых территорий, и невозможное при управлении каждым объектом в отдельности, отсупление.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)