我正在为终端写一个蛇游戏,即通过打印输出。基于终端的蛇游戏:输入线程操纵输出
下面的作品就好了:
while status[snake_monad] do
print to_string draw canvas, compose_all([
frame,
specs,
snake_to_hash(snake[snake_monad])
])
turn! snake_monad, get_dir
move! snake_monad, specs
sleep 0.25
end
但我不希望turn!
ING阻止的,当然。所以我把它变成一个新的线程,并让它循环:
Thread.new do
loop do
turn! snake_monad, get_dir
end
end
while status[snake_monad] do
...
# no turn! here
...
end
也可以工作在逻辑(蛇转弯),但输出以某种方式与换行符穿插。只要我杀死输入线程(^C
),它再次看起来很正常。
那么为什么以及线程对我的输出有什么影响? 我该如何解决这个问题?
(我不知道很多有关线程,甚至更少关于他们在同一个终端上的红宝石。输入和输出同时更糟的是,我想...)
也(并不重要) :为了让我的程序尽可能纯粹,在传递所有内容时,是否可以非常容易地获得非阻塞输入?
谢谢!
更糟?永远不要*让两个线程来控制IO。它会很糟糕地结束。如果你尝试在STDIN和STDOUT周围添加一个互斥锁......我不寒而栗地看到代码。 – Linuxios
也许我做错了,但它也行不通。我得到的最接近的是:冻结的第一帧,我可以在其中键入'^ C' ...然后它会按照我输入的方向进行操作。任何其他组合都有原始(坏)影响。 – enlightened