Pygame实现俄罗斯方块布局代码异常:仅显示背景无网格方块问题求助
为什么Pygame俄罗斯方块的网格方块不显示?
嘿,我来帮你排查这个问题!你说运行代码后只有矢车菊蓝色背景和正确的标题窗口,但预期的黑色网格方块完全没出现,问题主要出在这几个地方:
1. 循环范围完全写反了
你写的for x in range(settings.screen_tile_width * 50, 50)和for y in range(settings.screen_tile_height * 50, 50)彻底搞反了range的参数逻辑!Pygame里的range(start, stop)默认是从start往stop以步长1遍历,你这里start是500(10*50),stop是50,start比stop大,步长为正的话,这个循环根本不会执行,自然不会生成任何黑色方块。
2. Surface创建的参数格式错误
创建方块Surface的时候,你写的是pygame.Surface(50, 50),但Pygame要求Surface的尺寸必须是一个元组,正确写法是pygame.Surface((50, 50))。不过因为前面的循环没执行,这个错误暂时没暴露出来,一旦循环正常运行,就会直接抛出异常。
3. 循环内的绘制逻辑混乱
你在内部循环里每次都遍历整个surfers列表去blit,而且step的位置也不对,这会导致重复绘制,不仅效率极低,还会让逻辑变得一团糟。
修正后的代码
我把这些问题都修复了,你可以直接运行试试:
import settings import pygame from sys import exit pygame.init() # 预先计算窗口尺寸,避免重复计算 tile_size = 50 screen_width = settings.screen_tile_width * tile_size screen_height = settings.screen_tile_height * tile_size screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption(settings.screen_title) bg = pygame.Surface((screen_width, screen_height)) bg.fill("cornflower blue") clock = pygame.time.Clock() # 提前创建一个黑色方块Surface,不用每次循环都新建,节省资源 black_tile = pygame.Surface((tile_size, tile_size)) black_tile.fill("Black") while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() screen.blit(bg, (0, 0)) # 正确的循环逻辑:遍历每个网格的行列索引,再计算对应坐标 for col in range(settings.screen_tile_width): for row in range(settings.screen_tile_height): x = col * tile_size y = row * tile_size # 直接绘制预先创建好的黑色方块 screen.blit(black_tile, (x, y)) pygame.display.update() clock.tick(60)
修正说明
- 把循环改成遍历网格的行列索引(从0到9,对应10个格子),再通过
索引* tile尺寸计算每个方块的坐标,逻辑更清晰 - 提前创建一个黑色方块Surface,避免每次循环重复创建,节省系统资源
- 修正了Surface创建的参数格式,把
50,50改成符合要求的元组(50,50) - 去掉了冗余的
surfers列表和step变量,直接在循环里绘制每个方块,代码更简洁易懂
内容的提问来源于stack exchange,提问作者AdamGewely
相关产品推荐
相关产品推荐

