推荐地图:火影无级别混战推荐地图:楚汉争霸推荐地图:魔神推荐地图:人族无敌II
推荐专区:技能创作区推荐专区:WE讨论区推荐专区:模型作区推荐专区:申请公告区
 23 12
发新话题
打印

[计论] 把C语言的迷宫问题转为JASS代码

本主题由 System 于 2008-8-29 05:00 解除限时高亮

[计论] 把C语言的迷宫问题转为JASS代码

以下是C语言源码:
COPY JASSCODE
JASS:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAZE_MAXWIDTH    50
#define MAZE_MAXHIGHT    25

char map[MAZE_MAXWIDTH+2][MAZE_MAXHIGHT+2];

void search(int x,int y)
{
    static int zadd[4][2]={0,1,1,0,0,-1,-1,0};
    int zx=x*2,zy=y*2,next,turn,i;
    map[zx][zy]=1;  //当前坐标置1
    turn=rand()%21:3//turn=1为顺时针3为逆时针
    for(i=0,next=rand()%4;i<4;i++,next=(next+turn)%4)
    {
        if(map[zx+2*zadd[next][0]][zy+2*zadd[next][1]]==0)
        {
            map[zx+zadd[next][0]][zy+zadd[next][1]]=1//中间的路径置1
            search(x+zadd[next][0],y+zadd[next][1]);  //深搜下一个节点
        }
    }
}

void Make_Maze(int x,int y)
{
    int z1,z2;
    for(z1=0,z2=2*y+2;z1<=2*x+2;z1++)
        map[z1][0]=1,map[z1][z2]=1;
    for(z1=0,z2=2*x+2;z1<=2*y+2;z1++)
        map[0][z1]=1,map[z2][z1]=1;  
    map[1][2]=1;  //置入口出口为1
    map[2*x+1][2*y]=1;
    srand((unsigned)time(NULL));
    search(rand()%x+1,rand()%y+1);  //从任意节点开始深搜
}

int main()
{
    int x=(MAZE_MAXWIDTH-2)/2,y=(MAZE_MAXHIGHT-2)/2,z1,z2;//maze size: 1<=x<=39 ; 1<=y< MAZE_MAXHIGHT/2
    Make_Maze(x,y);
    for(z2=1;z2<=y*2+1;z2++){    //迷宫图形输出
        for(z1=1;z1<=x*2+1;z1++)
            if(map[z1][z2]==0)putchar('|');else putchar(32);
        if(z2<=y*2)putchar(10);
    }
    getchar();
    return 0;
}

Shingo Jass Highlighter 0.4



这个是运行结果。。。。。。。。。BY THODYLK


偶研究了半天没搞懂原理 只好照搬成JASS代码了 不过貌似不能运行呃

以下是转换后的JASS代码:
变量说明:
udg_gc, udg_temp 是游戏缓存变量
udg_MAZE_MAXWIDTH 设置迷宫宽度。整数
udg_MAZE_MAXHIGHT  设置迷宫高度。整数

COPY JASSCODE
JASS:

function ModInt takes integer a, integer b returns integer
    return a - (a/b) * b
endfunction

function Search_Maze takes integer x, integer y returns nothing
    local integer zadd_a
    local integer zadd_b
    local integer zx = x*2
    local integer zy = y*2
    local integer turn
    local integer next
    local integer i
    if ( ModInt(GetRandomInt(1,100),2) == 1 ) then
        set turn = 1
    elseif ( ModInt(GetRandomInt(1,100),2) == 0 ) then
        set turn = 3
    endif
    set next = ModInt(GetRandomInt(1,100),4)
    loop
        exitwhen i > 4
        set i = i + 1
        set next = ModInt((next + turn),4)
        set zadd_a = GetStoredInteger( udg_temp, I2S(next)"0" )
        set zadd_b = GetStoredInteger( udg_temp, I2S(next)"1" )
        if( GetStoredInteger( udg_gc, I2S(zx+2*zadd_a), I2S(zy+2*zadd_b) ) ==0 ) then
            call StoreInteger( udg_gc, I2S(zx+zadd_a), I2S(zy+zadd_b)1 )
            call Search_Maze(x+zadd_a, y+zadd_b)
        endif
    endloop
endfunction

