Lua协程错误



我目前正在使用Lua制作一个简单的"猜数字"游戏。我正在通过iPad上的一个叫做TouchLua+的应用程序编程。其中一种游戏模式是你有一定的时间来猜数字。我想要做到这一点,我会创建一个协同程序,从给定的时间开始倒计时。由于某些原因,我不能在协程运行时输入数字。有人能帮忙吗?以下是我到目前为止写的。

  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

协程不是多处理的一种形式,它们是协作多线程的一种形式。因此,当协程运行时,没有其他程序在运行。协程意味着经常将控制权交还给调用者,而调用者意味着恢复协程,以便协程可以继续它所产生的地方。您可以看到这将如何显示为并行处理。

所以在你的情况下,你会想从循环中退出,在一小段睡眠时间后:

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。您可以创建一个C扩展,将一些C非阻塞键盘输入公开给Lua,假设TouchLua+支持C扩展。考虑到它是一个iOS应用程序,我对此表示怀疑。

似乎没有时间循环或回调之类的,并且找不到文档。如果你可以选择创建一个文本框,用户可以在其中输入答案,他们必须点击接受,然后你可以测量它花了多长时间。如果有一个时间循环,你可以在那里检查时间,并在超时时显示消息。所有这些在Corona中都很容易做到,但在TouchLua+中却不太可能。

最新更新