找回密码
 点一下
查看: 2218|回复: 14

[已解决]帮我看看这函数能否工作

[复制链接]
发表于 2008-10-18 14:35:15 | 显示全部楼层 |阅读模式
我写了一个判断单位组里面的单位是否死光了的函数,但是调用之后发现它并不能按我的思路去工作,实事上是他不工作,但是我不知道问题出在何处,请各位指教。
[codes=jass]
function IsGroupDead takes group gp returns boolean
     local unit             u = null
     local integer       i = 0
     local boolean      t = false
            loop
                   exitwhen t == true
                   set        u =    GroupPickRandomUnit(gp)
                            if  GetUnitState(u)<=0 then
                                  call GroupRemoveUnit(u)
                                  set   u= null
                                  set   i= i + 1
                                       if  i>6   then
                                              set  t = true
                                               call DestroyGroup (gp)
                                          else
                                                    set t = false
                                        endif
                                  else
                                              set t = false
                                endif
                   endloop
           return t
endfunction
[/codes]
这个函数如果按我的思路去工作的话,就应该是这样的:随机选取单位组中的一个单位,判断它是否挂了,如果挂了那么让计数器i自加1 如果没挂那么设置t为false;当i自加到6(假设单位组里面只有6个单位)时说明里面的单位全部都挂了,这个时候注销单位组,并让t为true 结束循环,并返回t值
但是当我调用的时候发现它并不工作,我找不到原因,请各位指点一下。

另外:我还想知道其他的一些关于单位组的操作,如:单位组中的单位个数(因为有时候达到某种条件的时候会往单位组里面加单,造成了单位组内单位数量上的动态);给单位组发布命令(我发布了一个攻击命令,那些单位刚走出一段距离 又按原路返回了)等等(还有一些,一时间忘了)。。。。。。     
发表于 2008-10-18 15:10:08 | 显示全部楼层
这个函数有个问题,当单位组有存活的单位的时候,是不会跳出循环的
回复

使用道具 举报

发表于 2008-10-18 15:18:54 | 显示全部楼层
function IsGroupDead takes group gp returns boolean
&#160; &#160; &#160; &#160;  local unit&#160; u
&#160; &#160; &#160; &#160; local boolean&#160; t
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; loop
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;  set&#160;  u =TheFirstOfGroup(gp)
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;  if u==null&#160; then
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;  set t=true
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;  exitwhen true
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;  elseif GetUnitState(u)>0 then
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; set t=false
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; exitwhen true
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; else
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; call GroupRemoveUnit(u)
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; endif
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;  endloop
&#160; &#160; &#160; &#160; &#160; &#160; &#160; call DestroyGroup (gp)
&#160; &#160; &#160; &#160; &#160; &#160; &#160; set gp=null
return t
endfuncion



好久没动过这东西了,乱写的,不知对不对,你试下...
回复

使用道具 举报

 楼主| 发表于 2008-10-18 15:36:40 | 显示全部楼层
引用第1楼libla于2008-10-18 15:10发表的  :
这个函数有个问题,当单位组有存活的单位的时候,是不会跳出循环的

我就是不希望里面有活的单位的时候跳出循环,因为我要的是在确认里面的单位全部挂了之后再结束循环。
只里我不知道问题所在。
回复

使用道具 举报

 楼主| 发表于 2008-10-18 15:38:08 | 显示全部楼层
引用第2楼OrS于2008-10-18 15:18发表的  :
function IsGroupDead takes group gp returns boolean
         local unit  u
        local boolean  t
                  loop
                             set   u =TheFirstOfGroup(gp)
.......

多谢。
你这样一改的确比我的好点。

一比较发现了自己的问题,晚上回家按你的去试试。
回复

使用道具 举报

发表于 2008-10-18 15:39:24 | 显示全部楼层
引用第3楼alexloco于2008-10-18 15:36发表的&#160; :


我就是不希望里面有活的单位的时候跳出循环,因为我要的是在确认里面的单位全部挂了之后再结束循环。
只里我不知道问题所在。
死循环是会当机的,你还是另想办法吧...



PS...我的是"里面有活的单位的时候跳出循环"...不符合你的要求了呢...
回复

使用道具 举报

 楼主| 发表于 2008-10-18 16:01:59 | 显示全部楼层
引用第5楼OrS于2008-10-18 15:39发表的  :

死循环是会当机的,你还是另想办法吧...



.......

