Абзац
:: Поиск
:: ПоддерЖка ПрОекта
Webmoney:
  • Z610389805629
  • R427996570517
  • E023541002978
  • :: №23 (24.02.2005) ПрОсмотрОв: 3345

    Рубрика: В помощь разработчику.

    Номер: №23 (24.02.2005).



    Интеллект компьютера в стратегиях реального времени

    От редакции: По некоторым данным, представленная ниже статья должны была войти в журнал ZX-Format #9. Как известно, данный номер журнала так и не увидел свет, поэтому эта статья публикуется у нас, дабы ознакомить тех читателей, которые с ней до сих пор не знакомы.

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

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


    Уровень 1.

    Инстинкт самосохранения.

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

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

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


    Уровень 2.

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

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

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

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

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


    Уровень 3.

    Тактический.

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

    4    для юнитов, занятых разработкой и добычей ресурсов;

    4    для юнитов, стоящих на охране;

    4    для юнитов, идущих в атаку.

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

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

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

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

    4    для волшебников и магов (здесь обычно определяются приоритеты при выборе одного заклинания из многих и при выборе объекта применения заклинания);

    4    для патрулирующих юнитов (в целом схожи с охранниками);

    4    для транспортных кораблей (кого и как подобрать на борт, и кого и как десантировать. Естественно, на борт берутся только атакующие юниты, а не охранники или работники. Место десантирования определяется следующим уровнем компьютерного интеллекта - стратегическим);

    4    для ремонтников (хотя в большинстве игр правила таких юнитов являются подмножеством правил ресурсодобытчиков);

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

    4    и так далее...


    Уровень 4.

    Стратегический.

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

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

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

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

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

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

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

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

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

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

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

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

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

    Уровень 4. Полноценная игра!


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


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

    K_ANSW    ;ответ врага на удар
        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

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

    © 2004-2013 Perspective group