找回密码
 点一下
查看: 3937|回复: 23

为什么会暴卡?

[复制链接]
发表于 2007-11-24 21:33:28 | 显示全部楼层 |阅读模式
[codes=jass]
function UseSkill_Con1 takes nothing returns boolean
    local boolean a = IsUnitAliveBJ(GetFilterUnit())
    local boolean b = IsUnitEnemy(GetFilterUnit(), Player(8))
    return  GetBooleanAnd(a,b)
endfunction

function UseSkill_Con2 takes nothing returns boolean
    local boolean a = IsUnitAliveBJ(GetFilterUnit())
    local boolean b = IsUnitAlly(GetFilterUnit(), Player(8))
    return  GetBooleanAnd(a,b)
endfunction

function UseSkill_Do1 takes nothing returns nothing
    local unit u = I2U(GetStoredInteger(udg_GC,I2S(H2I(GetLastCreatedGroup())), "Unit"))
    if GetUnitStateSwap(UNIT_STATE_LIFE, u) >= GetUnitStateSwap(UNIT_STATE_LIFE, GetEnumUnit()) then
        set u = GetEnumUnit()
    endif
    call StoreInteger(udg_GC,I2S(H2I(GetTriggeringTrigger())),"Unit",H2I(u))
endfunction

function UseSkill_Do2 takes nothing returns nothing
    local integer n = GetStoredInteger(udg_GC,I2S(H2I(GetLastCreatedGroup())),  "NumEnemy")
    set n = n+1
    call StoreInteger(udg_GC,I2S(H2I(GetLastCreatedGroup())), "NumEnemy",n)
endfunction

function UseSkill takes unit u,integer skill returns nothing
    local integer i = GetStoredInteger(udg_GC,I2S(skill),"OrderTarget")
    local string s = GetStoredString(udg_GC,I2S(skill),"OrderString")
    local timer timer1 = CreateTimer()
    local group g = CreateGroup()
    local unit ut
    local integer n = 0
    local integer x = 1
    local real a = 0
    local location p
    local location sp
   
    if i == 0 then
        call IssueImmediateOrder( u, s )
    endif
    if i == 1 then
        call StoreInteger(udg_GC,I2S(H2I(g)), "Unit",H2I(gg_unit_h000_0004))
        set g = GetUnitsInRangeOfLocMatching(500,GetUnitLoc(u),Condition(function UseSkill_Con1))
        call ForGroup(g,function UseSkill_Do1)
        set ut = I2U(GetStoredInteger(udg_GC,I2S(H2I(g)), "Unit"))
        call IssueTargetOrder( u, s, ut )
        call DestroyGroup(g)
    endif
    if i == 2 then
        call StoreInteger(udg_GC,I2S(H2I(g)), "Unit",H2I(gg_unit_h000_0004))
        set g = GetUnitsInRangeOfLocMatching(500,GetUnitLoc(u),Condition(function UseSkill_Con2))
        call ForGroup(g,function UseSkill_Do1)
        set ut = I2U(GetStoredInteger(udg_GC,I2S(H2I(g)), "Unit"))
        call IssueTargetOrder( u, s, ut )
        call DestroyGroup(g)
    endif
    if i == 3 then
        
        loop
            exitwhen  x > 5
            
            loop
                exitwhen a > 360
                call StoreInteger(udg_GC,I2S(H2I(g)), "NumEnemy",0)
                set p = PolarProjectionBJ(GetUnitLoc(u), ( 100*x ), a)
                set g = GetUnitsInRangeOfLocMatching(300,GetUnitLoc(u),Condition(function UseSkill_Con1))
                call ForGroup(g,function UseSkill_Do2)
               
                if n<=GetStoredInteger(udg_GC,I2S(H2I(g)),  "NumEnemy") then
                    set n = GetStoredInteger(udg_GC,I2S(H2I(g)),  "NumEnemy")
                    set sp = p
                endif
                set a = a + 1
            endloop
            set x = x+1
        endloop
        call IssuePointOrderLoc( u, s, sp )
        call DestroyGroup(g)
    endif
   
    //return
endfunction
[/codes]

我自己做的,模拟雷达扫描怪,但出怪后卡的要命
0:无目标
1:敌人
2:自己人
3:点

