lost temple 3c ai 怎么用

我是从这http://bbs.wow8.org/thread-152120-1-1.html帖子转来的 很详细,你可以看看.

★1★main程序

+ Shingo Jass Highlighter 0.41

function main takes nothing returns nothing

set ai_player=Player(GetAiPlayer())

set start_loc=GetStartLocationLoc(GetPlayerStartLocation(Player(GetAiPlayer()-10)))

if GetPlayerController(Player(GetAiPlayer()-10))==MAP_CONTROL_COMPUTER then

set ally=true

endif

call SetMeleeAI() //开始对战AI

call SetDefendPlayer(true) //设置单位攻击时防御

call SetHeroesBuyItems(true) //设置英雄自动买物品

call SetHeroesFlee(true) //设置英雄生命值少时自动逃跑

call SetHeroesTakeItems(true) //设置英雄自动捡物品

call SetIgnoreInjured(true) //设置单位忽视伤害(战斗时红血都不自动跑)

call SetPeonsRepair(true) //设置农民自动维修

call SetRandomPaths(true) //设置随机路线(估计在进攻,逃跑随机路线)

call SetSmartArtillery(true) //设 置 炮 兵 巧 妙 攻 击 。 (太 近 会 走 开 点 去 攻 击 ?)

call SetTargetHeroes(true) //设 置 英 雄 目 标 。( 为 主 要 目 标 ?)

call SetUnitsFlee(true) //设置单位可以逃跑

call SetWatchMegaTargets(true) //开始对战AI

call SetCaptainChanges(true) // 设 置 监 视 大 单 位 ( 主 要 的)。

call CreateCaptains() // 创建队长(好像是英雄带领小兵)

call StartThread(function attack_loop) // 开始线程,运行 (function attack_loop)

call StartThread(function check_hp) // 开始线程,运行(function check_hp)

endfunction

★2★全局变量

+ Shingo Jass Highlighter 0.41

globals

unit array aihero //设置英雄单位

integer hero_num=0 //用于计算英雄数量

group udg_g=CreateGroup() //用于记录AI玩家所有单位

boolean flee=false //设置是否逃跑

boolean finishMF=false //设置是否MF

boolean attack_enemy=false //设置是否攻击敌人

boolean ally=false //设置是否攻击盟友

real ratio=1 //radio是用于判断生命比的整数

integer count=0 //记录游戏开始秒数

location start_loc //玩家开始的地方

endglobals

★3★功能程序

+ Shingo Jass Highlighter 0.41

function setup_force takes nothing returns nothing //AI玩家开始寻找生命大于15%可以攻击的英雄进入攻击组

local unit u=null

local integer i=1

call RemoveInjuries()

call InitAssault() //初始化攻击队伍

if (GetPlayerState(ai_player,PLAYER_STATE_RESOURCE_FOOD_CAP)-80)!=hero_num then

call GroupEnumUnitsOfPlayer(udg_g,ai_player,null) //选取AI玩家的所有单位

loop

exitwhen i>hero_num

call GroupRemoveUnit(udg_g,aihero<i>)

set i=i+1

endloop

loop

set u=FirstOfGroup(udg_g)

exitwhen u==null

if IsUnitType(u,UNIT_TYPE_HERO)==true then

set hero_num=hero_num+1

set aihero[hero_num]=u //设置aihero[1~n]=u

endif

call GroupRemoveUnit(udg_g,u) //移除单位u

endloop

call GroupClear(udg_g) //清楚单位组

endif

set i=1

loop

exitwhen i>hero_num

if GetUnitState(aihero<i>,UNIT_STATE_LIFE)/GetUnitState(aihero<i>,UNIT_STATE_MAX_LIFE)>0.15 then //选取英雄生命百分比大于15%的(radio是用于判断生命比的整数)

call AddAssault(1,GetUnitTypeId(aihero<i>)) //英雄加入攻击组

endif

set i=i+1

endloop

endfunction

function start_attack takes unit target returns nothing //开始攻击

local integer index=0

loop

exitwhen CaptainRetreating() and flee //(如果队长逃跑 and 逃跑 是真的)就退出

exitwhen ratio==0

