可以使用getch()获取不同长度的输入吗?

3 投票
2 回答
701 浏览
提问于 2025-04-17 01:30

我最近开始了一个小冒险,想用Python做一个命令行的角色扮演游戏,想展示一下我学到的新技能,但我遇到了一些问题。我在用这个方法来获取按键:

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内部的工作原理了解不多,但我听说如果你只读取一个字符,箭头键按下时多余的字符会保留在缓冲区里。我该如何访问这个缓冲区呢?或者,有没有什么聪明的方法可以告诉stdin期待可变长度的输入呢?

提前感谢大家的帮助。

2 个回答

0

如果你考虑开发一个完整的游戏,PyGame 可能会很有用(最终可能还会用到 ncurses)。

这个 getch() 的代码片段可以升级,用来读取方向键,但怎么区分方向键的第一个字符和 ESC 键呢?如果用户按下 ESC 键,之前提到的解决方案可能会等着下一个按键。

我没有找到处理这个情况的解决办法。

5

不要一次读取三个字符,读取一个就可以了。

如果你刚读取的那个字符是ESC,那就再读取一个或两个字符,看看它是不是方向键或者其他的什么。如果读取到的是q,那就执行对应的操作,然后重新开始。

撰写回答