3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 7663|回复: 28
打印 上一主题 下一主题

[原创] 教学贴:如何编写AI

[复制链接]

0

主题

267

帖子

449

积分

高级玩家

Rank: 4

贡献度
73
金元
2168
积分
449
精华
0
注册时间
2010-3-21
跳转到指定楼层
主题
发表于 2010-4-18 23:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先占位。各位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) 自动造宿主方法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-4-7 06:15 , Processed in 0.028040 second(s), 18 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表