Текущий архив: 2006.05.07;
Скачать: CL | DM;
ВнизЭлементарный ИИ в стратегиях Найти похожие ветки
← →
Ricks © (2005-10-11 01:34) [0]Пишу что-то очень похожее на стратегию. Сделал уже ландшафт и передвижение по нему объектов. Возникла такая задача: необходимо сделать искуственный интеллект, не обязательно сложный. Вопрос вот в чем - как должен себя вести, скажем какой-либо боевой объект (желательно указать в виде пунктов)?
← →
XProger © (2005-10-11 03:32) [1]Всё зависит от того, какие задачи этот самый AI должен решать...
Включи фантазию! ;)
← →
boalse © (2005-10-11 08:21) [2]А как бы ты себя вёл, если бы был фанатичным солдатом армии, в которой служишь?
1. Эвристическая оценка обстановки (Какой дан приказ, какие враги поблизости, как лучше замочить конкретного противника, до какого противника меньше переться, кого проще загасить и т.д. Но юнит при этом анализе должен руководствоваться в первую очередь приказом игрока, приказ может быть, может нет).
2. Принятие решения на основании 1.
3. Попытка выполнить решение.
4. При неудачной попытке выясняем, почему она сорвалась (допустим, натолкнулись на препятснвие), на основе этих выяснений возвращаемся к 1 и далее по кругу.
Включи фантазию! ;)
← →
Signate © (2005-10-11 09:34) [3]Не в тему, но все же...
Ricks, у тебя получилось сделать выделение тайлов мышкой!? Можешь стукнуть мне в аську?
← →
Ricks © (2005-10-11 13:27) [4]
> boalse
Спасибо, буду включать :)
> Signate
Я выделял не тайлы, а объекты. Получилось! Ошибка была из-за того, что объект на самом деле перекрывался указателем мыши (не cursor, а полигоном с текстурой)!
procedure UpdateCamera;
begin
gluLookAt(ViewPos.x, ViewPos.y, ViewPos.z, TargetPos.x, TargetPos.y, TargetPos.z, 0, 1, 0);
end;
function GetMousePos(x, y : integer):TVector;
var mm : TMatrix4d;
pm : TMatrix4d;
vp : TVector4i;
c : TVectorD;
z : single;
rY : integer;
begin
UpdateCamera;
glGetIntegerv(GL_VIEWPORT, @vp);
rY:=vp[3] - y - 1;
glGetDoublev(GL_MODELVIEW_MATRIX, @mm);
glGetDoublev(GL_PROJECTION_MATRIX, @pm);
glReadPixels(x, rY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @z);
gluUnProject(x, rY, z, mm, pm, vp, @C.X, @C.Y, @C.Z);
if (c.x < 0) or (c.z < 0)
then Result:=Vector(-1, -1, -1)
else Result:=Vector(c.x, c.y, c.z);
end;
Вот так вот и все работает!
← →
Ricks © (2005-10-11 13:39) [5]Так, если я правильно понял:
-перебираем все объекты, расстояние до которых меньше или равно области видимости данного объекта + выбрасываем все "свои" объекты
-наверное надо первыми проверять не здания, а боевые объекты
-смотрим, у кого меньше жизни
-атакуем
так?
Это если без команды игрока (с командой должно быть легче)
← →
Da Stranger © (2005-10-11 15:28) [6]
> -смотрим, у кого меньше жизни
Не у кого меньше жизни, а кого удобнее атоковать. Толку от того, что снайпер будет бить по танку, мало. Т.е. должна быть некая таблица приоритетов для всех типов юнитов.
← →
Lord Zmiy © (2005-10-11 15:38) [7]+ 6 таблица приоритетов целей для каждого юнита это правильно ... просто многиее ии не удовлетворяет этому условию так что вот это я бы взял за основу ...
а вот до кого быстрее бежать у кого меньше жизни
← →
Lord Zmiy © (2005-10-11 15:39) [8]еще бы добавил от кого было бы лучше убежать без команды игрока :)
← →
Bogdan1024 © (2005-10-11 23:16) [9]"Найми" себе человека, который будет думать что должен делать юнит :)
← →
Ricks © (2005-10-12 00:12) [10]
> Bogdan1024
Да нет, это не годится. Пишу чисто сам!
Вобщем таблица приоритетов, я так понял должна составлятся по ходу игры, учитывая некоторые свойства противника!?
← →
Don Nikola (2005-10-12 04:52) [11]Greetings,
я бы посоветовал сделать разбивку аи на несколько уровней:
- стратегия. следит за ресурсами, строениями и целями игры, управляет группами
- группы. основной элемент, управляет юнитами
- юнит. решает только в кого из целей группы стрелять и когда паниковать и смываться на базу или в лес
Если ориентироваться только на юниты, тяжело будет их координировать, imho
← →
Da Stranger © (2005-10-12 18:27) [12]
> Вобщем таблица приоритетов, я так понял должна составлятся
> по ходу игры, учитывая некоторые свойства противника!?
По ходу игры нужно делать как можно меньше всяких расчётов. Если у тебя 20 пехотинцев могут из автоматов замочить один танк - значит её вообще не надо.
У меня такая таблица сделана в виде коофицентов наносимого ущерба. Эта таблица является свойством каждого юнита. Например,
для общего случая этот коофицент 1,
для случая автоматчик - танк 0,
для случая чел_с_базукой-танк 2.5 ,
для случая чел_с_базукой - автоматчик 0.5 и т.п.
← →
Fosgen (2005-10-14 15:25) [13]Никто не пытался смоделировать ИИ на основе иерархического подчинения - ну как в приведенном варианте от Don Nikola, только с более четкими границами передачи приказов и принятия решений?
Например - командующий центр принимает решение о направлении атаки и коэффициенте превосходства над силами противника; командиры частей - принимают решение куда лучше перемещаться именно его части и какую долю общей задачи выполнять (кого прикрывать, кто идет в первой линии и т.д.); командиры позразделений - в зоне и направлении, определенном командирами частей, цели атаки, точки перемещений, цели и радиусы прикрытия; отдельные юниты в подразделении - выбор цели, осуществление атаки, перемещения, отступления и т.д. в соответствии с приказом командипра подразделения.
Таким образом достигается более детальная проработка общей задачи "замочить противника" на каждом уровне, что позволяет опять же на каждом уровне делегирования приказа вносить коррекции по ситуации и создать более гибкую систему реагирования.
Я лично собираюсь в своей игре делать именно так.
Страницы: 1 вся ветка
Текущий архив: 2006.05.07;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.01 c