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

为何pygame.time.wait先于显示更新执行?15滑块游戏求助

解决15滑块游戏结束时先显示完成画面再等待关闭的问题

我来帮你搞定这个问题!你遇到的现象是因为PyGame的显示机制和pygame.time.wait()的阻塞特性导致的:当游戏结束触发game_over时,你直接调用了pygame.time.wait(5000),这会立刻阻塞整个主线程——此时最后一步的画面绘制(来自_show_board())还停在缓冲区里,没来得及刷新到屏幕上。等5秒结束后,程序马上退出,你只能短暂看到最后画面,就出现了“先暂停、再显示最后一步后关闭”的错觉。

核心解决方案

我们需要做两件事:

  • 确保最后一帧画面立刻刷新到屏幕
  • 用非阻塞的方式等待5秒,同时保持事件循环正常运行(避免程序假死,还能处理用户提前关闭窗口的操作)

修改后的代码

调整run_game()方法中game_over的处理逻辑:

def run_game(self):
    """Start the main loop for the game"""
    self._shuffle_grid()
    self._show_board()
    # 初始化时钟,用于控制帧率,减少CPU占用
    clock = pygame.time.Clock()
    game_over = False
    while True:
        change = self._check_events()
        if change:
            self._show_board()
        game_over = self.end_of_game()
        if game_over:
            # 强制刷新最后一帧画面到屏幕
            pygame.display.flip()
            # 记录等待开始的时间戳
            start_wait_time = pygame.time.get_ticks()
            # 循环等待5秒,同时处理事件
            while pygame.time.get_ticks() - start_wait_time < 5000:
                # 处理退出事件,允许用户提前关闭窗口
                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        sys.exit()
                # 控制帧率,避免循环占用过多CPU
                clock.tick(30)
            # 等待结束后退出程序
            sys.exit()

另外,请确认你的_show_board()函数末尾是否调用了pygame.display.flip()或pygame.display.update()——如果没有,一定要加上,这是将缓冲区的绘制内容同步到屏幕的关键步骤:

def _show_board(self):
    # 你的绘制逻辑(比如绘制滑块、背景等)
    # ...
    # 最后添加这行,刷新显示
    pygame.display.flip()

为什么这样有效?

  • pygame.display.flip()强制将当前缓冲区的内容显示到屏幕,确保玩家能立刻看到完成的画面
  • 用pygame.time.get_ticks()计时的循环替代pygame.time.wait(),不会阻塞主线程,同时还能处理用户的退出事件,避免程序无响应
  • clock.tick(30)控制循环每秒运行30次,减少不必要的CPU消耗

内容的提问来源于stack exchange,提问作者Ceenjay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:22:41