我目前正在制作一个简单的猜测数字'使用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
答案 0 :(得分: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扩展,您可以创建一个C扩展,将一些C non-blocking keyboard input公开给Lua。我怀疑它,因为它是一个iOS应用程序。
似乎没有时间循环或回调等,并且找不到文档。如果您可以选择创建用户可以输入答案的文本框,并且必须单击“接受”,则可以测量所需的时间。如果有时间循环,您可以检查那里的时间并在时间不足时显示消息。所有这些在Corona中都很容易做到,也许在TouchLua +中是不可能的。