我正在尝试制作 Brick Breakout 游戏。但是,我在绘制砖块时遇到了问题。我实际上可以画出它们,但我正在寻找一种专业的方法来使用更少的代码行。 这是我的一些代码,但没用:
pygame.draw.rect(screen1, brick_colors[b], (x1, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x2, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x3, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x4, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x5, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x6, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x7, y1, 60, 12))
pygame.draw.rect(screen1, brick_colors[b], (x8, y1, 60, 12))
那么,有没有一种方法可以使用 for 循环来完成这项工作? 注意:积木应该是8行,每行8个。
使用嵌套循环:
no_of_rows = 8
no_of_cols = 8
x0, y0 = 20, 20 # just for example
dx, dy = 70, 16 # just for example
for row in range(no_of_rows):
for col in range(no_of_cols):
pygame.draw.rect(screen1, brick_colors[b], (x0 + col*dx, y0 + row*dy, 60, 12))
我建议制作一个块位置列表,并从列表中的位置绘制块矩形。如果一个方块被破坏,你所要做的就是从列表中删除该位置:
blocks = []
for row in range(no_of_rows):
for col in range(no_of_cols):
blocks.append((x0 + col*dx, y0 + row*dy))
for pos in blocks:
pygame.draw.rect(screen1, brick_colors[b], (pos[0], pos[1], 60, 12))
pygame.Rect
对象进一步改进:
blocks = []
for row in range(no_of_rows):
for col in range(no_of_cols):
rect = pygame.Rect(x0 + col*dx, y0 + row*dy, 60, 12)
blocks.append(rect )
for rect in blocks:
pygame.draw.rect(screen1, brick_colors[b], rect )
如果要在整个屏幕上绘制方格图块,请在应用程序循环之前在背景表面上绘制图块,
blit
在应用程序循环中在屏幕上绘制背景表面以获得最佳性能。
import pygame
screen = pygame.display.set_mode([500, 500])
clock = pygame.time.Clock()
background = pygame.Surface(screen.get_size())
color1 = (64, 64, 128)
color2 = (196, 128, 64)
sx, sy = 50, 50
for i in range((screen.get_width() + sx -1) // sx):
for j in range((screen.get_height() +sy - 1) // sy):
c = color1 if (i+j) % 2 == 0 else color2
pygame.draw.rect(background, c, (i*sx, j*sy, sx, sy))
run = True
while run:
clock.tick(100)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
screen.blit(background, (0, 0))
pygame.display.update()
pygame.quit()