Python Pygame跳过按键检查

Python Pygame跳过按键检查,python,pygame,Python,Pygame,我正在编写一个游戏,随机挑选一个问题供玩家回答。我有一个函数,可以随机选择问题并显示出来,效果很好。这是函数中的第一个问题: topicList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17] def random_topic_generator(): global RNG RNG = random.choice(topicList) if RNG == 0: scree

我正在编写一个游戏,随机挑选一个问题供玩家回答。我有一个函数,可以随机选择问题并显示出来,效果很好。这是函数中的第一个问题:

topicList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]


def random_topic_generator():
    global RNG
    RNG = random.choice(topicList)
    if RNG == 0:
        screen.fill((255, 255, 255))
        draw_text("Question 1", questionFont, screen, 10, 0)
        draw_text("What color is the sky", questionFont, screen, 10, 100)
        draw_text("A: Green", answerFont, screen, 10,400)
        draw_text("B: Blue", answerFont, screen, 700, 400)
        draw_text("C: Orange", answerFont, screen, 10,600)
        draw_text("D: Yellow", answerFont, screen, 700, 600)
        topicList.remove(0)
以下是While循环的相应部分:

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_RETURN:
                random_topic_generator()
                if RNG == 0:
                    if event.key == K_b:
                        right_answer()
                    else:
                        wrong_answer()
正确答案()和错误答案():


按return键进入下一个问题,可以。但是,无论何时RNG==0,无论何时我在游戏中遇到问题,错误的答案()总是在没有按键的情况下运行。如果我去掉了else,遇到了这个问题,按b没有任何作用。

您已经检查了第二个代码片段第7行的事件键。当您到达最里面的if语句时,它总是使用else,因为只有当按下的键是
return
时,您才能到达该代码

这个逻辑错误的原因可能是您的输入处理程序过于复杂,这使得出错更加容易。从长远来看,您可能希望重构此代码,因为您的游戏将有许多不同的状态(菜单、问题、问题完成)和不同的输入处理。如果编写单独的输入处理函数,则可以在开始处理事件之前检查游戏状态,并将代码交给正确的处理程序。这可以防止单片megahandler使代码难以更新

while True:
    state = handle_events(state)

def handle_events(state):
    if state == 1:
        return handle_menu_events(state)
    elif state == 2:
        return handle_question_events(state)
    elif state == 3:
        return handle_question_over_events(state)

def handle_question_events(state):
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if RNG == 0:
                if event.key == K_b:
                    right_answer()
                else:
                    wrong_answer()
            [...]

def handle_question_over_events(state):
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_RETURN:
                random_topic_generator()

现在,您的逻辑已经足够分离,因此很难意外地将不同状态的事件处理混合在一起,就像您最初遇到的问题一样。

欢迎使用堆栈溢出!使用格式化工具使文章更具可读性。代码块应类似于代码块。如果需要,请使用粗体斜体。举例说明,用代码解释而不是理论描述。谢谢你的建议。
while True:
    state = handle_events(state)

def handle_events(state):
    if state == 1:
        return handle_menu_events(state)
    elif state == 2:
        return handle_question_events(state)
    elif state == 3:
        return handle_question_over_events(state)

def handle_question_events(state):
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if RNG == 0:
                if event.key == K_b:
                    right_answer()
                else:
                    wrong_answer()
            [...]

def handle_question_over_events(state):
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_RETURN:
                random_topic_generator()