大数跨境
0
0

想学编程?这款砖块破坏者游戏让你轻松入门Python!

想学编程?这款砖块破坏者游戏让你轻松入门Python! 趣聊科技圈
2024-10-05
2

效果演示

1. 简介

大家好,我是程序员黎明,今天我将带你们一起设计一个经典的游戏——砖块破坏者,或者说是 Breakout。这个游戏你可能见过很多不同版本,但今天我们将用 Python 的 Pygame 库来实现它。

通过这个项目,你将学到如何用 Pygame 库处理图形、键盘事件、碰撞检测等,最终构建一个可玩的游戏。让我们开始吧!

2. 游戏介绍

游戏的目标很简单:你需要控制底部的板子来反弹球,让它去破坏上方的砖块。你需要破坏所有的砖块才能获胜,但如果球掉出了屏幕,游戏就结束了。

功能点包括

  • 游戏的开始和结束界面
  • 不同的砖块排列和关卡设计
  • 多种难度的球速和游戏体验
  • 玩家分数统计

3. 完整代码

import pygame
import sys
import random
# 初始化Pygame
pygame.init()
# 设置颜色
WHITE = (255255255)
BLACK = (000)
RED = (25500)
GREEN = (02550)
BLUE = (00255)
YELLOW = (2552550)
# 屏幕尺寸
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([-44])
        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(None74)
    draw_text('Brick Breaker', font, WHITE, SCREEN_WIDTH // 2 - 180, SCREEN_HEIGHT // 2 - 100)
    font = pygame.font.Font(None36)
    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(None74)
    draw_text('Game Over', font, WHITE, SCREEN_WIDTH // 2 - 150, SCREEN_HEIGHT // 2 - 100)
    font = pygame.font.Font(None36)
    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(510)
    score = 0
    font = pygame.font.Font(None36)

    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, 1010)
        # 更新屏幕
        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 = (255255255)
BLACK = (000)
# ...
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([-44])
        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_screenshow_game_over_screen 函数中,我们分别展示了游戏的开始和结束界面。这些界面会等待玩家按下任意键来继续。

4.5 游戏主循环

def game_loop():
    paddle = Paddle()
    ball = Ball()
    bricks = create_bricks(510)
    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. 结尾

到这里,我们已经成功完成了一个砖块破坏者游戏的基本实现。你可以根据自己的需求进一步扩展这个游戏,例如增加关卡、提升难度,或者加入更多有趣的功能。

希望你们喜欢这个项目,也欢迎在评论区提出你们的想法和建议!我们下次再见!


【声明】内容源于网络
0
0
趣聊科技圈
🧐探索科技,发现乐趣。🤩带你玩遍科技好物!
内容 511
粉丝 0
趣聊科技圈 🧐探索科技,发现乐趣。🤩带你玩遍科技好物!
总阅读748
粉丝0
内容511