3

有谁知道如何捕捉游戏的击键(即使用键盘导航一个简单的基于 ascii 的游戏,其中 8 = 向上、2 = 向下、向左 4 等......并且不需要按回车键,只需一次击键即可移动是目标。)?我找到了这段代码,这看起来是个好主意,但我想不通。添加评论,或将我发送到有关该主题的文章等,将有很大帮助。我知道很多人都有这个问题。提前致谢?

    try:
        from msvcrt import kbhit
    except ImportError:
        import termios, fcntl, sys, os
        def kbhit():
            fd = sys.stdin.fileno()
            oldterm = termios.tcgetattr(fd)
            newattr = termios.tcgetattr(fd)
            newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
            termios.tcsetattr(fd, termios.TCSANOW, newattr)
            oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
            fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
            try:
                while True:
                    try:
                        c = sys.stdin.read(1)
                        return True
                    except IOError:
                        return False
            finally:
                termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
                fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
4

2 回答 2

1

Pygame是一个很好的起点,文档非常好。这是一种获取键盘输出的方法:

import pygame    
pygame.init()
screen = pygame.display.set_mode((100, 100))
while 1:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN and event.key <= 256:
            print event.key, chr(event.key)

您必须初始化 pygame 并创建一个活动窗口来执行此操作。我认为没有任何方法可以避免在不执行这些操作的情况下按下“返回”键。

在 Pygame 中制作东西实际上是开始学习编程的好方法,因为该站点有大量示例。

于 2012-03-27T06:09:48.413 回答
1

好的,如果您想了解如何直接控制它,请先仔细查看 Linux(或 OS X)的termiosfcntlstty. 这是很多东西,但你会看到所有这些标志的用途。

通常,您的键盘输入是行缓冲的:终端驱动程序会收集它,直到您按回车键。该标志~termios.ICANON负责关闭行缓冲,因此您可以立即看到用户键入的内容。

另一方面,如果您希望您的程序仅在用户按下某个键时响应,您不希望os.O_NONBLOCK:这意味着您的程序在从键盘读取时不会阻塞,但您的读取将返回一个空字符串. 这适用于无论用户是否做出反应,事情都会不断发生的真人游戏。

于 2012-03-27T11:00:08.543 回答