我试图在Python2.7中设计终端游戏。在我的游戏课中,我有这个:
from board import board
from sys import stdin
from termios import tcgetattr as getat, tcsetattr as setat, TCSADRAIN
from tty import setraw
class game:
def __init__(self, **kwargs):
self.board = board() # p1, p2
self.fd = stdin.fileno()
self.old_settings = getat(self.fd)
self.buffer = kwargs.get("key buffer", 4)
if type(self.buffer) is not int or self.buffer < 4:
self.buffer = 4
def wait(self):
keys = bytearray()
while True:
setraw(self.fd)
keys.insert(0,stdin.read(1))
setat(self.fd, TCSADRAIN, self.old_settings)
#'h'=104, 'j'=106, 'k'=107, 'l'=108, 'd'=100, '\x1b'=27, '['=91
if keys[0] == 104 or keys[0] == 68 and keys[2] == 27 and keys[1] == 91:
print "left"
elif keys[0] == 106 or keys[0] == 66 and keys[2] == 27 and keys[1] == 91:
print "down"
elif keys[0] == 107 or keys[0] == 65 and keys[2] == 27 and keys[1] == 91:
print "up"
elif keys[0] == 108 or keys[0] == 67 and keys[2] == 27 and keys[1] == 91:
print "right"
elif keys[0] == 3:
break
else:
print repr(keys[0])
我把它快速地扔在了一起,并不是很多,但这使得stdin&#34; raw&#34;直到它收到一个字符然后将其翻转,这样它就不会弄乱东西(找到here)。唯一的问题是有很多事情并不总是只有一个字符。例如,十进制的向上箭头键是27,91,65或十六进制0x1b,0x5b,0x41或字节&#34; \ x1b \ x5b \ x41&#34;。这是三个不同的字节/字符。如果您查看上面的代码,您可以看到我部分解决了这个问题,但如果我想知道用户是否按了[Home]
键,那么需要额外的很多 ,这是4个字节。更难(实际上,如果按下箭头键,这似乎无法解密),用户可能已经点击[Esc]
(27或0x1b或&#34; \ x1b&#34;)然后[
(91或0x5b或&#34; \ x5b&#34;)然后A
(65或0x41或&#34; \ x41&#34;)。对于所有其他箭头键也是如此,大多数功能键也是[Home]
,[Pg Up]
,[Pg Dn]
,[End]
等键。 (我已经测试过点击[Esc]
,[
,A
,并且它有效 - 即它将其解释为up
)。
几乎所有东西都可以读取箭头键,功能键,home / end / pg键,那么为什么我不能这样做呢?这只是Python(2)中没有开发的东西吗?我真的希望有人可以提供更好的方式或阅读标准或更好的解释方式。