exitwhen not UnitAlive(target) //(如果target不是存活的)就退出

exitwhen UnitInvis(target) and not IsUnitDetected(target,ai_player) //(如果单位隐形 and 单位侦查)就退出

call AttackMoveKill(target) // 攻 击 移 动 直 到 杀 死 target

call Sleep(3) //停止3秒

if index>=5 then

set index=0

call setup_force() //命令AI玩家开始寻找生命大于15%可以攻击的英雄进入攻击组

endif

set index=index+1

endloop //实际上此loop的功能是每3秒选取英雄去攻击,逃跑的话就停止

set index=0

loop

exitwhen not CaptainInCombat(true) //当队长不在战斗时就退出

call Sleep(2) //停止3秒

if index>=8 then

set index=0

call setup_force() //命令AI玩家开始寻找生命大于15%可以攻击的英雄进入攻击组

endif

set index=index+1

endloop //实际上此loop的功能是每2秒队长在战斗时选取英雄进入攻击组

endfunction

function attack_sequence takes nothing returns nothing //战斗顺序(此函数实际是寻找敌人,先寻找敌人的分基地,没有就主基地,找不到就去MF)

local unit target=null

local unit u=null

if ally then //如果ally是真的 ,就做下面动作

set target=GetAllianceTarget() //设置target是同盟的主基地

if target!=null then //如果同盟的主基地存在 ,就做下面动作

set attack_enemy=true //设置攻击敌人开始

call setup_force() //命令AI玩家开始寻找生命大于15%可以攻击的英雄进入攻击组

call start_attack(target) //调用开始攻击target的函数

call SetAllianceTarget(null) //

set attack_enemy=false //设置攻击敌人关闭

return //跳过下列动作

endif

endif

if count>100 and GetRandomInt(0,200+count)>300 then //如果count大于100 and 随机整数0或200+count大于300 就做下列动作

set u=CreateUnitAtLoc(ai_player,'h000',start_loc,270) //设置u是新建的单位在开始点

set target=GetEnemyExpansion() //设置target是敌人的分基地

if target!=null then //*如果target存在就做下面动作

call KillUnit(u) //杀死u

call SetAllianceTarget(target) //

call setup_force() //命令AI玩家开始寻找生命大于15%可以攻击的英雄进入攻击组

call start_attack(target) //调用开始攻击target的函数

return //跳过下列动作

else //*如果target不存在就做下面动作

call StartGetEnemyBase() //开始寻找敌人基地

loop

exitwhen not WaitGetEnemyBase() //当不寻找敌人的时候就退出循环

call Sleep(1)

endloop //实际上是每一秒都判断是否寻找的英雄

set target=GetEnemyBase() //设置target时敌人的主基地

call KillUnit(u) //杀死u

endif

set u=null

if target != null then //如果target不等于没有,就做下列动作

set attack_enemy=true //设置攻击敌人开始

call SetAllianceTarget(target) //

call setup_force() //命令AI玩家开始寻找生命大于15%可以攻击的英雄进入攻击组

call start_attack(target) //调用开始攻击target的函数

set attack_enemy=false //设置攻击敌人关闭

return //跳过下列动作

endif

endif

set target=GetCreepCamp(0,R2I(5*hero_num*ratio),false) //设置target是中立敌对单位的营地(中立单位最小的等级为 0,最大为5*英雄总数量*ratio,没有飞行单位)

if target!=null then //如果target存在,就做下列动作

call SetAllianceTarget(target) //

call setup_force() //命令AI玩家开始寻找生命大于15%可以攻击的英雄进入攻击组

call start_attack(target) //调用开始攻击target的函数

set finishMF=true //设置正在MF 为 真(MF是指打中立怪升级)

return //跳过下列动作

endif

if GetRandomInt(1,2)==1 then //随机整数1或2等于1就做下列动作

set target=GetCreepCamp(0,R2I(8*hero_num*ratio),false) //设置target是中立敌对单位的营地

if target!=null then //如果target存在,就做下列动作

call SetAllianceTarget(target) //

call setup_force() //命令AI玩家开始寻找生命大于15%可以攻击的英雄进入攻击组