不,我的在用的时候并未出现当机情况,那就是说我的不是死循环,只是我的里面出现了一些问题而我不知道问题在何处。

看了一下你是以目标是否是活的作为判断基础,而我则是以目标生命值是否小于等于0为判断基础,只是同一件事情的两个相反面。只是有时候用同一面的时候出现了问题,而用另一面却能决问题。

总之还是要感谢你的指导。
回复

使用道具 举报

 楼主| 发表于 2008-10-18 16:13:04 | 显示全部楼层
作一下比较:
[codes=jass]

function IsGroupDead takes group gp returns boolean
         local unit                    u = null
        local integer           i = 0
        local boolean         t = false
                  loop
                             exitwhen t == true
                             set            u =      GroupPickRandomUnit(gp)//在组中随机选一个单位
                                          if   GetUnitState(u)<=0 then//它是死的
                                                   call GroupRemoveUnit(u)//移除出组
                                                   set     u= null//变量清空
                                                   set     i= i + 1//计数器加1,表示死亡数目加1
                                                           if   i>6     then
                                                                     set   t = true//如果死亡数到了组中单位最大数量,说明组中的单位已经死光了,那么跳出循环,注销组
                                                                       call DestroyGroup (gp)
                                                               else
                                                                              set t = false//否则不跳出
                                                            endif
                                                   else
                                                                     set t = false//如果目标是活的,也不跳出
                                                endif
                             endloop
                 return t
endfunction
[/codes]

以上是我的
以下是你的,我就着重对你的进行一下分析,然后再与我的进行比较吧:
[codes=jass]
function IsGroupDead takes group gp returns boolean
         local unit  u
        local boolean  t
                  loop
                             set   u =TheFirstOfGroup(gp) //组中的第一个单位
                                       if u==null  then//该单位不存在
                                         set t=true//跳出循环
                                         exitwhen true
                                       elseif GetUnitState(u)>0 then//该单位是活的
                                              set t=false//不跳出
                                              exitwhen true
                                          else
                                          call GroupRemoveUnit(u)//不是空的也不是活的那就是死的了,移除出组
                                          endif
                     endloop
              call DestroyGroup (gp)//注销组
              set gp=null
return t
endfuncion
[/codes]

这样一比较,我发现我的的确比你的有欠缺,你先进行判断是否为空组,然后再进行单位的死活判断,如果是死的,移除之,如果是活的并没有跳出,这个同我的是一样的,但是你的更简洁。
看来,你的也并非是当目标是活的时候跳出循环。
难道我没有理解你的意思吗?
指教一下。
回复

使用道具 举报

发表于 2008-10-18 16:59:21 | 显示全部楼层
按照你的代码,要么是返回true的,要么就是循环过多导致直接强制终止循环,不返回任何东西………………

lz看下这样呢
[codes=jass]function IsGroupDead takes group gp returns boolean
    local unit u
    local boolean t = true
    loop
        set u = GroupPickRandomUnit(gp)
        exitwhen u == null
        if GetUnitState(u, UNIT_STATE_LIFE) > 0 then
            set t = false
        endif
        call GroupRemoveUnit(gp, u)
    endloop
    call DestroyGroup (gp)
    return t
endfunction[/codes]
回复

使用道具 举报

发表于 2008-10-19 00:03:04 | 显示全部楼层
不是有个 IsUnitGroupDeadBJ  么
回复

使用道具 举报

发表于 2008-10-19 13:34:40 | 显示全部楼层
楼上Good job~~本来我还想让他们发挥一下再贴的~~
回复

使用道具 举报

发表于 2008-10-19 13:37:00 | 显示全部楼层
那个函数看到这个问题就想到了的,不过不喜欢bj的那种写法额………………
回复

使用道具 举报

发表于 2008-10-19 13:49:18 | 显示全部楼层
1, 如果某单位生命大于零,直接跳出循环;
2, 无论单位死亡与否,都要从单位组中踢掉。
回复

使用道具 举报

 楼主| 发表于 2008-10-20 13:01:20 | 显示全部楼层
引用第11楼zhuzeitou于2008-10-19 13:37发表的  :
那个函数看到这个问题就想到了的,不过不喜欢bj的那种写法额………………

我也是由于这个因素才不用BJ,而自已再写一个。
回复

使用道具 举报

 楼主| 发表于 2008-10-20 13:11:17 | 显示全部楼层
我明白了,返回boolean类型的函数返回值只能要么是真要么是假。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 08:50 , Processed in 0.054212 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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