Создание простого (Melee) AI

Содержание:

2. Сбор ресурсов

Каждый знает, что сбор ресурсов является важной аспектом во время игры в Warcraft. Так почему бы не посмотреть на то, как должен быть сделан AI-скрипт для сбора:
function main takes nothing returns nothing
    call Sleep( 1.0 )  // ждать одну секунду
    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script started" )

    loop   // начало вечного цикла
        call ClearHarvestAI()   // Сначала восстанавливаем то, что было сделано менеджером сбора и 
        call HarvestGold( 0, 4 )   // затем говорим ему иместь 4 работника, собирающих золото
        call HarvestWood( 0, 1 )   // и 1 работника, собирающего дерево.
        call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Harvesting" )
        call Sleep( 1.0 )  // Если мы никогда не будем спать, то движок убьёт нас.
    endloop

    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script exiting" )
endfunction
Опробуйте этот скрипт тем же способом, с каким опробовали вышеуказанный “Hello World!”. Вместо удаления более раннего импортированного файла, и дальнейшего добавления новой версии, Вы можете щёлкнуть правой кнопкой мыши (в менеджере импорта) на добавленный до этого файл и выбрать замену.
Не забывайте всегда устанавливать полную видимость в дополнительных настройках игры, иначе вам будет нелегко увидеть, что делает AI-игрок. { Хотя можно воспользоваться чит-кодом “iseedeadpeople”}
Почему мы восстанавливаем и переназначаем менеджеру сбора время? Что случится, если рабочий, рубящий дерево, умрёт? Если мы не восстановим то, что было мделано менеджером сбора, работник больше никогда не сможет быть заменён.
.

3. Подготовка большего количества рабочих

Если у нас есть только 5 работников, то их недостаточно, чтобы создать армию, поэтому давайте создадим гораздо больше рабочих.
function main takes nothing returns nothing
    call Sleep( 1.0 )  // Ждать 1 секунду
    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script started" )

    loop   // начало вечного цикла
        call ClearHarvestAI()   // Сначала восстанавливаем то, что было сделано менеджером сбора и
        call HarvestGold( 0, 4 )   // затем говорим ему иметь 4 работника, собирающих золото
        call HarvestWood( 0, GetUnitCountDone('hpea')-4 )   // а остальным собирать дерево.
        call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Harvesting" )
        call SetProduce(1, 'hpea', 0)  // Попытаться начать тренировку крестьянина
        call Sleep( 3.0 )  // Если мы никогда не будем спать, то движок убьёт нас. 
    endloop
    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script exiting" )
endfunction
GetUnitCountDone('hpea') считает, как много людских крестьян, которых контролирует игрок. Это используется для того, чтобы высчитать, как много крестьян, которые не собирают золото и послать их рубить дерево. Почему бы вам не понаблюдать за компьютером, строящим тысячи рабочих?
Другой способ, чтобы начать карту, полезную для наблюдения за игроками AI, которых мы разрабатываем, - это создать игру LAN, {то же, что и игра по локальной сети, только без дополнительных игроков.}. Если Вы установите дополнительные опции, чтобы позволить полное наблюдение и сделать наблюдателем самого себя, тогда Вы сможете изучать, как много ресурсов имеет AI-игрок при выборе тех или иных юнитов или зданий.
Вы попытались? Построил ли он тысячи юнитов? Нет? Ему нужно больше пищи? Мы скоро сделаем это, построив несколько ферм…

4. Строительство ферм для поддержки большего количества рабочих

Давайте построим несколько ферм, из-за чего мы сможем подготовить большее количество рабочих и получить больше золота. Если мы производим менее чем 3 дополнительных единицы пищи, тогда мы начинаем строить новую ферму.
function main takes nothing returns nothing
    call Sleep( 1.0 )  // ????? ???? ???????
    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script started" )
    loop   
        call ClearHarvestAI()   
        call HarvestGold( 0, 4 )   
        call HarvestWood( 0, GetUnitCountDone( 'hpea' )-4 )   
        call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Harvesting" )
        call SetProduce( 1, 'hpea', 0 )  // ??????????? ???????????

        // Наша база производит еду для 12 людей, и каждая база для 6 людей                           
        // Сравните производимую еду с количеством людей и решите, 
        // стоит ли строить ферму (дом людей).

        if ( 12 + 6 * GetUnitCount('hhou') - GetUnitCount('hpea') < 3 ) then
            call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Trying to build a house" )
            call SetProduce( 1, 'hhou', 0 )   // Строительство фермы
        endif

        call Sleep( 3.0 )
    endloop

    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script exiting" )
endfunction
Благодаря этому получим множество рабочих и множество ресурсов, но не следует ли нам попытаться потратить ресурсы на что-то забавное? Если мы будем создавать больше строений, возможно, эти здания помогут нам тренировать армию. Почему бы нет?

5. Создание барака и подготовка нескольких солдат

Настало время, чтобы предпринять наши первые меры к подготовке армии, которая разрушит всё сопротивление. Давайте начнем с создания барака и подготовим какого-нибудь пехотинца.
function main takes nothing returns nothing
    call Sleep( 1.0 )
    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script started" )

    loop
        call ClearHarvestAI()   
        call HarvestGold( 0, 4 )
        call HarvestWood( 0, GetUnitCountDone( 'hpea' )-4 )
        call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Harvesting" )

        call SetProduce( 1, 'hpea', 0 )  // ??????????? ???????????

        // Наша база производит еду для 12 людей, и каждая база для 6 людей                           
        // Сравните производимую еду с количеством людей и решите, 
        // стоит ли строить ферму (дом людей).

        if ( 12 + 6 * GetUnitCount('hhou') - GetUnitCount('hpea') < 3 ) then
            call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Trying to build a house" )
            call SetProduce( 1, 'hhou', 0 )   // Строительство фермы

        endif

        if ( GetUnitCount( 'hbar' ) < 1 ) then  // Есть ли у нас казармы?
            call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Trying to build a barrack" )
            call SetProduce( 1, 'hbar', 0 )   // Построить казармы (в главном городе).
        else
            call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Trying to train a footman" )
            call SetProduce( 1, 'hfoo', 0 )   // Создать пехотинца (в главном городе).
        endif

        call Sleep( 3.0 )  // Если мы никогда не спим, такой движок может убить нас. 
    endloop
    
    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script exiting" )
endfunction
Возможно, Вы обратили внимание, что AI через некоторое время одновременно остановило конструкцию ферм и строительство юнитов. Можете ли Вы вычислить, почему мы не строим больше ферм, когда мы вот-вот начнём испытывать недостаток пищи? Может быть мы запутались с тем, как много еды мы используем? Может быть, Вы могли бы попытаться уладить эту проблему сами, прежде чем я покажу решение её? (НАМЕК: Есть проблема в одном из условий).
Прежде, чем мы сделаем код больше, подобно созданию других типов зданий, готовящих другие типы военных подразделений, может быть мы могли бы даже позволить подразделениям напасть на что-то? Почему бы нет, но это, вероятно, тяжело и выходит из области этого основного руководства.
Прежде чем попытаться узнать, если это - трудно, самое время познать немного больше о Jass. Пора узнать полезность от присутствия некоторых функций. Это, может быть, даже время, чтобы узнать, где все те странные функции, которые мы использовали до этого, и как они действительно работают. Не уходите.