迴圈(loop)

迴圈是什麼

當你要讓電腦計算1*2*3*…*50的時候,你是不是覺得寫那麼一長串程式碼很煩?事實上,類似的動作寫好幾遍的程式碼,任何人都會覺得很煩很枯燥。因此聰明的程式師就發明了迴圈,用來讓電腦執行相同或相似的動作多次,而不佔用太多程式碼。

語法

loop
    //*****************************
    //***       一段程式碼      ***
    //*****************************
    exitwhen <條件>
    //*****************************
    //***       一段程式碼      ***
    //*****************************
endloop 

exitwhen那段可寫可不寫。不過如果沒寫就變成無窮迴圈跑到死,除非裡面有Wait,否則War3基本上會跳出。

迴圈範例

GUI Trigger中,計算1*2*3*...*50的動作

Actions
 Set x = 0
 For each (Integer A) from 1 to 50, do (Actions)
  Loop - Actions
   Set x = (x * (Integer A))

↓↓↓↓↓↓↓↓轉成JASS

    set udg_x = 0
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = 50
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        set udg_x = ( udg_x + GetForLoopIndexA() )
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop

計算部隊擁有的物品數

function UnitInventoryCount takes unit whichUnit returns integer
    local integer index = 0
    local integer count = 0

    loop
        if (UnitItemInSlot(whichUnit, index) != null) then
            set count = count + 1
        endif

        set index = index + 1
        exitwhen index >= bj_MAX_INVENTORY
    endloop

    return count
endfunction

blizzard.j中等待遊戲時間的函數

function PolledWait takes real duration returns nothing
    local timer t
    local real  timeRemaining

    if (duration > 0) then
        set t = CreateTimer()
        call TimerStart(t, duration, false, null)
        loop
            set timeRemaining = TimerGetRemaining(t)
            exitwhen timeRemaining <= 0

            // If we have a bit of time left, skip past 10% of the remaining
            // duration instead of checking every interval, to minimize the
            // polling on long waits.
            if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then
                call TriggerSleepAction(0.1 * timeRemaining)
            else
                call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
            endif
        endloop
        call DestroyTimer(t)
    endif
endfunction

附註

bj_forLoopAIndex和bj_forLoopAIndexEnd都是全域變數。這就是為什麼不能在GUI Trigger的迴圈中使用Wait的原因:如果使用Wait,在等待時bj_forLoopAIndex和bj_forLoopAIndexEnd可能被別的函數拿去用並改變它的值,可能會造成嚴重的錯誤。

使用區域變數(如計算部隊擁有物品數的函數)就不會有這個問題。

綜合教學/jass入門教學/6.迴圈.txt · 上一次變更: 2007年11月11日 4:17 pm 來自 wasabi
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0