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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:02:47