发新话题
打印

[AI] 挖出个还不错的东东

挖出个还不错的东东

自己写的函数
作用是选择出单位组中最具价值攻击目标[jass]function AISelect takes group G returns unit
    local integer GN = CountUnitsInGroup(G)
    local integer i = 1
    local group GG = CreateGroup()
    local group GGG = CreateGroup()
    local unit u
    if(GN == 0) then                       //单位组为0
        call DestroyGroup(GG)
        call DestroyGroup(GGG)
        set u = null
        set GG = null
        set GGG = null
        return null
    endif
    if(GN == 1) then                       //单位组为1
        set udg_Unit_FunctionHelper = FirstOfGroup(G)
        call DestroyGroup(GG)
        call DestroyGroup(GGG)
        set u = null
        set GG = null
        set GGG = null
        return udg_Unit_FunctionHelper
    endif
    call GroupAddGroup(GGG,G)
    loop                                      //第一选择 血量
        exitwhen i > GN
        set u = FirstOfGroup(GGG)
        if(GetUnitState(u,ConvertUnitState(0)) < LoadReal(G,"Damage")) then
            call GroupAddUnit(GG,u)
        endif
        call GroupRemoveUnit(GGG,u)
        set i = i + 1
    endloop
    set GN = CountUnitsInGroup(GG)
    if(GN == 0) then                         //没有过低血量单位
        call GroupClear(GGG)
        call GroupClear(GG)
        call GroupAddGroup(GGG,G)
        set GN = CountUnitsInGroup(GGG)
        loop                                  //第二选择 英雄
            exitwhen i > GN
            set u = FirstOfGroup(GGG)
            if IsUnitType(u,ConvertUnitType(0)) then
                call GroupAddUnit(GG,u)
            endif
            call GroupRemoveUnit(GGG,u)
            set i = i + 1
        endloop
        set GN = CountUnitsInGroup(GG)
        if(GN == 0) then                             //没有英雄单位
            set udg_Unit_FunctionHelper = FirstOfGroup(G)
            call DestroyGroup(GG)
            call DestroyGroup(GGG)
            set u = null
            set GG = null
            set GGG = null
            return udg_Unit_FunctionHelper
        endif
        if(GN >= 1) then                             //有英雄单位
            set udg_Unit_FunctionHelper = FirstOfGroup(GG)
            call DestroyGroup(GG)
            call DestroyGroup(GGG)
            set u = null
            set GG = null
            set GGG = null
            return udg_Unit_FunctionHelper
        endif
    endif
    if(GN == 1) then
        set udg_Unit_FunctionHelper = FirstOfGroup(GG)    //单一血量过低单位
        call DestroyGroup(GG)
        call DestroyGroup(GGG)
        set u = null
        set GG = null
        set GGG = null
        return udg_Unit_FunctionHelper
    endif
    if(GN > 1) then                                      //更多血量过低单位
        set udg_Unit_FunctionHelper = FirstOfGroup(GG)
        call GroupClear(GGG)
        call GroupAddGroup(GGG,GG)
        call GroupClear(GG)
        set GN = CountUnitsInGroup(GGG)
        loop                                  //第二选择 英雄
            exitwhen i > GN
            set u = FirstOfGroup(GGG)
            if IsUnitType(u,ConvertUnitType(0)) then
                call GroupAddUnit(GG,u)
            endif
            call GroupRemoveUnit(GGG,u)
            set i = i + 1
        endloop
        set GN = CountUnitsInGroup(GG)
        if(GN == 0) then                     //没有英雄单位
            call DestroyGroup(GG)
            call DestroyGroup(GGG)
            set u = null
            set GG = null
            set GGG = null
            return udg_Unit_FunctionHelper
        endif
        if(GN >= 1) then                         //存在英雄单位
            set udg_Unit_FunctionHelper = FirstOfGroup(GG)
            call DestroyGroup(GG)
            call DestroyGroup(GGG)
            set u = null
            set GG = null
            set GGG = null
            return udg_Unit_FunctionHelper
        endif
    endif
    call DestroyGroup(GG)
    call DestroyGroup(GGG)
    set u = null
    set GG = null
    set GGG = null
    return FirstOfGroup(G)
endfunction[/jass]

[ 本帖最后由 C_Kuhn 于 2008-10-7 19:49 编辑 ]
本帖最近评分记录
  • thody 威望 -1 精品文章 2008-10-13 14:41
  • aeris 金钱 +1 "斑竹请扣威望和分 表加我分" 2008-10-8 19:00

TOP

说明一下LoadReal(G,"Damage") 当单位低于这个值得时候将被预选
这个值可以自行修改
udg_Unit_FunctionHelper是为了防泄才用的全局
本帖最近评分记录
  • thody 威望 -1 精品文章 2008-10-13 14:41

TOP

斑竹请扣威望和分 表加我分
本帖最近评分记录
  • thody 威望 -1 精品文章 2008-10-13 14:42

TOP

很好,很强大.
就是看不懂.
纪念那已被遗忘的世界和那不曾拥有却确实失去的世界

TOP

难道lz被ga带坏了,要负的了。。。。。。。
sure,this means nothing.

TOP

很有意义的函数 不过重复代码似乎比较多 建议提取重复代码为函数

TOP

不给负分么
本帖最近评分记录
  • thody 威望 -1 精品文章 2008-10-13 14:42

TOP

成全你了。
sure,this means nothing.

TOP

发新话题