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
相关产品推荐
相关产品推荐