function Make_Maze takes integer x, integer y returns nothing
    local integer z1 = 0
    local integer z2 = 0
    loop
        exitwhen z1 >= 2*x+2
        set z1 = z1 + 1
        set z2 = 2 * y + 2
        call StoreInteger( udg_gc, I2S(z1)"0"    , 1 )
        call StoreInteger( udg_gc, I2S(z1), I2S(z2)1 )

    endloop
    set z1 = 0
    set z2 = 0
    loop
        set z2 = z2 + 1
        set z1 = 2 * x + 2
        call StoreInteger( udg_gc,     "0", I2S(z1)1 )
        call StoreInteger( udg_gc, I2S(z2), I2S(z1)1 )
        exitwhen z2 >= 2*y+2
    endloop
    call StoreInteger( udg_gc, "1""2"1 )
    call StoreInteger( udg_gc, I2S(2*x+1), I2S(2*y)1 )
    //从任意节点开始深搜 --->
    call Search_Maze ( ModInt(GetRandomInt(1,x),x) + 1,ModInt(GetRandomInt(1,y),y)+1)
endfunction

function Run_Maze takes nothing returns nothing
    local integer x = (udg_MAZE_MAXWIDTH-2)/2
    local integer y = (udg_MAZE_MAXHIGHT-2)/2
    local integer z1
    local integer z2
    call StoreInteger( udg_temp, "0""0",  0 )
    call StoreInteger( udg_temp, "1""0",  1 )
    call StoreInteger( udg_temp, "2""0",  1 )
    call StoreInteger( udg_temp, "3""0",  0 )
    call StoreInteger( udg_temp, "0""1",  0 )
    call StoreInteger( udg_temp, "1""1"-1 )
    call StoreInteger( udg_temp, "2""1"-1 )
    call StoreInteger( udg_temp, "3""1",  0 )

    call Make_Maze(x,y)

    loop
        set z2 = z2 + 1
        loop
            set z1 = z1 + 1
            if(GetStoredInteger( udg_gc, I2S(z1), I2S(z2) ) == 0 ) then
                call DisplayTimedTextToPlayer( Player(0)0,01200"|" )
            else
                call DisplayTimedTextToPlayer( Player(0)0,01200" " )
            endif
            exitwhen z1 >= x * 2 + 1
        endloop
        if (z2<=y*2) then
            
        endif
        exitwhen z2 >= y * 2 + 1
    endloop
endfunction
//=============================================================================
// 以下是触发数据代码:
//

function Trig_MapsInitialzation_Actions takes nothing returns nothing
    call InitGameCacheBJ( "MapName.w3v" )
    set udg_gc = GetLastCreatedGameCacheBJ()
    call InitGameCacheBJ( "Temp.w3v" )
    set udg_temp = GetLastCreatedGameCacheBJ()
    set udg_MAZE_MAXHIGHT = 10
    set udg_MAZE_MAXWIDTH = 10
    call Run_Maze()
endfunction

//===========================================================================
function InitTrig_MapsInitialzation takes nothing returns nothing
    set gg_trg_MapsInitialzation = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( gg_trg_MapsInitialzation, 0.00 )
    call TriggerAddAction( gg_trg_MapsInitialzation, function Trig_MapsInitialzation_Actions )
endfunction

Shingo Jass Highlighter 0.4



(葱头:38) 大家一起来帮偶检查一下哪里有问题呃,争取早日真正的实现迷宫JASS代 另外说一句,现在WE界算得上真正意义上的迷宫地图可以说是没有的。

[ 本帖最后由 thodylk 于 2008-8-22 08:59 编辑 ]
jass我不懂,C语言我懂,我看看。
以下转自ga 白银
引用:
随机迷宫理论与实现
[转自己的帖子...]
关于随机迷宫的算法的理论,一个简单算法的详细解释和使用时的注意:

首先先抄下演示中使用的算法代码段:
COPY JASSCODE
JASS:

