Python curses循环和超时

4
我很难理解window.timeout()函数。更具体地说,我在使用Python制作“贪吃蛇”游戏:
s = curses.initscr()
curses.curs_set(0)
w = curses.newwin()
w.timeout(100)

while True:
    move snake until it hits the wall

我理解在这种情况下,timeout(100) 确定了蛇“移动”的速度,即在屏幕上打印新字符的速度。然而,当我想修改代码以便等待某人按“开始”时,我陷入了困境。我写了以下代码:

w.timeout(100)

while True:
    if w.getch() is not start: 
        stay at the initial screen
    else:
        while True:
            move the snake until it hits the wall

然而,在这种情况下,timeout(100) 似乎控制程序等待 w.getch() 的时间长度,而不是控制两次蛇移动之间的时间长度。此外,我注意到在第一个示例中,timeout 在 while 循环外面被声明。这看起来对我来说很奇怪,因为通常如果我想暂停一个 while 循环,我会将 sleep() 放在 while 循环的底部内部。
1个回答

3
如果您想在蛇移动之间暂停,可以使用napms等待给定的毫秒数(与sleep不同,它不会干扰屏幕更新)。将w.timeout设置为100(毫秒)可能太长了。如果您不关心读取功能键,则可以使用nodelayw.getch设置为非阻塞状态,依靠napms来减缓循环速度。
关于后续评论:在ncurses中,wtimeout函数设置名为_delay的窗口属性,在getch函数中起作用,最终传递给一个计时等待函数,如果有数据要读取,则提前返回。

谢谢!我会使用napms。但从概念上讲,程序何时在代码中停止100毫秒?起初我以为它会在整个程序运行后停止,但在第二个示例中,它似乎在第一个while循环级别(在每个getch()之间)停止,但不是第二个级别(在每个蛇移动之间)。 - ian_chan
在一个相关的问题上,napms的解决方案似乎有一个不良后果:如果我按“左右上下”足够快(比napms延迟更快)多次,它将在我停止输入后继续移动,因为它还没有执行完所有的方向输入。我能否实现类似于min(napms(delay),next key_input)的东西?谢谢! - ian_chan
我认为 flushinp 是你正在寻找的,但是typeahead也很有帮助。 - Thomas Dickey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接