You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame调用pygame.time.delay暂停期间的点击会在恢复后触发如何解决

问题原因

你遇到的问题本质是pygame的事件队列机制导致的:
pygame.time.delay() 是阻塞执行的函数,2秒暂停期间,你点击屏幕产生的MOUSEBUTTONDOWN事件不会被实时处理,会全部暂存在pygame的事件队列里。等暂停结束、下一轮游戏启动后,新的事件循环会取出队列里暂存的点击事件执行,就出现了提前点击的位置自动落子的问题。你重置棋盘的操作不影响事件队列里的内容,所以没办法解决这个问题。

解决方法

只需要在2秒暂停结束后、进入下一轮游戏前,清空所有暂存的事件即可,同时建议你改掉递归调用main()的写法,避免玩的轮数过多导致栈溢出。

具体修改步骤:

  1. 在你胜负判定、平局判定的逻辑里,调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:30:01