为什么啊??

jass怎么不能高亮了呢?
发表于 2007-11-24 22:07:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-11-25 11:00:49 | 显示全部楼层
说错了,是接近怪的时候,是不是loop的太多了??
我设的是没0.01秒扫一次。。。。。。。。。
回复

使用道具 举报

发表于 2007-11-26 19:31:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-11-26 20:43:23 | 显示全部楼层
我已经删除了g,难道还要再set g = null 么?

点也可以用destroy啊

那我再试试看
回复

使用道具 举报

发表于 2007-11-26 20:54:24 | 显示全部楼层
机器不好
完毕~
回复

使用道具 举报

发表于 2007-11-26 21:10:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-11-26 21:16:22 | 显示全部楼层
恩。。。比如我习惯就很好
什么东西都set null
回复

使用道具 举报

 楼主| 发表于 2007-11-26 22:08:56 | 显示全部楼层
我的机器是个本本,但切出来的时候cpu才占了50%,内存也就用了700多M
个人感觉不多啊,时间改短了其他的动作估计就不连贯了

现在正在考虑有没有一种算法能找出离最多单位距离相等且最短的点
回复

使用道具 举报

发表于 2007-11-27 11:57:03 | 显示全部楼层
循环太多...
没有set x = null
回复

使用道具 举报

 楼主| 发表于 2007-11-27 13:21:08 | 显示全部楼层
改进了下,但还是卡,估计这次是内存泄露啦
[codes=jass]
//========返回一个数组里最弱的单位(enemy=true:敌人;enemy=false:自己人)======
function GetWeakestUnit takes unit center,real range,boolean enemy returns unit
    local unit temp
    local unit weakest
    local group g=CreateGroup()
    call  GroupEnumUnitsInRange(g,GetUnitX(center),GetUnitY(center),range,null)
    call  GroupRemoveUnit(g,center)
    set weakest = FirstOfGroup(g)
    call GroupRemoveUnit(g,weakest)
    loop
        set  temp=FirstOfGroup(g)
        exitwhen temp == null
        if (enemy and (IsUnitEnemy(temp,GetOwningPlayer(center)) and GetUnitState(temp,UNIT_STATE_LIFE)>0)) then
            if GetUnitState(weakest,UNIT_STATE_LIFE)>GetUnitState(temp,UNIT_STATE_LIFE) then
                set weakest = temp
            endif
        endif
        call GroupRemoveUnit(g,temp)
    endloop
    call DestroyGroup(g)
    set temp = null
    set g = null
    call DisplayTextToPlayer( Player(0), 0, 0,"找到最弱")
    return weakest
endfunction

//==========返回单位组单位个数(enemy=true:敌人;enemy=false:自己人)========

function GetUnitNum takes unit center,real range,boolean enemy returns integer
    local unit temp
    local integer n = 0
    local group g=CreateGroup()
    call  GroupEnumUnitsInRange(g,GetUnitX(center),GetUnitY(center),range,null)
    call  GroupRemoveUnit(g,center)
    loop
        set  temp=FirstOfGroup(g)
        exitwhen temp == null
        if enemy and IsUnitEnemy(temp,GetOwningPlayer(center)) and GetUnitState(temp,UNIT_STATE_LIFE)>0 then
            set n = n+1
        endif
        call GroupRemoveUnit(g,temp)
    endloop
    call DestroyGroup(g)
    set temp = null
    set g = null
     call DisplayTextToPlayer( Player(0), 0, 0,I2S(n))
    return n
endfunction

//===返回范围内离所有单位最近的点(enemy=true:敌人;enemy=false:自己人)======

