3DMGAME论坛

标题: 教学贴:如何编写AI [打印本页]

作者: 溯雪无踪    时间: 2010-4-18 23:53
标题: 教学贴:如何编写AI
先占位。各位AI作者报到吧.........

现在很多朋友对现有的AI不满意,可以从自己写开局开始,很简单的,只要看得懂数字就行。

第一步,我们做一个12pool爆狗虫族吧。

1) 删掉所有外来AI的痕迹,因为我们不想受到他们的干扰。

2) 在TriggerLibs目录下建立一个Zerg.galaxy【因为要做虫族AI】文本文件,往里面复制黏贴下列内容

先不要懂在干什么,照做就行了

void MyMainLoop(int player) {

}

void AINewUnitZerg(int player, unit u) {
    wave w;
    string type = UnitGetType(u);
    if (type == c_ZU_Larva || type == c_ZU_Broodling || type == c_ZU_Mantaling) {
        return;
    }
    if (UnitTypeTestAttribute(type, c_unitAttributeStructure)) {
        return;
    }
    if (UnitTypeTestFlag(type, c_unitFlagWorker)) {
        return;
    }
    if (type == c_ZB_SpineCrawler || type == c_ZB_SporeCrawler) {
        AIWaveAddUnitPriority(AIWaveGet(player, c_waveHome), u, c_prioWavePeon);
        return;
    }
    if (type == c_ZU_Queen) {
        AIWaveAddUnitPriority(AIWaveGet(player, c_waveHome), u, c_prioWavePeon);
        return;
    }
    if (type == c_ZU_Overseer) {
        AINewDetector(player, u, true);
        return;
    }
    if (type == c_ZU_Overlord || type == c_ZU_OverlordCocoon ) {
        AIAddToExtraScoutGroup(player, u);
        return;
    }
    if (AIWaveNeedClearObsUnits(player)) {
        if (type == c_ZU_Zergling || type == c_ZU_Roach || type == c_ZU_Hydralisk) {
            AIMergeUnit(player, u, AIWaveGet(player, c_waveClearObs));
            return;
        }
    }
        AIMergeUnit(player, u, AIWaveGet(player, c_waveAttack));
}

void AIWaveThinkZerg(int player, wave w, int type) {
    AIWaveThinkDefault(player, w, type);
}

unit AIGetScoutZerg (int player, int index, unit prev) {   
    unit seer;
    if (!AIGetFlag(player, e_flagsScouting)) {
        return c_nullUnit;
    }
    if (UnitGetType(prev) == c_ZU_Overseer) {
        return prev;
    }   
    seer = AIGrabUnit(player, c_ZU_Overseer, c_prioScout, null);
    if (seer) {
        return seer;
    }
    if (prev) {
        return prev;
    }
    if (AIGetFlag(player, e_flagsLateScout)) {
        return c_nullUnit;
    }
    return AIGrabUnit(player, c_ZU_Overlord, c_prioScout, null);
}

void AIMeleeZerg(int player) {
        int magicNumber = 88888;
        int mainState = AIState(player, e_mainState);
        if (mainState != magicNumber) {
                AISetMainState(player, magicNumber, e_mainSubState_Unset);

                AIHarvestBonus(player, 1.0);
                AISetDifficulty(player, c_diffNormalVision, false);
                AISetDifficulty(player, c_diffLimitAPM, false);
                AISetDifficulty(player, c_diffFleeDamage, false);
                AISetDifficulty(player, c_diffWaveAvoidDanger, false);
                AISetDifficulty(player, c_diffEnableDangerMap, false);
                AISetDifficulty(player, c_diffDefendWithPeons, true);
                AISetDifficulty(player, c_diffEarlyDefenseScout, false);
                AISetDifficulty(player, c_diffAdvanceWave, true);
                AISetDifficulty(player, c_diffOptimizeGas, true);
                AISetDifficulty(player, c_diffAutoLoadBunkers, true);
                AISetDifficulty(player, c_diffEarlyGameRepair, true);
                AISetDifficulty(player, c_diffNormalTargetPrio, true);
                AISetFlag(player, e_flagsRunScared, false);
                AISetFlag(player, e_flagsScouting, false);
                AISetFlag(player, e_flagsEarlyDefScout, false);
                AISetFlag(player, e_flagsLateScout, false);
                AISetFlag(player, e_flagsDiversion, true);
        AISetFlag(player, e_flagsClearObs, true);
               
                AISetNumScouts(player, 1);
                AIReqCountAsBuiltObject(player, c_ZU_Larva);
                AITechCountFixupSingle(player, c_ZB_HydraliskDen, c_ZB_LurkerDen);
                AITechCountFixupSingle(player, c_ZB_Spire, c_ZB_GreaterSpire);
                AITechCountFixupInOrder(player, c_ZB_Hatchery, c_ZB_Lair, c_ZB_Hive);
                AISetCreepBuilding(player, c_ZB_CreepTumor, "ZergBuildingNotOnCreep");
               
                UIDisplayMessage(PlayerGroupAll(), 1, StringToText("Test AI [Zerg]"));
        }
        MyMainLoop(player);
}

然后运行星际,记得打开一个虫族电脑,看到Test AI字样就说明成功第一步

3) 好,现在我们开始造农民,造狗池,等等

void MyMainLoop(int player) {
    AIClearStock(player);
        AISetStock( player, 1, c_ZB_Hatchery_Alias );
    AISetStock( player, 10, c_ZU_Drone );
    AISetStock( player, 2, c_ZU_Overlord );
    AISetStock( player, 13, c_ZU_Drone );
    AISetStock( player, 1, c_ZB_SpawningPool );
    AISetStock( player, 14, c_ZU_Drone );
    AISetStock( player, 400, c_ZU_Zergling);
        AIEnableStock(player);
}

先保证有基地,然后造10个农民,然后造一个新的宿主(所以就有2个宿主),然后造到13个农民,然后放狗池,然后再造1个农民,然后不断造小狗

但是肯定很快就造不出来的,因为卡人口了,所以我们还要加上自动造宿主的功能

4) 自动造宿主方法




欢迎光临 3DMGAME论坛 (https://bbs.3dmgame.com/) Powered by Discuz! X3.2