我已经开始创建一个相对较小的命令行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个字符以捕获箭头键。例如,以ESC[A
读取;使用此方法,我可以使用key[2]
来确定是否按下了箭头键以及哪一个。一切都很好,除了我还想捕获各种其他键; q
用于任务日志,wasd
用于移动(按各种顺序按箭头将是攻击方法),还有许多其他命令。问题很明显;如果getch()
仅返回单个字符,则箭头功能将完全丢失。
如果没有简单的解决方案,我正在考虑完全重新考虑箭头系统,但我几乎肯定必须有。不可否认,我对tty
内发生的事情知之甚少,但我在某处读到,如果你只读了1个字符,箭头按下的多余字符将保留在缓冲区中。我怎么去访问所说的缓冲区?或者,是否有一些聪明的方法告诉stdin
期望输入可变长度?
提前感谢您提供任何帮助。
答案 0 :(得分:5)
不要读三个字符。读一个。
如果您刚刚阅读的一个字符是ESC
,请阅读另一个或两个字符以查看它是箭头键还是其他任何字符。如果它是q
,那就做那件事,然后重新开始。
答案 1 :(得分:0)
如果您考虑开发完整游戏,PyGame
也可能有用(最终ncurses
)。
可以将getch()
代码段升级为读取箭头键,但如何区分箭头键的第一个字符和ESC
键之间的差异?如果用户按下ESC
,则说明的解决方案可能会等待下一次按键。
我没有找到处理这最后一个案例的任何解决方案。