效果演示

1. 简介
❝大家好,我是程序员黎明,今天我将带你们一起设计一个经典的游戏——砖块破坏者,或者说是 Breakout。这个游戏你可能见过很多不同版本,但今天我们将用 Python 的 Pygame 库来实现它。
通过这个项目,你将学到如何用 Pygame 库处理图形、键盘事件、碰撞检测等,最终构建一个可玩的游戏。让我们开始吧!
2. 游戏介绍
游戏的目标很简单:你需要控制底部的板子来反弹球,让它去破坏上方的砖块。你需要破坏所有的砖块才能获胜,但如果球掉出了屏幕,游戏就结束了。
功能点包括:
-
游戏的开始和结束界面 -
不同的砖块排列和关卡设计 -
多种难度的球速和游戏体验 -
玩家分数统计
3. 完整代码
import pygame
import sys
import random
# 初始化Pygame
pygame.init()
# 设置颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
# 屏幕尺寸
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('砖块破坏者游戏')
# 定义游戏对象
class Paddle:
def __init__(self):
self.width = 100
self.height = 10
self.color = BLUE
self.rect = pygame.Rect(SCREEN_WIDTH // 2 - self.width // 2, SCREEN_HEIGHT - 40, self.width, self.height)
self.speed = 8
def move(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and self.rect.left > 0:
self.rect.x -= self.speed
if keys[pygame.K_RIGHT] and self.rect.right < SCREEN_WIDTH:
self.rect.x += self.speed
def draw(self):
pygame.draw.rect(screen, self.color, self.rect)
class Ball:
def __init__(self):
self.radius = 10
self.color = YELLOW
self.rect = pygame.Rect(SCREEN_WIDTH // 2 - self.radius, SCREEN_HEIGHT // 2 - self.radius, self.radius * 2, self.radius * 2)
self.speed_x = random.choice([-4, 4])
self.speed_y = -4
def move(self):
self.rect.x += self.speed_x
self.rect.y += self.speed_y
# 碰到墙壁反弹
if self.rect.left <= 0 or self.rect.right >= SCREEN_WIDTH:
self.speed_x *= -1
if self.rect.top <= 0:
self.speed_y *= -1
def draw(self):
pygame.draw.circle(screen, self.color, self.rect.center, self.radius)
class Brick:
def __init__(self, x, y, width, height, color):
self.rect = pygame.Rect(x, y, width, height)
self.color = color
def draw(self):
pygame.draw.rect(screen, self.color, self.rect)
# 创建砖块
def create_bricks(rows, cols):
bricks = []
brick_width = SCREEN_WIDTH // cols
brick_height = 30
colors = [RED, GREEN, BLUE, YELLOW]
for row in range(rows):
for col in range(cols):
brick = Brick(col * brick_width, row * brick_height, brick_width, brick_height, random.choice(colors))
bricks.append(brick)
return bricks
# 显示文字
def draw_text(text, font, color, x, y):
img = font.render(text, True, color)
screen.blit(img, (x, y))
# 开始界面
def show_start_screen():
screen.fill(BLACK)
font = pygame.font.Font(None, 74)
draw_text('Brick Breaker', font, WHITE, SCREEN_WIDTH // 2 - 180, SCREEN_HEIGHT // 2 - 100)
font = pygame.font.Font(None, 36)
draw_text('Press any key to start', font, WHITE, SCREEN_WIDTH // 2 - 150, SCREEN_HEIGHT // 2 + 50)
pygame.display.flip()
wait_for_key()
# 等待玩家按键
def wait_for_key():
waiting = True
while waiting:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
waiting = False
# 游戏结束界面
def show_game_over_screen(score):
screen.fill(BLACK)
font = pygame.font.Font(None, 74)
draw_text('Game Over', font, WHITE, SCREEN_WIDTH // 2 - 150, SCREEN_HEIGHT // 2 - 100)
font = pygame.font.Font(None, 36)
draw_text(f'Final Score: {score}', font, WHITE, SCREEN_WIDTH // 2 - 100, SCREEN_HEIGHT // 2)
draw_text('Press any key to restart', font, WHITE, SCREEN_WIDTH // 2 - 150, SCREEN_HEIGHT // 2 + 50)
pygame.display.flip()
wait_for_key()
# 主游戏循环
def game_loop():
paddle = Paddle()
ball = Ball()
bricks = create_bricks(5, 10)
score = 0
font = pygame.font.Font(None, 36)
running = True
while running:
screen.fill(BLACK)
# 事件处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 板子移动
paddle.move()
# 球移动
ball.move()
# 球碰到板子反弹
if ball.rect.colliderect(paddle.rect):
ball.speed_y *= -1
# 球碰到砖块
for brick in bricks[:]:
if ball.rect.colliderect(brick.rect):
ball.speed_y *= -1
bricks.remove(brick)
score += 10
# 球掉到屏幕下方,游戏结束
if ball.rect.bottom >= SCREEN_HEIGHT:
show_game_over_screen(score)
return
# 绘制游戏对象
paddle.draw()
ball.draw()
for brick in bricks:
brick.draw()
# 显示分数
draw_text(f'Score: {score}', font, WHITE, 10, 10)
# 更新屏幕
pygame.display.flip()
# 控制帧率
pygame.time.Clock().tick(60)
# 游戏开始
show_start_screen()
# 主循环
while True:
game_loop()
4. 代码详解
4.1 游戏初始化
pygame.init()
我们首先初始化 Pygame 库,所有的 Pygame 游戏都需要在开始时执行这一行代码。
4.2 定义颜色和屏幕尺寸
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# ...
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
这里我们定义了一些常用的颜色,并设置了游戏的屏幕尺寸。
4.3 定义游戏对象
Paddle(板子)
class Paddle:
def __init__(self):
self.width = 100
self.height = 10
self.rect = pygame.Rect(SCREEN_WIDTH // 2 - self.width // 2, SCREEN_HEIGHT - 40, self.width, self.height)
self.speed = 8
板子是玩家控制的物体,我们定义了它的尺寸和移动速度。
Ball(球)
class Ball:
def __init__(self):
self.radius = 10
self.rect = pygame.Rect(SCREEN_WIDTH // 2 - self.radius, SCREEN_HEIGHT // 2 - self.radius, self.radius * 2, self.radius * 2)
self.speed_x = random.choice([-4, 4])
self.speed_y = -4
球有一个固定的半径,并且可以随机选择初始的 x 轴速度。
Brick(砖块)
class Brick:
def __init__(self, x, y, width, height, color):
self.rect = pygame.Rect(x, y, width
, height)
self.color = color
砖块的定义非常简单,它们有固定的位置和颜色。
4.4 游戏开始界面和游戏结束界面
在 show_start_screen 和 show_game_over_screen 函数中,我们分别展示了游戏的开始和结束界面。这些界面会等待玩家按下任意键来继续。
4.5 游戏主循环
def game_loop():
paddle = Paddle()
ball = Ball()
bricks = create_bricks(5, 10)
score = 0
game_loop 是游戏的核心部分,它控制了板子的移动、球的碰撞检测以及分数的更新。游戏的帧率被限制在 60 帧/秒,以确保平滑的游戏体验。
4.6 砖块生成
def create_bricks(rows, cols):
bricks = []
brick_width = SCREEN_WIDTH // cols
brick_height = 30
colors = [RED, GREEN, BLUE, YELLOW]
for row in range(rows):
for col in range(cols):
brick = Brick(col * brick_width, row * brick_height, brick_width, brick_height, random.choice(colors))
bricks.append(brick)
return bricks
这个函数生成了多行砖块,每个砖块都有随机的颜色。
4.7 碰撞检测
if ball.rect.colliderect(paddle.rect):
ball.speed_y *= -1
这里的碰撞检测让球与板子或砖块相撞时发生反弹。
5. 结尾
到这里,我们已经成功完成了一个砖块破坏者游戏的基本实现。你可以根据自己的需求进一步扩展这个游戏,例如增加关卡、提升难度,或者加入更多有趣的功能。
希望你们喜欢这个项目,也欢迎在评论区提出你们的想法和建议!我们下次再见!

