Pygame调用pygame.time.delay暂停期间的点击会在恢复后触发如何解决
问题原因
你遇到的问题本质是pygame的事件队列机制导致的:pygame.time.delay() 是阻塞执行的函数,2秒暂停期间,你点击屏幕产生的MOUSEBUTTONDOWN事件不会被实时处理,会全部暂存在pygame的事件队列里。等暂停结束、下一轮游戏启动后,新的事件循环会取出队列里暂存的点击事件执行,就出现了提前点击的位置自动落子的问题。你重置棋盘的操作不影响事件队列里的内容,所以没办法解决这个问题。
解决方法
只需要在2秒暂停结束后、进入下一轮游戏前,清空所有暂存的事件即可,同时建议你改掉递归调用main()的写法,避免玩的轮数过多导致栈溢出。
具体修改步骤:
- 在你胜负判定、平局判定的逻辑里,调用
pygame.time.delay(2000)之后,加一行pygame.event.clear()清空事件队列,参考修改后的代码:
# 平局处理逻辑 elif winner[0] == 'Tie': win_text = "It's a tie!" draw_window(game_started) draw_winner(win_text) pygame.time.delay(2000) # 新增:清空暂停期间产生的所有事件 pygame.event.clear() break # 胜负处理逻辑 if win_text != '': draw_window(game_started) try: pygame.draw.rect(WIN, RED, get_win_indicating_line(winner[1])) except TypeError: WIN.blit(get_win_indicating_line(winner[1]), (0, 0)) draw_winner(win_text) pygame.time.delay(2000) # 新增:清空暂停期间产生的所有事件 pygame.event.clear() break
额外优化建议:
你当前每轮游戏结束后直接递归调用main(),函数会不断嵌套,玩几十上百轮之后会触发栈溢出报错,可以把main里的游戏逻辑套在外层的死循环里,不要用递归的方式重启游戏。
内容的提问来源于stack exchange,提问作者299792458
相关产品推荐
相关产品推荐