//=================Function Start====================== 
function RandomMZ takes integer offset returns nothing 
local integer rd 
local integer symbol 
local integer tmp 
local integer lDir 
local integer direction 
set udg_isVisited[offset]=true 
loop 
set symbol=0 
if (offset>10 and udg_isVisited[offset-11]==false) then 
set symbol=symbol+1 
endif 
if (offset-offset/11*11>0 and udg_isVisited[offset-1]==false) then 
set symbol=symbol+2 
endif 
if (offset <110 and udg_isVisited[offset+11]==false) then 
set symbol=symbol+4 
endif 
if (offset-offset/11*11-10<0 and udg_isVisited[offset+1]==false) then 
set symbol=symbol+8 
endif 
exitwhen (symbol==0) 
set lDir=0 
set tmp=symbol 
loop 
exitwhen (tmp==0) 
set lDir=lDir+tmp-tmp/2*2 
set tmp=tmp/2 
endloop 
set rd=GetRandomInt(1,lDir) 
set tmp=symbol-symbol/2*2 
set direction=1 
loop 
exitwhen (tmp==1 and rd==1) 
set symbol=symbol/2 
if (tmp==1) then 
set rd=rd-1 
endif 
set tmp=symbol-symbol/2*2 
set direction=direction+1 
endloop 
if (direction==1) then 
set udg_toDown[offset-11]=true 
call RandomMZ(offset-11) 
endif 
if (direction==2) then 
set udg_toRight[offset-1]=true 
call RandomMZ(offset-1) 
endif 
if (direction==3) then 
set udg_toDown[offset]=true 
call RandomMZ(offset+11) 
endif 
if (direction==4) then 
set udg_toRight[offset]=true 
call RandomMZ(offset+1) 
endif 
endloop 
endfunction 
//=================Function End====================== 

Shingo Jass Highlighter 0.4



其中使用的全局变量有:
COPY JASSCODE
JASS:

boolean isVisited[] 
boolean toDown[] 
boolean toRight[] 

Shingo Jass Highlighter 0.4



现在解释各个变量的意义

迷宫一般由X*Y个房间构成,比如说这个6*5的迷宫(X=6,Y=5)
---------------------->X
0 1 2 3 4 5
| ┏━┳━┳━┳━┳━┳━┓
| 0┃0 ┃1 ┃2 ┃3 ┃4 ┃5 ┃
| ┣━╋━╋━╋━╋━╋━┫
| 1┃6 ┃7 ┃8 ┃9 ┃10┃11┃
| ┣━╋━╋━╋━╋━╋━┫
| 2┃12┃13┃14┃15┃16┃17┃
| ┣━╋━╋━╋━╋━╋━┫
| 3┃18┃19┃20┃21┃22┃23┃
| ┣━╋━╋━╋━╋━╋━┫
y 4┃24┃25┃26┃27┃28┃29┃
┗━┻━┻━┻━┻━┻━┛
====1====下标表示
由于JASS中只有一维数组,我们只能通过计算下标来找到每个房间储存的位置
如(0,0)下标是0,(3,4)下标是4*6+3=27,而下标是19的房间坐标为(19%6,[19/6])=(1,3)
(19%6即19/6的余数,具体算法是19-19/6*6,[19/6]即对19/6取整)
左右相邻的两个房间下标相差1,上下相邻的房间下标相差X
第1行下标=X*(Y-1),第一列下标特点是能被X整除,最后一列下标特点是加1后能被X整



====2====迷宫的储存
我们用toRight记录每个房间于其右边的房间是否连通,toDown记录是否与下面的房间连通
(为什么不用toLeft和toTop记录与左边和上面的房间的连通情况?原因是重复)
所以,toRight(19)和toDown(19)记录了房间(1,3)和(2,3)(1,4)的连通情况
通过一个X*Y大小的toRight和toDown的数组我们就可以记录一个X*Y的迷宫了
我们的目标就是随机算出每个房间的连通情况

====3====isVisited数组
isVisited数组保存每个房间的访问情况

对于一个随机迷宫的简单算法:
1.首先,将所有房间的连通情况设为不连通,进入某个房间
2.进入某个房间R后,如果R四周有未访问过的房间,则从未访问的房间中随机选择一个房间vR,连通R与

vR,并进入房间vR
3.如果房间R四周的房间已经全部访问过,则返回上一个房间
4.重复过程2和3,直到所有房间全部访问为止

该算法生成的迷宫任意两个房间之间有且只有一条通路
证明从略.

某些朋友可能已经知道怎么做了,从某个房间开始进行一次深度优先遍历即可

下面详细解释一下代码
1.function RandomMZ takes integer offset returns nothing
不要告诉我不知道这句话是什么意思...
offset 即为进入房间的下标,在T中的call RandomMZ(0)即进入(0,0)房间

2.变量定义
local integer rd============随机数
local integer symbol========标志
local integer tmp===========临时变量
local integer lDir==========房间四周剩余未访问的房间数量
local integer direction=====最终决定的方向 1=上 2=左 3=下 4=右

