我正在编写一个游戏,随机选择一个让玩家回答的问题。我有一个随机选择问题并显示它的功能,工作正常。这是函数中的第一个问题:
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不会做任何事情。
答案 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()
现在你的逻辑分离得足以让你不小心混淆不同状态的事件处理,比如你最初的问题。