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

Pygame开发数独时新输入数字叠加在原有数字上的显示异常

显示异常的根本原因

问题出在Pygame的绘制机制上:Pygame 的窗口表面是保留型画布,会永久留存上一帧绘制的所有像素内容,除非你主动用纯色背景覆盖清空,否则不会自动擦除旧内容。

  • 你当前的游戏循环里,遍历棋盘绘制时,从头到尾没有给整个窗口做过背景填充,上一帧画在单元格里的旧数字像素会一直留在画布上。
  • 就算后端的二维数组已经正确把对应位置的旧值5替换成新值7,你绘制新数字时,只是把渲染好的7的surface直接叠在原来存着5的像素位置,没有把旧的5的像素盖住,自然就出现两个数字重叠显示的效果。
  • 你之前尝试的pygame.event.pump()、pygame.display.flip()、pygame.display.update()都解决不了问题:这几个函数分别负责处理系统消息队列、把当前画布的内容同步到屏幕上,本身不会帮你清除画布上的旧像素。
具体修复步骤
  • 调整游戏循环的绘制顺序:每帧在绘制棋盘内容之前,先给整个游戏窗口填充棋盘的背景色(数独棋盘一般用纯白色即可),相当于每次绘图前先把画布擦干净,从空白状态开始画当前帧的内容。
  • 优化原有代码的冗余判断:把原来两个独立的if分支改为if-else结构,减少无效判断,避免逻辑漏洞。
  • 修正坐标计算的精度隐患:把原来大宫格线计算里的浮点数除法/替换为整数除法//,避免因为坐标浮点数导致的宫格线绘制偏移问题。

修复后的核心代码参考:

while game_running:
    # 原有事件处理逻辑保持不变
    # ......code dealing with events........

    # 【核心修复】每帧先填充整个窗口为白色,清除上一帧的所有残留像素
    game_window.fill((255, 255, 255))

    for r in range(9):
        for c in range(9):
            # 绘制9x9小单元格的细边框
            sm_rect = pygame.Rect(c*sm_rect_width, r*sm_rect_height, sm_rect_width, sm_rect_height)
            pygame.draw.rect(game_window, (0,0,0), sm_rect, 1)

            # 绘制3x3大宫格的粗边框,替换为整数除法避免精度问题
            if r%3 == 0 and c%3 == 0:
                lrg_rect = pygame.Rect(c//3*lrg_rect_width, r//3*lrg_rect_height, lrg_rect_width, lrg_rect_height)
                pygame.draw.rect(game_window, (0,0,0), lrg_rect, 3)

            # 优化数字绘制逻辑,合并冗余的独立判断
            cell_value = board[r][c]
            if cell_value == 0:
                txt_surface = font.render(" ", True, pygame.Color('dodgerblue2')) 
            else:
                txt_surface = font.render(str(cell_value), True, pygame.Color('dodgerblue2')) 
            game_window.blit(txt_surface, (c*sm_rect_width+17, r*sm_rect_height+15))
       
    pygame.display.update()
修复后的预期效果

调整完绘制逻辑后,每帧都是从全白的干净画布开始绘制:先画宫格线,再根据二维数组的最新值绘制对应位置的数字,没有上一帧的旧内容残留,自然就不会出现新旧数字叠加的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 10:36:03