3.set udg_isVisited[offset]=true
进入一个房间首先将其设为已访问

4.set symbol=0
symbol作为标志位记录每个房间的连通情况,用2进制位记录,即为二进制的(0000)

5.
COPY JASSCODE
JASS:

if (offset>10 and udg_isVisited[offset-11]==false) then 
set symbol=symbol+1 
endif 

Shingo Jass Highlighter 0.4


如果上方有房间并且未访问,则将Symbol的第一位置1(二进制第一位是1)  
COPY JASSCODE
JASS:

if (offset-offset/11*11>0 and udg_isVisited[offset-1]==false) then 
set symbol=symbol+2 
endif  

Shingo Jass Highlighter 0.4


如果左边有房间并且未访问,则将Symbol的第二位置1(二进制第二位是2)  
COPY JASSCODE
JASS:

if (offset <110 and udg_isVisited[offset+11]==false) then 
set symbol=symbol+4 
endif  

Shingo Jass Highlighter 0.4


如果下方有房间并且未访问,则将Symbol的第三位置1(二进制第三位是4)  
COPY JASSCODE
JASS:

if (offset-offset/11*11-10<0 and udg_isVisited[offset+1]==false) then 
set symbol=symbol+8 
endif  

Shingo Jass Highlighter 0.4


如果右边有房间并且未访问,则将Symbol的第四位置1(二进制第四位是8)
比如Symbol=13,转换为二进制是(1101),就是上,下,右的房间可以访问,左边没有房间或房间已访问

6.exitwhen (symbol==0)
如果symbol=0,也就是没有房间可访问,那么退出循环,返回上一个房间

7.  
COPY JASSCODE
JASS:

set lDir=0 
set tmp=symbol 
loop 
exitwhen (tmp==0) 
set lDir=lDir+tmp-tmp/2*2 
set tmp=tmp/2 
endloop 

Shingo Jass Highlighter 0.4


这一段代码计算四周可访问的房间的数量,并保存在lDir中

8.
COPY JASSCODE
JASS:
set rd=GetRandomInt(1,lDir) 

Shingo Jass Highlighter 0.4


rd从1到lDir中随机取数(因为共lDir个房间可访问),决定访问可访问房间中的第几个

9.  
COPY JASSCODE
JASS:

set tmp=symbol-symbol/2*2 
set direction=1 
loop 
exitwhen (tmp==1 and rd==1) 
set symbol=symbol/2 
if (tmp==1) then 
set rd=rd-1 
endif 
set tmp=symbol-symbol/2*2 
set direction=direction+1 
endloop 
 

Shingo Jass Highlighter 0.4

得到访问房间的方向.具体是用计数器实现,依次取得每一个房间的状态,如果可访问,则将rd减1
当rd=1并且当前房间可访问时停止循环,这样当前的房间即为通过rd选择的房间

PS:以上7,8,9实现了随机选择可访问的房间,如果有更好的算法说一声啊

10.
COPY JASSCODE
JASS:
 if (direction==1) then 
set udg_toDown[offset-11]=true 
call RandomMZ(offset-11) 
endif 
if (direction==2) then 
set udg_toRight[offset-1]=true 
call RandomMZ(offset-1) 
endif 
if (direction==3) then 
set udg_toDown[offset]=true 
call RandomMZ(offset+11) 
endif 
if (direction==4) then 
set udg_toRight[offset]=true 
call RandomMZ(offset+1) 
endif  

Shingo Jass Highlighter 0.4


更据选择的方向决定下标变化,将两个房间连通,并进入该房间

11.loop
4,5,6,7,8,9,10
endloop
之所以重复4,5,6,7,8,9,10的过程是保证每个房间四周的房间都全部访问(根据6,那时候退出循环)
不会有遗漏的房间存在

12.endfunction
......

关于使用:
实际上修改这段代码很简单
比如要生成一个30*30的迷宫,只要简单的把该函数中的"11"全改为30,"10"全改为29(=30-1),"110"改为

870(=30*(30-1))即可,剩下的过程就是根据连通情况画出图了,在演示中也有T的例子,这点不再罗嗦

PS:由于生成的迷宫任意两个房间之间有且只有一条通路,迷宫有时候回显得比较简单,这时候可以修改