function GetSpellPiont takes unit center,real range,boolean enemy returns location
    local unit temp
    local real x = 0
    local real y = 0
    local location p
    local integer n=0
    local group g=CreateGroup()
    call  GroupEnumUnitsInRange(g,GetUnitX(center),GetUnitY(center),range,null)
    call  GroupRemoveUnit(g,center)
    loop
        set temp=FirstOfGroup(g)
        if temp==null then
            call DestroyGroup(g)
            set g = null
            return null
        endif
        call  GroupRemoveUnit(g,temp)
        exitwhen enemy and IsUnitEnemy(temp,GetOwningPlayer(center)) and GetUnitState(temp,UNIT_STATE_LIFE)>0
    endloop
    loop
        set  temp=FirstOfGroup(g)
        if enemy and IsUnitEnemy(temp,GetOwningPlayer(center)) and GetUnitState(temp,UNIT_STATE_LIFE)>0 then
            set x =x+DistanceBetweenPoints(GetUnitLoc(center),GetUnitLoc(temp))
            set y= y+AngleBetweenPoints(GetUnitLoc(center), GetUnitLoc(temp))
        endif
        call  GroupRemoveUnit(g,temp)
        exitwhen temp==null
    endloop
    set n = GetUnitNum(center,range,enemy)
    set x = x/n
    set y = y/n
    set p = PolarProjectionBJ(GetUnitLoc(center), x, y)
    call DestroyGroup(g)
    set temp = null
    set g = null
    set n=0
    set x=0
    set y=0
    call DisplayTextToPlayer( Player(0), 0, 0,"点ok")
    return p
endfunction
//======================智能施放技能================================

function UseSkill takes unit u,integer skill returns nothing
    local integer i = GetStoredInteger(udg_GC,I2S(skill),"OrderTarget")
    local string s = GetStoredString(udg_GC,I2S(skill),"OrderString")
    local unit ut
    local integer n = 0
    local integer x = 1
    local real a = 0
    local location p
    local location sp
    if i == 0 then
        call IssueImmediateOrder( u, s )
    endif
    if i == 1 then
        set ut = GetWeakestUnit(u,500,true)
        call IssueTargetOrder( u, s, ut )
    endif
    if i == 2 then
        set ut = GetWeakestUnit(u,500,false)
        call IssueTargetOrder( u, s, ut )
        call IssuePointOrderLoc(u,s,GetUnitLoc(ut))
    endif
    if i == 3 then
        set sp = GetSpellPiont(u,500,true)
        call IssuePointOrderLoc( u, s, sp )
    endif
    set i = 0
    set s = null
    set u = null
    set n = 0
    set x = 0
    set a = 0
    set p = null
    set sp = null
endfunction
[/codes]
不知道哪里还应该清除……
回复

使用道具 举报

发表于 2007-11-27 15:59:15 | 显示全部楼层
call StoreInteger(udg_GC,I2S(H2I(g)), "Unit",H2I(gg_unit_h000_0004))<----这个有必要用缓存嘛。。。

提示:StoreInteger的操作复杂度是GetStoredIntegr的100倍以上

这东西用多了就会卡。
回复

使用道具 举报

 楼主| 发表于 2007-11-28 09:08:55 | 显示全部楼层
我改进了后基本上就没用了啊,但还是卡啊。。。。
回复

使用道具 举报

发表于 2007-11-28 09:14:05 | 显示全部楼层
你别用StoreXXX,用全局变量看看
回复

使用道具 举报

 楼主| 发表于 2007-11-28 09:35:36 | 显示全部楼层
这个。。。。

我重新写的程序里面很少用到stoe了,就
  call StoreInteger(udg_GC,I2S(H2I(tm)),"unit",H2I(u))
    call StoreInteger(udg_GC,I2S(H2I(u)),"Timer",H2I(tm))

这两个,但这俩不好用全局变量啊。
是不是
    local timer tm = GetExpiredTimer()
之后还要把 tm这个计时器给删了呀?
回复

使用道具 举报

发表于 2007-11-28 09:36:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-11-28 09:38:49 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-11-28 10:10:14 | 显示全部楼层
不是说war3有个loop循环次数限制的么,不过做的ai太笨了,技能到是用的蛮快,就是不会帮忙,看来还要改才行。。。。。


恩,tm在最后我set null了,自从你说要set null 后,我把能清空的都清了。。。整数实数我也都没放过。

还得请教下:

单位当前的命令字符串除了是move、attack和技能字符串外怎么返回不了stop之类的啊?
回复

使用道具 举报

发表于 2007-11-28 10:28:38 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-11-28 11:23:46 | 显示全部楼层
那hold好像也不行哦,没办法了,只好将就了
AI还真麻烦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-22 20:06 , Processed in 0.256914 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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