【问题标题】:Lua Coroutine ErrorLua协程错误
【发布时间】:2014-03-19 04:30:22
【问题描述】:

我目前正在使用 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

【问题讨论】:

    标签: lua coroutine


    【解决方案1】:

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

    因此,在您的情况下,您希望在一小段睡眠时间后从循环内部产生:

    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 扩展,您可以创建一个 C 扩展,向 Lua 公开一些 C non-blocking keyboard input。我对此表示怀疑,因为它是一个 iOS 应用程序。

    似乎没有时间循环或回调等,并且找不到文档。如果您可以选择创建一个文本框,用户可以在其中输入答案并且他们必须单击接受,那么您可以测量花费了多长时间。如果有时间循环,您可以在那里检查时间并在时间用完时显示消息。这一切在 Corona 中很容易做到,在 TouchLua+ 中可能做不到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 2015-01-23
      • 2013-09-28
      • 2016-03-22
      • 2013-10-31
      • 2020-07-13
      • 1970-01-01
      相关资源
      最近更新 更多