ai Tutorials Искусственный интеллект

(c) Copper Feet '99

Хотя я люблю длинные и нравоучительные вступления, на сей раз перейдём прямо к делу :).

Hа мой взгляд, интеллект компьютера в real-time стратегиях должен состоять из четырёх уровней, описанных ниже:

Уровень 1. Инстинкт самосохранения.

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

Hапример, при ответе на атаку проверяется, не атакует ли уже воин другую цель и есть ли необходимость переключаться на новую цель. Юниты, не умеющие вести ближний бой (танки, катапульты, ...) должны постараться предварительно отойти на необходимую для стрельбы дистанцию. В большинстве игр воин может постараться позвать на помощь ближайших соседей, если они сами ещё не догадались этого сделать.

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

Уровень 2. Сканирование местности.

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

Глубина осмотра обычно зависит от дальности стрельбы юнитов, хотя для воинов, управляемых компьютером рекомендуется делать её равной максимальной дальности стрельбы. В этом случае, далеко стреляющая катапульта или вертолёт не смогут подобраться незамеченными к близко атакующему меченосцу или пехотинцу. Впрочем, этот момент в различных играх реализован по-разному.

Алгоритмов сканирования достаточно много - попарное сравнение координат юнитов, спиральный осмотр местности, посекторный осмотр, предварительное деление местности на квадраты (хеширование). Подробный обзор их был представлен в ZX Format#8 в статье "Эпопея".

Описанные выше базовые уровни интеллекта обычно реализуются как для воинов, управляемых компьютером, так и для воинов, управляемых человеком. Хотя вариант для воинов компьютера стоит делать более гибким и предусматривать как можно больше различных вариантов.

Уровень 3. Тактический.

Здесь определяются базовые действия юнита, целиком зависящие от его умений и свойств. Поэтому с полным правом этому уровню можно дать другое название - профессиональный. Для каждого типа компьтерных героев обычно разрабатывается собственный тактический (профессиональный) блок. Hаиболее часто используются три типа таких блоков:

В первом случае, блок правил описывает, куда доставлять добытые ресурсы, что делать, если добыча ресурсов в данном месте исчерпана или была ранее прервана (например, внезапным нападением войск человека). Здесь же могут быть описаны специальные правила, касающиеся ремонта повреждённых зданий и строительства новых зданий (хотя зачастую этими задачами занимается стратегический уровень, речь о котором ещё впереди).

Блок правил для охраны предписывает действия по защите вверенной территории. Обычно он сводится к следующему - "стой на месте и ничего не делай". Действительно, почти все задачи по охране решаются двумя нижними уровнями интеллекта. Единственное дополнительное правило определяет способ возвращения на место после отражения атаки.

Действия атакующих юнитов, как правило, делятся на две фазы. Первая - "иди к точке сбора". Вторая - "иди в атаку". В этот блок могут быть добавлены условия отступления (например, от трусости, от ранений или если рядом нет своих), если, опять же, этим не занимается стратегический блок.

Кроме описанных выше наиболее распространённых сводов правил, в любой игре обычно существует некоторое количество специальных тактических правил для малораспространённых типов юнитов:

Уровень 4. Стратегический.

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

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

Во-вторых, компьютер должен заниматься апгрейдами и исследованиями.

В-третьих, он должен заниматься организацией атак. Для этого он должен сначала выбрать место предварительного сбора (если, конечно, его воины не идут в бой сразу после того, как их произвели). Затем, по истечении некоего времени или, когда наберётся необходимый по численности (по силе) отряд, компьютер должен отправить его в бой. Предварительно необходимо выбрать объект или место цели. Здесь же необходимо управлять транспортами (ежели таковые имеются).

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

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

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

Третий и четвёртый уровни интеллекта обычно программируют только для компьютера. Однако, в нашем мире лентяев и умственных вырожденцев, видимо, не так долго осталось ждать, когда авторы игр начнут реализовывать эти уровни и для юнитов человека (в той или иной степени). Дабы играющий не очень напрягал свою единственную серую извилину :).

Почему я принял именно такое деление на уровни для AI компьютера? Очень просто - практика создания игр "Чёрный Ворон I и II" показывает, что именно в таком порядке легче всего разрабатывать и отлаживать программы интеллекта. Последовательно реализуя перечисленные уровни, вы получаете примерно следующее:

Уровень 0 (без интеллекта). Юниты компьютера стоят на месте и не двигаются.

