Pygame跳过检查按键

时间:2018-06-11 01:59:26

标签: 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:
        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()

right_answer()和wrong_answer():

def right_answer():
    screen.fill((255, 255, 255))
    draw_text("You got the question right!", right_wrongFont, screen, 500, 450)


def wrong_answer():
    screen.fill((255, 255, 255))
    draw_text("You got the question wrong.", right_wrongFont, screen, 500, 450)

按返回进入下一个问题,这很好。但是,每当RNG == 0时,无论我何时在游戏中遇到问题,wrong_answer()总是在没有按键的情况下运行。如果我摆脱了其他问题并遇到了这个问题,按b不会做任何事情。

1 个答案:

答案 0 :(得分:1)

您已经在第二个代码段的第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()

现在你的逻辑分离得足以让你不小心混淆不同状态的事件处理,比如你最初的问题。