当前位置: 首页 > article >正文

Python小游戏开发:实现带道具加成的经典打砖块游戏

Python小游戏开发:实现带道具加成的经典打砖块游戏

前言

打砖块(Breakout)是一款经典的益智游戏,它简单但充满乐趣,非常适合用来学习游戏开发。本篇博客将带你用 PythonPygame 实现一款增强版的打砖块游戏,并且在原基础上加入了“道具加成”的新玩法,进一步提升游戏体验。

如果你是一名 Python 编程初学者,或者对游戏开发感兴趣,那么本篇文章会给你一些实用的参考。


游戏简介

这款打砖块游戏的主要功能包括:

  1. 基本玩法
    • 小球通过挡板反弹,击碎上方的砖块。
    • 当砖块被击中时,小球反弹,砖块消失。
    • 如果小球掉到底部,则游戏结束。
  2. 得分统计:每击碎一块砖块,玩家得分 +1。
  3. 道具加成
    • 宽挡板加成:接住道具后,挡板宽度增加,便于反弹小球。
    • 加速球加成:接住道具后,小球移动速度提升,增加挑战性。
  4. 中文显示:优化了字体设置,确保在游戏中可以正常显示中文。

准备工作

在开始之前,确保你的开发环境已安装了 Python 和 Pygame。如果没有安装 Pygame,可以运行以下命令:

pip install pygame

游戏设计与功能实现

下面我们会分模块解析游戏代码,带你逐步理解游戏的核心功能。

1. 初始化与基础设置

我们需要先设置游戏画布、颜色、字体和一些基础变量。这些是游戏的“底层结构”:

import pygame
import random

# 初始化 Pygame
pygame.init()

# 定义屏幕大小和颜色
screen_width = 800
screen_height = 600
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
blue = (0, 0, 255)
green = (0, 255, 0)
yellow = (255, 255, 0)
gray = (200, 200, 200)

# 创建屏幕
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("打砖块游戏(带道具加成)")

# 定义时钟
clock = pygame.time.Clock()

# 加载支持中文的字体
font = pygame.font.Font("C:/Windows/Fonts/simhei.ttf", 35)  # 黑体,确保中文正常显示

2. 核心元素绘制

为了方便管理,我们将游戏中的核心元素(砖块、挡板、小球、道具)封装为独立的绘制函数:

砖块
def draw_bricks(bricks):
    for brick in bricks:
        pygame.draw.rect(screen, red, brick)
挡板
def draw_paddle(paddle):
    pygame.draw.rect(screen, green, paddle)
小球
def draw_ball(ball):
    pygame.draw.circle(screen, blue, ball, 10)
道具

道具以黄色圆形的形式表现:

