Python开发Picross时嵌套循环仅渲染网格首行及pygame窗口闪烁问题
问题修复方案
1. 仅第一行染色异常修复
问题原因:colorSquares函数中,每完成一行的绘制后,没有重置横坐标draw_x的初始值,导致第二行及后续的方块都绘制到了窗口可视区域外,看不到渲染效果。
修复后的colorSquares代码:
def colorSquares(): draw_y = 101 for row in player_guess: # 每开始新一行绘制时,重置横坐标到初始位置 draw_x = 101 for position in row: rect = pygame.Rect(draw_x, draw_y, 43,43) if position == 0: pygame.draw.rect(win, BLACK, rect) elif position == 1: pygame.draw.rect(win, BLUE, rect) elif position == 2: pygame.draw.rect(win, GRAY, rect) draw_x += 45 draw_y += 45
2. 窗口闪烁异常修复
问题原因:
- 绘制函数调用位置错误:
colorSquares现在放在事件遍历循环内,每处理一个事件就会触发一次绘制,冗余绘制次数过多 - 没有设置帧率限制,渲染频率不稳定,且没有统一的清屏、绘制、更新流程
- 缺失
sys库导入,退出游戏时会触发报错,也会影响渲染流程稳定性
修复步骤:
- 首行补全导入语句:
import sys - 调整主循环的绘制逻辑顺序,将
colorSquares移到事件循环外部,统一按「清屏→绘制方块→绘制网格→更新显示」的流程执行 - 增加帧率控制语句锁定60帧,避免帧率波动
修复后的主函数代码:
def main(): global win, clock, rows, columns, player_guess rows = [[randint(0,1) for i in range(10)] for x in range(10)] columns = list([x for x in y if x is not None] for y in zip_longest(*rows)) player_guess = [[0 for i in range(10)] for i in range(10)] pygame.init() win = pygame.display.set_mode((win_height,win_width)) clock = pygame.time.Clock() run = True while run: # 每一帧统一清屏 win.fill(BLACK) # 先绘制彩色方块 colorSquares() # 再绘制网格线,避免被方块覆盖 drawGrid() for event in pygame.event.get(): if event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: x,y = pygame.mouse.get_pos() if 100 < x < 550 and 100 < y < 550: row_pos = (x - 100)// 45 col_pos = (y - 100)// 45 player_guess[col_pos][row_pos] = 0 if player_guess[col_pos][row_pos] == 1 else 1 if event.button == 3: x,y = pygame.mouse.get_pos() if 100 < x < 550 and 100 < y < 550: row_pos = (x - 100)// 45 col_pos = (y - 100)// 45 player_guess[col_pos][row_pos] = 0 if player_guess[col_pos][row_pos] == 2 else 2 if event.type == pygame.QUIT: pygame.quit() sys.exit() # 统一更新显示 pygame.display.update() # 锁定60帧,避免帧率波动导致闪烁 clock.tick(60)
额外优化建议
- 避免使用全局变量:可以将
player_guess、win等参数通过传参的方式传入函数,提升代码可维护性 - 抽离常量:把网格起始坐标、方块大小、行列数这些固定值定义为常量,后续修改更方便
- 增加胜利判断逻辑:对比
player_guess中标记为1的位置和答案rows的位置,完全匹配时触发胜利提示 - 绘制行/列提示数字:在网格的上方和左侧绘制每一行、每一列需要填充的方块数量提示,符合Picross的标准玩法
内容的提问来源于stack exchange,提问作者Lane.Burk
相关产品推荐
相关产品推荐

