我已经开始了创建一个相对较小的命令行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 期望输入可变长度?

预先感谢您的所有帮助。

有帮助吗?

解决方案

不要阅读三个字符。阅读一个。

如果您读的一个角色是 ESC, ,阅读另一个或两个字符,以查看它是否是箭头钥匙还是其他。如果是 q, ,为此做事,然后重新开始。

其他提示

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

getch() 可以升级摘要以读取箭头键,但是如何在箭头键的第一个字符和 ESC 钥匙?如果用户按下 ESC, ,所描述的解决方案可能会等待下一个密钥按下。

我找不到任何解决最后案例的解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top