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

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库导入,退出游戏时会触发报错,也会影响渲染流程稳定性

修复步骤:

  1. 首行补全导入语句:import sys
  2. 调整主循环的绘制逻辑顺序,将colorSquares移到事件循环外部,统一按「清屏→绘制方块→绘制网格→更新显示」的流程执行
  3. 增加帧率控制语句锁定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:45:03