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

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

本主题由 System 于 2008-8-29 05:00 解除限时高亮
jass里循环体里的执行的代码过多就会自动跳出,所以必须不断开启新线程来防止跳出
受教了,看来用分布的方法来搜有点行不通啊

新的尝试,循环代替递归,帮我看看问题出在哪里?

COPY JASSCODE
JASS:
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(12, udg_MAZE_MAXWIDTH + 2)] = 1
    set udg_map[xy2a(2 * x + 12 * 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(032767)2) != 0 then
            set turn = 1
        else
            set turn = 3
        endif
        set next = a2y(GetRandomInt(032767)4)
        loop
            exitwhen i >= 4
            if udg_map[xy2a(zx + 2 * udg_zadd[xy2a(next, 04)], zy + 2 * udg_zadd[xy2a(next, 14)], udg_MAZE_MAXWIDTH + 2)] == 0 then
                set udg_map[xy2a(zx + udg_zadd[xy2a(next, 04)], zy + udg_zadd[xy2a(next, 14)], 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, 04)]
                set udg_search_y[udg_search_max] = udg_search_y[udg_search_max - 1] + udg_zadd[xy2a(next, 14)]
            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(032767), m_x) + 1
    set udg_search_y[udg_search_max] = a2y(GetRandomInt(032767), 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 )
endfunction

Shingo Jass Highlighter 0.4



里面每0.5秒输出max和now的值,问题是max的值一开始还好,到后面就呈现+4递增,而且停不下来。。。不知原因何在
 23 12
发新话题