3

我已经开始冒险创建一个相对较小的命令行 RPG 来锻炼我新发现的 Python 肌肉,但我已经遇到了一个难题。我正在使用 getch() 的这个实现:

def getch():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    tty.setraw(sys.stdin.fileno())
    key = sys.stdin.read(3)
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)

我已key设置读取 3 个字符以捕获箭头键。例如,Up 读作ESC[A; 使用这种方法,我可以key[2]用来确定是否按下了箭头键以及按下了哪个键。一切都很好,除了我还想捕获各种其他键;q用于任务日志,wasd用于移动(按各种顺序按箭头将是攻击方法)等等。问题马上就清楚了;如果getch()只返回一个字符,箭头功能将完全丢失。

如果没有简单的解决方案,我正在考虑完全重新考虑箭头系统,但我几乎可以肯定一定有。诚然,我对 内部发生的事情知之甚少tty,但我在某处读到,如果您只读取 1 个字符,则箭头按下的多余字符将保留在缓冲区中。我该如何访问所述缓冲区?或者,是否有一些聪明的方法可以告诉stdin期望输入可变长度?

提前感谢您的任何和所有帮助。

4

2 回答 2

5

不要读三个字符。读一。

如果您刚刚读取的一个字符是ESC,请读取另一个或两个字符以查看它是箭头键还是其他字符。如果是q,请为此做事,然后重新开始。

于 2011-09-05T17:10:25.253 回答
0

如果您考虑开发完整的游戏,PyGame也可能有用(最终ncurses)。

getch()片段可以升级为读取箭头键,但是如何区分箭头键的第一个字符和ESC键?如果用户按下ESC,所描述的解决方案可能会等待下一次按键。

我没有找到任何解决方案来处理最后一种情况。

于 2013-08-04T21:18:31.910 回答