call start_attack(target) //调用开始攻击target的函数

set finishMF=true //设置正在MF 为 真(MF是指打中立怪升级)

endif

endif

call Sleep(10) //停止10秒

endfunction

function attack_loop takes nothing returns nothing

local integer index=0

call SetCaptainHome(0,GetLocationX(start_loc),GetLocationY(start_loc)) //设置组在家的点<组,x坐标,y坐标>

call SetCaptainHome(1,GetLocationX(start_loc),GetLocationY(start_loc)) //设置组在家的点<组,x坐标,y坐标>, 组的参数: ATTACK_CAPTAIN = 1; 攻击组 DEFENSE_CAPTAIN = 2; 防御组 BOTH_CAPTAINS = 3 攻击和防御组;

loop

call Sleep(3) //停止3秒(实际上是进入循环每3秒做下列动作一次)

exitwhen GetPlayerState(ai_player,PLAYER_STATE_RESOURCE_FOOD_CAP)>80 //当AI玩家食物多于80就退出循环

endloop

call Sleep(2) //停止2秒

call setup_force() //命令AI玩家开始寻找生命大于15%可以攻击的英雄进入攻击组

loop

set index=1

loop

call Sleep(1) //停止1秒

exitwhen finishMF and not flee //当正在MF的时候 and 不逃跑为真的时候 退出 循环

call Sleep(1) //停止1秒

exitwhen not CaptainRetreating() and ratio>0 //当队长不逃跑的时候 and ratio大于0的时候退出循环

exitwhen index>=10

set index=index+1

endloop

if finishMF then //如果正在MF,就做下列动作

set finishMF=false //设置不MF

endif

if flee then //如果正在逃跑,就做下列动作

call Sleep(25-ratio*20) //停止25-ratio*20秒 (radio是用于判断生命比的整数)

endif

call attack_sequence() //调用攻击函数

endloop

endfunction

function check_hp takes nothing returns nothing //检测Hp

local integer i=0

local real x=0

local real y=0

local real z=0

local real r1=0

local real r2=0

local unit u=null

loop

call Sleep(3) //停止3秒(实际上是进入循环每3秒做下列动作一次)

set u=GetCreepCamp(0,0,false) //设置u是中立敌对的目标

set i=1

set x=0

set y=0

set z=0

loop

exitwhen i>hero_num //当i大于总英雄人数是就退出循环

set r1=GetUnitState(aihero<i>,UNIT_STATE_LIFE) //设置r1是英雄i号的现在生命值 (i=1,2.3,......)

set r2=GetUnitState(aihero<i>,UNIT_STATE_MAX_LIFE) //设置r2是英雄i号的最大生命值 (i=1,2.3,......)

set x=x+r1 //设置x等于x+r1,即循环后所有英雄总的生命值

set y=y+r2 //设置y等于x+r2,即循环后所有英雄总的最大生命值

if r1>0 then //如果英雄的生命值大于0,就做下列动作

set z=z+r2 //设置z等于z+r2,即循环后所有活着的英雄总的最大生命值

endif

set i=i+1

endloop

if z>0 then //如果Z大于0做下列动作

set ratio=x/y //设置ratio等于x/y,即所有英雄现在生命值和最大生命值的比

if x/z<0.5 then //如果所有英雄现在生命值和最大生命值的比 小于 0.5,就做下列动作

call SetGroupsFlee(true) //设置队伍可以逃跑

set flee=true //设置队伍可以逃跑

else

call SetGroupsFlee(false) //如果不是的话,就 设置队伍不能逃跑

set flee=false //设置队伍现在不逃跑

endif

else //如果Z小于0做下列动作

set ratio=0 //设置radio为0

call SetGroupsFlee(true) //设置队伍可以逃跑

set flee=true //设置队伍现在正在逃跑

endif //实际上每三秒就判断生命值

if attack_enemy then

call SetGroupsFlee(true) //如果攻击敌人的话

set flee=true //设置队伍可以逃跑

endif

if count<200 then

set count=count+1

endif //实际上每三秒就设置count+1

endloop

endfunction

收藏 分享 11 0 鱼妹 莫鱼