|
节约用水 超级版主
 
- UID
- 95830
- 帖子
- 7239
- 力量
- 16370
- 敏捷
- 20102
- 智力
- 11692
- 生命
- 8105
- 魔法
- 2311
- 注册时间
- 2007-2-8
|
23楼
大 中
小 发表于 2008-8-24 22:29 只看该作者
新的尝试,循环代替递归,帮我看看问题出在哪里?
COPY JASSCODEJASS:globals
// User-defined
integer udg_MAZE_MAXWIDTH = 0
integer udg_MAZE_MAXHIGHT = 0
integer array udg_map
integer array udg_zadd
integer array udg_search_x
integer array udg_search_y
integer udg_search_max = 0
integer udg_search_now = 0
endglobals
function xy2a takes integer x, integer y, integer maxx returns integer
return x * maxx + x + y
endfunction
function a2x takes integer a, integer maxx returns integer
return a / maxx
endfunction
function a2y takes integer a, integer maxx returns integer
local integer ans = a - a2x(a, maxx) * maxx
if ans < 0 then
set ans = 0 - ans
endif
return ans
endfunction
function Make_Maze takes integer x, integer y returns nothing
local integer zx
local integer zy
local integer next
local integer turn
local integer i
local integer z1 = 0
local integer z2 = 2 * y + 2
loop
exitwhen z1 > 2 * x + 2
set udg_map[xy2a(z1, 0, udg_MAZE_MAXWIDTH + 2)] = 1
set udg_map[xy2a(z1, z2, udg_MAZE_MAXWIDTH + 2)] = 1
set z1 = z1 + 1
endloop
set z1 = 0
set z2 = 2 * x + 2
loop
exitwhen z1 > 2 * y + 2
set udg_map[xy2a(0, z1, udg_MAZE_MAXWIDTH + 2)] = 1
set udg_map[xy2a(z2, z1, udg_MAZE_MAXWIDTH + 2)] = 1
set z1 = z1 + 1
endloop
set udg_map[xy2a(1, 2, udg_MAZE_MAXWIDTH + 2)] = 1
set udg_map[xy2a(2 * x + 1, 2 * y, udg_MAZE_MAXWIDTH + 2)] = 1
//没有必要调用srand
//循环代替search的递归
loop
call BJDebugMsg(I2S(udg_search_max))
call BJDebugMsg(I2S(udg_search_now))
set zx = udg_search_x[udg_search_now] * 2
set zy = udg_search_y[udg_search_now] * 2
set i = 0
set udg_map[xy2a(zx, zy, udg_MAZE_MAXWIDTH + 2)] = 1
if a2y(GetRandomInt(0, 32767), 2) != 0 then
set turn = 1
else
set turn = 3
endif
set next = a2y(GetRandomInt(0, 32767), 4)
loop
exitwhen i >= 4
if udg_map[xy2a(zx + 2 * udg_zadd[xy2a(next, 0, 4)], zy + 2 * udg_zadd[xy2a(next, 1, 4)], udg_MAZE_MAXWIDTH + 2)] == 0 then
set udg_map[xy2a(zx + udg_zadd[xy2a(next, 0, 4)], zy + udg_zadd[xy2a(next, 1, 4)], udg_MAZE_MAXWIDTH + 2)] = 1
set udg_search_max = udg_search_max + 1
set udg_search_x[udg_search_max] = udg_search_x[udg_search_max - 1] + udg_zadd[xy2a(next, 0, 4)]
set udg_search_y[udg_search_max] = udg_search_y[udg_search_max - 1] + udg_zadd[xy2a(next, 1, 4)]
endif
set i = i + 1
set next = a2y(next + turn, 4)
endloop
set udg_search_now = udg_search_now + 1
exitwhen udg_search_now > udg_search_max
call TriggerSleepAction(.5)
endloop
endfunction
function Trig_MazeInit_Actions takes nothing returns nothing
local integer m_x = (udg_MAZE_MAXWIDTH - 2) / 2
local integer m_y = (udg_MAZE_MAXHIGHT - 2) / 2
local integer m_z1 = 1
local integer m_z2 = 1
local string s = ""
set udg_search_max = 0
set udg_search_now = 0
set udg_search_x[udg_search_max] = a2y(GetRandomInt(0, 32767), m_x) + 1
set udg_search_y[udg_search_max] = a2y(GetRandomInt(0, 32767), m_y) + 1
//Jass的m函数返回nothing
//防止bug,这里的x、y、z1、z2加上m_前缀
set udg_zadd[0] = 0
set udg_zadd[1] = 1
set udg_zadd[2] = 1
set udg_zadd[3] = 0
set udg_zadd[4] = 0
set udg_zadd[5] = -1
set udg_zadd[6] = -1
set udg_zadd[7] = 0
call Make_Maze(m_x, m_y)
loop
exitwhen m_z2 > m_y * 2 + 1
loop
exitwhen m_z1 > m_x * 2 + 1
if udg_map[xy2a(m_z1, m_z2, udg_MAZE_MAXWIDTH + 2)] == 0 then
set s = s + "x"
else
set s = s + " "
endif
set m_z1 = m_z1 + 1
endloop
if m_z2 <= m_y * 2 then
//call BJDebugMsg(s)
set s = ""
endif
set m_z2 = m_z2 + 1
endloop
//没有必要调用getchar
//没有返回值
endfunction
//===========================================================================
function InitTrig_MazeInit takes nothing returns nothing
set gg_trg_MazeInit = CreateTrigger( )
call TriggerAddAction( gg_trg_MazeInit, function Trig_MazeInit_Actions )
endfunctionShingo Jass Highlighter 0.4
里面每0.5秒输出max和now的值,问题是max的值一开始还好,到后面就呈现+4递增,而且停不下来。。。不知原因何在
|