def draw_powerups(powerups):
    for powerup in powerups:
        pygame.draw.circle(screen, yellow, (powerup.x + powerup.width // 2, powerup.y + powerup.height // 2), 10)

3. 生成砖块与道具

砖块布局是游戏开始时生成的,而道具则在小球击碎砖块后随机生成:

砖块布局
def create_bricks(rows, cols, brick_width, brick_height, padding):
    bricks = []
    for row in range(rows):
        for col in range(cols):
            brick_x = col * (brick_width + padding) + 35
            brick_y = row * (brick_height + padding) + 50
            bricks.append(pygame.Rect(brick_x, brick_y, brick_width, brick_height))
    return bricks
道具生成

道具的生成概率设置为 20%,并且道具会沿着 Y 轴向下掉落:

def create_powerup(x, y):
    return pygame.Rect(x, y, 20, 20)

4. 游戏逻辑

小球运动与碰撞检测

小球的运动由 ball_dxball_dy 控制,我们需要判断小球是否撞到边界、挡板或砖块:

if ball_x <= 0 or ball_x >= screen_width:  # 撞墙
    ball_dx *= -1
if ball_y <= 0:  # 撞顶部
    ball_dy *= -1

if paddle.collidepoint(ball_x, ball_y):  # 撞挡板
    ball_dy *= -1

for brick in bricks[:]:
    if brick.collidepoint(ball_x, ball_y):  # 撞砖块
        bricks.remove(brick)
        ball_dy *= -1
        score += 1
道具逻辑

当道具碰到挡板时触发加成效果:

for powerup in powerups[:]:
    powerup.y += 4  # 道具向下掉落

    # 道具碰到挡板
    if paddle.colliderect(powerup):
        powerups.remove(powerup)
        if not paddle_width_increased:  # 宽挡板加成
            paddle.width += 50
            paddle_width_increased = True
        elif not ball_speed_increased:  # 加速球加成
            ball_dx *= 1.5
            ball_dy *= 1.5
            ball_speed_increased = True

5. 游戏结束与重试

当小球掉到底部时,显示“游戏结束”提示,并等待玩家退出:

if ball_y >= screen_height:
    game_over = True

# 游戏结束提示
screen.fill(black)
game_over_text = font.render("游戏结束!按任意键退出", True, white)
screen.blit(game_over_text, [screen_width // 4, screen_height // 2])
pygame.display.flip()
pygame.time.wait(2000)

# 等待退出
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT or event.type == pygame.KEYDOWN:
            pygame.quit()
            quit()

完整代码

以下是整理后的完整代码:

import pygame
import random

# 初始化 Pygame
pygame.init()

# 定义屏幕大小和颜色
screen_width = 800
screen_height = 600
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
blue = (0, 0, 255)
green = (0, 255, 0)
yellow = (255, 255, 0)
gray = (200, 200, 200)

# 创建屏幕
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("打砖块游戏(带道具加成)")

# 定义时钟
clock = pygame.time.Clock()

# 加载支持中文的字体
font = pygame.font.Font("C:/Windows/Fonts/simhei.ttf", 35)


# 绘制砖块
def draw_bricks(bricks):
    for brick in bricks:
        pygame.draw.rect(screen, red, brick)


# 绘制挡板
def draw_paddle(paddle):
    pygame.draw.rect(screen, green, paddle)


# 绘制小球
def draw_ball(ball):
    pygame.draw.circle(screen, blue, ball, 10)


# 绘制道具
def draw_powerups(powerups):
    for powerup in powerups:
        pygame.draw.circle(screen, yellow, (powerup.x + powerup.width // 2, powerup.y + powerup.height // 2), 10)


# 生成砖块布局
def create_bricks(rows, cols, brick_width, brick_height, padding):
    bricks = []
    for row in range(rows):
        for col in range(cols):
            brick_x = col * (brick_width + padding) + 35
            brick_y = row * (brick_height + padding) + 50
            bricks.append(pygame.Rect(brick_x, brick_y, brick_width, brick_height))
    return bricks


# 生成道具
def create_powerup(x, y):
    return pygame.Rect(x, y, 20, 20)


# 主游戏循环
def game_loop():
    # 挡板
    paddle = pygame.Rect(screen_width // 2 - 50, screen_height - 30, 100, 10)
    paddle_speed = 10

    # 小球
    ball_x = screen_width // 2
    ball_y = screen_height // 2
    ball_dx = random.choice([-4, 4])  # 水平方向速度
    ball_dy = -4  # 垂直方向速度

    # 砖块
    bricks = create_bricks(5, 8, 80, 20, 5)

    # 道具
    powerups = []

    # 游戏主循环
    game_over = False
    score = 0
    paddle_width_increased = False  # 标记是否触发了宽挡板加成
    ball_speed_increased = False  # 标记是否触发了加速球加成

    while not game_over:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True

        # 挡板移动(通过键盘控制)
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and paddle.left > 0:
            paddle.x -= paddle_speed
        if keys[pygame.K_RIGHT] and paddle.right < screen_width:
            paddle.x += paddle_speed

        # 更新小球位置
        ball_x += ball_dx
        ball_y += ball_dy

        # 碰撞检测
        if ball_x <= 0 or ball_x >= screen_width:  # 撞墙
            ball_dx *= -1
        if ball_y <= 0:  # 撞顶部
            ball_dy *= -1

        if paddle.collidepoint(ball_x, ball_y):  # 撞挡板
            ball_dy *= -1

        for brick in bricks[:]:
            if brick.collidepoint(ball_x, ball_y):  # 撞砖块
                bricks.remove(brick)
                ball_dy *= -1
                score += 1

                # 随机生成道具
                if random.random() < 0.2:  # 20% 概率生成道具
                    powerups.append(create_powerup(brick.x, brick.y))
                break

        # 检测小球是否掉到底部
        if ball_y >= screen_height:
            game_over = True

        # 更新道具位置
        for powerup in powerups[:]:
            powerup.y += 4  # 道具向下掉落

            # 道具碰到挡板
            if paddle.colliderect(powerup):
                powerups.remove(powerup)
                if not paddle_width_increased:  # 宽挡板加成
                    paddle.width += 50
                    paddle_width_increased = True
                elif not ball_speed_increased:  # 加速球加成
                    ball_dx *= 1.5
                    ball_dy *= 1.5
                    ball_speed_increased = True

            # 道具掉到底部
            elif powerup.y > screen_height:
                powerups.remove(powerup)

        # 绘制画面
        screen.fill(black)
        draw_bricks(bricks)
        draw_paddle(paddle)
        draw_ball((ball_x, ball_y))
        draw_powerups(powerups)

        # 显示分数
        score_text = font.render(f"得分: {score}", True, white)
        screen.blit(score_text, [10, 10])

        pygame.display.flip()
        clock.tick(60)

    # 游戏结束提示
    screen.fill(black)
    game_over_text = font.render("游戏结束!按任意键退出", True, white)
    screen.blit(game_over_text, [screen_width // 4, screen_height // 2])
    pygame.display.flip()
    pygame.time.wait(2000)

    # 等待退出
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT or event.type == pygame.KEYDOWN:
                pygame.quit()
                quit()


# 启动游戏
game_loop()


---

游戏运行效果

运行代码后,你将看到以下功能:

  1. 小球会在画布中自动运动,击中挡板后反弹。
  2. 每击碎一块砖块得分 +1。
  3. 击碎砖块后,有 20% 概率掉落道具:
    • 宽挡板加成。
    • 小球加速加成。
  4. 如果小球掉到底部,则游戏结束。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


优化方向

未来可以考虑增加以下功能:

  1. 多关卡设计:通过不同的砖块布局和难度设计多关卡。
  2. 更多道具
    • 多球模式:分裂出多个小球。
    • 护盾模式:暂时在底部增加防护墙。
  3. 音效和背景音乐:为游戏添加丰富的音效和背景音乐。

希望你喜欢这款小游戏!如果有任何问题或建议,欢迎在评论区留言讨论!🎮


http://www.kler.cn/a/448329.html

相关文章:

  • Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)
  • 深度学习的DataLoader是什么数据类型,为什么不可用来索引
  • 拆解一个微型气泵了解工作原理
  • 代码加入SFTP JAVA ---(小白篇3)
  • MobaXterm 连接不上VMware 的Ubuntu 虚拟机
  • Win10将WindowsTerminal设置默认终端并添加到右键(无法使用微软商店)
  • 【JetPack】WorkManager笔记
  • Java 集合框架中的 List、ArrayList 和 泛型 实例
  • 数据库的范式
  • 学技术学英文:java CyclicBarrier 和 CountDownLatch用法区别,举例生动看完不会忘
  • Unity中通过代码设置材质HDR颜色的方法参考
  • opencv 项目--图像匹配
  • (13)CT137A- 简易音乐盒设计
  • sentinel学习笔记4-SPI 在 Sentinel 中的应用
  • 本地电脑生成SSH公钥私钥对,用于SSH远程连接服务器
  • 【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
  • 泛型(2)
  • 开源!自制一个桌面宠物(STM32CUBEMX HAL库 PWM波 小项目)
  • 在 CUDA C/C++ 中使用共享內存
  • 路径规划之启发式算法之二十一:禁忌搜索算法(Tabu Search,TS)
  • Linux 端口操作
  • 【游戏设计原理】21 - 解谜游戏的设计
  • 【Mac】安装 PaddleOCR
  • springboot java ffmpeg 视频压缩、提取视频帧图片、获取视频分辨率
  • IntelliJ IDEA Docker集成
  • 适用于.net的操作excel的库