可以使用getch()获取不同长度的输入吗?
我最近开始了一个小冒险,想用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
,那就执行对应的操作,然后重新开始。