Pygame实现俄罗斯方块时循环绘制网格方块仅显示一个的问题
问题原因及修复方案
核心问题
你的代码存在两个关键问题导致仅显示一个方块:
- 循环中持续修改同一个
Rect对象的x属性,每帧结束后x值已超出屏幕范围,后续帧绘制的方块全部处于屏幕外 - 未处理行换行逻辑,所有方块被强制绘制在同一行的x方向,没有向下移动到下一行的位置
修复后的代码
修改后的game.py
import pygame # 用列表推导式简化棋盘数组创建 board_arr = [[0]*10 for _ in range(20)] def iterate_board(screen, base_rect): # 遍历行索引与对应行数据 for row_idx, row in enumerate(board_arr): current_x = base_rect.x # 遍历列索引与对应单元格数据 for col_idx, cell in enumerate(row): # 基于基准rect创建当前单元格的独立Rect,避免修改原对象 current_rect = pygame.Rect( current_x, base_rect.y + row_idx * base_rect.height, base_rect.width, base_rect.height ) pygame.draw.rect(screen, "red", current_rect) current_x += base_rect.width
修改后的main.py
import pygame import game pygame.init() screen = pygame.display.set_mode((600,600)) bg_hue = "black" run = True clock = pygame.time.Clock() # 基准方块仅作为尺寸和初始位置参考,不直接修改其属性 squ = pygame.Rect(100, 10, 20, 20) while run: for event in pygame.event.get(): if event.type == pygame.QUIT: run = False screen.fill(bg_hue) game.iterate_board(screen, squ) pygame.display.update() clock.tick(60) pygame.quit()
关键修改说明
- 独立创建Rect对象:每次循环生成新的
current_rect,基于基准rect的尺寸和行列索引计算位置,不会污染基准rect的属性 - 行列索引定位:通过
enumerate获取行、列索引,用索引计算每个方块的y坐标(纵向偏移)和x坐标(横向偏移),实现完整网格布局 - 简化数组初始化:用列表推导式快速生成20行10列的棋盘数组,代码更简洁易维护
修改后即可完整绘制出20行10列的红色网格方块。
内容的提问来源于stack exchange,提问作者pizzaman666
相关产品推荐
相关产品推荐