Уровень 1. То же, что и уровень 0. Юниты компьютера не реагируют на ваши боевые единицы, пока те не нанесут удар первыми.

Уровень 2. То же, что и уровень 1. Вдобавок, юниты компь- ютера реагируют на приближение ваших солдат и стараются их атаковать.

Уровень 3. То же, что и уровень 2. Однако идёт активная добыча ресурсов, волшебники пытаются колдовать и гадить вам, охранники компьютера возвращаются назад после отражения вашей атаки. Hо никаких активных действий против вас компьютер не предпринимает.

Уровень 4. ПОЛHОЦЕHHАЯ ИГРА!

Вот, собственно и всё, что я хотел вам сказать...

Всегда ваш, Вячеслав Медноногов. 17.07.1999.

В качестве примера - как реализуется уровень 1 интеллекта gля юнитов врага приведу текст для gля Z80 на asm.Комментарии частично иллюстрируют иgею:

K_ANSW  ;ответ врага на уgар
         CP #FF ;удар без автора?
         JR C,knsw0
         PUSH IX
         LD IX,(en_IX)
         CALL R_awa_
         JP knsw11
knsw0   AND #7F ;%1...
        CP _NHER
        RET NC ;враг ударил врага
         CALL HL_IX0
         LD A,L
         OR A
         RET Z ;ударивший мёртв
         LD (LED3XY),HL
         LD A,5+#80
         LD (LED+3),A ;индикатор#3 вкл
        PUSH IX
        LD IX,(en_IX)
        LD A,(IX+com)
        CP 4
        JR NZ,knsw03
        ;
        ;атакуешь ли ты уже того, кто атакует тебя?
         LD A,(IX+tarN)
         PUSH IX
         CALL N_IX
         LD A,(IX+com) ;парам текущей цели
         LD L,(IX+tarN)
         POP IX
         CP 4 ;атакует?
         JR Z,knsw01
         CP 26
         JR Z,knsw01
         CP 28
         JR NZ,knsw02
knsw01   LD A,L ;атакует тебя (твоих)?
         SUB _NHER
         CP _NHER
         JR C,knsw031
knsw02   LD A,28 ;можно сменить цель
         LD (IX+com),A
        ;
knsw03  ;возможен ответ на удар?
        LD HL,impANS
        CALL BA
        OR A
        JP Z,knsw11
knsw031 ;земля против неба = ОК?
        CALL AVvsGND
        LD A,(IX+com)
        JR NZ,knsw05
        ;
        ;уже воюешь? - продолжай
        CP 4
        JR Z,knsw032
        CP 28
        JR NZ,knsw04
        ;воюешь со зданием?
knsw032 LD A,(IX+tarN)
        BIT 7,A
        JR Z,knsw11
        ;не можешь ответить - сматывайся
knsw04  LD A,(IX+typ)
        CP 6
        JR Z,knsw11 ;кроме зенитки
        LD A,(HER_N)
        AND #7F  ;%1...
        LD (IX+tarN),A
        LD (IX+com),3
        CALL R_awayX
        JR knsw11
        ;
knsw05  ;уже в атаке?
        CP 4
        JR NZ,knsw08
        ;старая и новая цель - одно и тоже?
        LD E,(IX+tarN)
        LD A,(HER_N)
        AND #7F
        CP E
        JR Z,knsw11
        ;старая цель - здание?
        BIT 7,E
        JR NZ,knsw08
        ;сравнить с текущей целью и ударить, кого ближе
        POP HL
        PUSH HL
        LD A,(HL)
        INC HL
        LD H,(HL)
        LD L,A
        CALL DIST2 ;до нового обидчика+1
        INC A
        LD C,A
        PUSH IX
         LD A,E
         CALL N_IX
         CALL HL_IX0
        POP IX
        CALL DIST2 ;до старой цели
        CP C ;сравнить
        EX AF,AF
        LD A,(IX+typ)
        CP 9
        JR NZ,knsw07
        ;для танка - особые условия (бей, кого дальше)
        EX AF,AF
        JR Z,knsw11
        CCF
        EX AF,AF
        ;для всех остальных
knsw07  EX AF,AF
        JR C,knsw11
knsw08  LD (IX+com),4
        ;
knsw10  ;принять новую цель
        LD A,(HER_N)
        AND #7F  ;%1...
        LD (IX+tarN),A
        CALL HL_IX0
        CALL IXt_HL
        CALL ix_93a
knsw11  POP IX
        RET

PMG   26 Августа 1999   (c)   Vyacheslav Mednonogov