2014-03-19 58 views
1

我目前正在使用Lua進行一個簡單的「猜數字」遊戲。我正在通過iPad上的應用程序進行編程,名爲TouchLua +。其中一種遊戲模式是你有一定的時間來猜測數字。我認爲要這樣做,我會創建一個從給定時間開始倒計時的協程。出於某種原因,我不能在協程運行時輸入數字。誰能幫忙?這是我到目前爲止。Lua Coroutine錯誤

target = math.random(1, 100) 
    coroutine.resume(coroutine.create(function() 
    for i = 1, roundTime do 
     sleep(1000) 
     sys.alert("tock") 
    end 
    lose = true 
    coroutine.yield() 
    end)) 
    repeat 
    local n = tonumber(io.read()) 
    if (n > target) then 
     print("Try a lower number.\n") 
    elseif (n < target) then 
     print("Try a higher number.\n") 
    else 
     win = true 
    end 
    until (lose or win) 
    return true 

回答

2

協程並不是一種多處理的形式,它們是一種協作式多線程的形式。因此,在協程正在運行時,沒有其他任何運行。協程意味着經常將控制權交還給調用者,並且調用者意圖恢復協程,以使協程可以繼續其產生的地方。您可以看到這將如何顯示爲並行處理。

所以你的情況,你會想從內環路產生,一個小的睡眠時間後:

co = coroutine.create(function() 
    for i = 1, roundTime do 
     sleep(1) 
     sys.alert("tock") 
     coroutine.yield() 
    end 
    lose = true 
end) 

不幸的是,你不能中斷io.read(),這意味着以上的沒用。理想情況下,你會希望有一個「io.peek」功能,這樣你就可以做到以下幾點:

while coroutine.status(co) ~= "dead" do 
    coroutine.resume(co) 
    if io.peek() then -- non-blocking, just checks if a key has been pressed 
     ... get the answer and process ... 
    end 
end 

我不知道在Lua非阻塞IO鍵盤的。假設TouchLua +支持C擴展,您可以創建一個向Lua公開部分C non-blocking keyboard input的C擴展。我懷疑它,因爲它是一個iOS應用程序。

它似乎並沒有出現時間循環或回調等,也找不到文檔。如果您可以選擇創建一個用戶可以輸入答案的文本框,並且他們必須點擊接受,那麼您可以測量所花費的時間。如果有時間循環,您可以在那裏查看時間,並在時間不足的情況下顯示消息。所有這些在科羅娜都很容易做到,也許在TouchLua +中是不可能的。