一下算法,比如随机连通两个不相连的房间,以增加回路,提高迷宫的复杂性

差不多就将这些,欢迎各位指正
此迷宫附件已丢失




/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

以下转自ga 马甲君
引用:
让人抓狂的随机迷宫
写得比较烂,将就看吧~~~~·

本来想做上限制步数的,想想还是算了吧~~

COPY JASSCODE
JASS:
function H2I takes handle H returns integer
      return H     
      return 0
endfunction

function I2U takes integer I returns unit
      return I
      return null
endfunction

function I2Tr takes integer I returns trigger
      return I
      return null
endfunction

function I2Re takes integer I returns rect
      return I
      return null
endfunction

function getrandomn takes integer Mint,integer mint returns integer
      local integer n=0
      local integer b=0
      loop
            set n=GetRandomInt(Mint,mint)
            set b=GetStoredInteger(udg_GC,"piont",I2S(n))
            exitwhen b<4
      endloop
      return n
endfunction

function creatlost takes nothing returns nothing
      local integer i=0
      local integer j=0
      local unit array waygateu
      local rect array reg
      call Cheat("iseedeadpeople")
      set udg_GC = InitGameCache("gamecache.w3v")
      call RegionAddRect( udg_rectout, gg_rct_lost )
      call RegionAddRect( udg_rectout, gg_rct_out )
      loop
            exitwhen i>3
            call StoreReal(udg_GC,I2S(i),"x",(-2050+1160*i))
            call StoreReal(udg_GC,I2S(i),"y",(905-1160*i))
            set i=i+1
      endloop
      set i=0
      loop
            exitwhen i>3
            set j=0
            loop
                  exitwhen j>3
                  set waygateu[i*16+j*4+0]=CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),'n000',GetStoredReal(udg_GC,I2S(i),"x")+350,GetStoredReal(udg_GC,I2S(j),"y"),0)
                  set waygateu[i*16+j*4+1]=CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),'n000',GetStoredReal(udg_GC,I2S(i),"x"),GetStoredReal(udg_GC,I2S(j),"y")+350,0)
                  set waygateu[i*16+j*4+2]=CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),'n000',GetStoredReal(udg_GC,I2S(i),"x")-350,GetStoredReal(udg_GC,I2S(j),"y"),0)
                  set waygateu[i*16+j*4+3]=CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),'n000',GetStoredReal(udg_GC,I2S(i),"x"),GetStoredReal(udg_GC,I2S(j),"y")-350,0)
                  set reg[i*4+j]=Rect((GetStoredReal(udg_GC,I2S(i),"x")-450),(GetStoredReal(udg_GC,I2S(j),"y")+450),(GetStoredReal(udg_GC,I2S(i),"x")+450),(GetStoredReal(udg_GC,I2S(j),"y")-450))
                  call StoreInteger(udg_GC,"rect",I2S(i*4+j),H2I(reg[i*4+j]))
                  set j=j+1
            endloop
            set i=i+1
      endloop
      set i=0
      loop
            exitwhen i>63
            call StoreInteger(udg_GC,"Wg",I2S(i),H2I(waygateu<i>))
            set waygateu<i>=null
            set i=i+1
      endloop
      set i=0
endfunction

function Tri_Action takes nothing returns nothing
        local unit array wg
        local integer i=0
        local integer j=0
        loop
            exitwhen i>3
            set j=GetStoredInteger(udg_GC,I2S(H2I(GetTriggerUnit())),I2S(H2I(GetTriggeringTrigger())))
            set wg<i>=I2U(GetStoredInteger(udg_GC,"Wg",I2S(j*4+i)))
            call WaygateActivate(wg<i>,TRUE)
            call WaygateSetDestination(wg<i>,GetStoredReal(udg_GC,I2S(H2I(GetTriggeringTrigger())*10+i),"x"),GetStoredReal(udg_GC,I2S(H2I(GetTriggeringTrigger())*10+i),"y"))
            set wg<i>=null
            set i=i+1
      endloop
      set i=0
endfunction

function tLev_Action takes nothing returns nothing
      call StoreBoolean(udg_GC,I2S(H2I(GetTriggerUnit())),"out",false)
endfunction

