我目前正在使用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+中却不太可能。