function fLev_Action takes nothing returns nothing
      local integer i=0
      local trigger array trg
      loop
            exitwhen i>33
            set trg<i>=I2Tr(GetStoredInteger(udg_GC,I2S(H2I(GetTriggerUnit())),I2S(i)))
            call TriggerClearActions(trg<i>)
            call DestroyTrigger(trg<i>)
            set trg<i>=null
            set i=i+1
      endloop
      set i=0
      if GetStoredBoolean(udg_GC,I2S(H2I(GetTriggerUnit())),"out") then
            call DisplayTextToPlayer( GetOwningPlayer(GetTriggerUnit())00"以非正当方式逃离迷宫,请接受惩罚!" )
            call TriggerExecute( gg_trg_t )
      endif
endfunction

function Lev_Action takes nothing returns nothing
        local unit array wg
        local integer i=0
        local integer j=0
        loop
            exitwhen i>3
            set j=GetStoredInteger(udg_GC,I2S(H2I(GetTriggerUnit())),I2S(H2I(GetTriggeringTrigger())))
            set wg<i>=I2U(GetStoredInteger(udg_GC,"Wg",I2S(j*4+i)))
            call WaygateActivate(wg<i>,false)
            set i=i+1
            set wg<i>=null
      endloop
      set i=0
endfunction

function initlost takes unit who,boolean b returns nothing
        local location array pnt
        local rect array reg
        local trigger array trg
        local integer i =0
        local integer n=0
        if b then
            call DisplayTextToPlayer( GetOwningPlayer(who)00"迷宫初始化开始!" )
        else
            call DisplayTextToPlayer( GetOwningPlayer(who)00"迷宫正在被重置!" )
        endif 
        call StoreBoolean(udg_GC,I2S(H2I(who)),"out",true)
        loop
            exitwhen i>15
            set reg<i>=I2Re(GetStoredInteger(udg_GC,"rect",I2S(i)))
            set pnt<i> = Location(GetStoredReal(udg_GC,I2S(i/4),"x"),GetStoredReal(udg_GC,I2S(ModuloInteger(i, 4)),"y"))
            if i==0 then
                  call StoreInteger(udg_GC,"piont",I2S(i),1)
            else
                  call StoreInteger(udg_GC,"piont",I2S(i),0)
            endif
            set trg<i> = CreateTrigger()
            call TriggerRegisterEnterRectSimple(trg<i>, reg<i>)
            call TriggerAddAction( trg<i>, function Tri_Action)
            call StoreInteger(udg_GC,I2S(H2I(who)),I2S(H2I(trg<i>)),i)
            call StoreInteger(udg_GC,I2S(H2I(who)),I2S(i),H2I(trg<i>))
            set trg[i+16] = CreateTrigger()
            call TriggerRegisterLeaveRectSimple(trg[i+16], reg<i>)
            call TriggerAddAction( trg[i+16]function Lev_Action)
            call StoreInteger(udg_GC,I2S(H2I(who)),I2S(H2I(trg[i+16])),i)
            call StoreInteger(udg_GC,I2S(H2I(who)),I2S(i+16),H2I(trg[i+16]))
            set i=i+1
      endloop
      set i=0
      set pnt[16]=Location(2700,2700)
      call StoreInteger(udg_GC,"piont",I2S(16),3)
      loop
            exitwhen i>63
            set n = getrandomn(0,16)
            call StoreReal(udg_GC,I2S(H2I(trg[R2I(i/4)])*10+ModuloInteger(i, 4)),"x",GetLocationX(pnt[n]))
            call StoreReal(udg_GC,I2S(H2I(trg[R2I(i/4)])*10+ModuloInteger(i, 4)),"y",GetLocationY(pnt[n]))
            call StoreInteger(udg_GC,"piont",I2S(n),GetStoredInteger(udg_GC,"piont",I2S(n))+1)
            set i=i+1
      endloop
      set i=0
      set trg[32] = CreateTrigger()
      call TriggerRegisterLeaveRegionSimple(trg[32], udg_rectout)
      call TriggerAddAction( trg[32]function fLev_Action)
      call StoreInteger(udg_GC,I2S(H2I(who)),I2S(32),H2I(trg[32]))
      set trg[32] = CreateTrigger()
      call TriggerRegisterEnterRectSimple(trg[33], gg_rct_out )
      call TriggerAddAction( trg[33]function tLev_Action)
      call StoreInteger(udg_GC,I2S(H2I(who)),I2S(33),H2I(trg[33]))
      call SetUnitPositionLoc(who,pnt[GetRandomInt(0,15)])
      if b then
          &