Python小游戏——打砖块


文章目录

打砖块游戏项目介绍及实现

项目介绍

打砖块游戏是一款经典的街机游戏,通过控制挡板来反弹小球打碎屏幕上的砖块。该项目使用Python语言和Pygame库进行实现,旨在帮助初学者理解游戏开发的基本概念和实践。

环境配置

在开始实现打砖块游戏之前,需要进行必要的环境配置:

  1. 安装Python(推荐使用Python 3.6及以上版本)。

  2. 安装Pygame库。可以通过以下指令在命令行或Pycharm终端中安装:

    sh 复制代码
    pip install pygame
  3. 配置开发环境,推荐使用Pycharm或VSCode进行代码编写和调试。

代码设计思路

整个打砖块游戏分为以下几个部分来设计:

  1. 初始化Pygame和屏幕设置: 初始化Pygame库,设置游戏窗口的大小和标题。
  2. 定义颜色和游戏元素: 定义游戏中使用的颜色,设置砖块、挡板和小球的属性。
  3. 创建砖块: 使用双重循环生成多行多列的砖块,并根据行号设置不同颜色。
  4. 游戏主循环: 包含游戏逻辑处理、用户输入处理和屏幕刷新,保证游戏持续运行。
  5. 碰撞检测: 实现小球与墙壁、挡板和砖块的碰撞检测逻辑,并作出相应反应。

代码设计详细过程

  1. 初始化部分

    python 复制代码
    import pygame
    import random
    
    # 初始化Pygame
    pygame.init()
    # 设置屏幕尺寸
    SCREEN_WIDTH = 800
    SCREEN_HEIGHT = 600
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption("Breakout Game")
  2. 定义颜色和游戏元素

    python 复制代码
    # 颜色定义
    WHITE = (255, 255, 255)
    BLACK = (0, 0, 0)
    RED = (255, 0, 0)
    GREEN = (0, 255, 0)
    BLUE = (0, 0, 255)
    YELLOW = (255, 255, 0)
    
    # 砖块设置
    BRICK_WIDTH = 75
    BRICK_HEIGHT = 20
    BRICK_PADDING = 10
    BRICK_ROWS = 6
    BRICK_COLUMNS = 10
    
    # 挡板设置
    PADDLE_WIDTH = 100
    PADDLE_HEIGHT = 10
    PADDLE_SPEED = 6
    
    # 小球设置
    BALL_RADIUS = 10
    BALL_SPEED = 3
  3. 创建砖块

    python 复制代码
    bricks = []
    for row in range(BRICK_ROWS):
        for col in range(BRICK_COLUMNS):
            brick_x = col * (BRICK_WIDTH + BRICK_PADDING) + BRICK_PADDING
            brick_y = row * (BRICK_HEIGHT + BRICK_PADDING) + BRICK_PADDING
            if row < 2:
                color = RED
            elif row < 4:
                color = YELLOW
            elif row < 6:
                color = GREEN
            else:
                color = BLUE
            brick_rect = pygame.Rect(brick_x, brick_y, BRICK_WIDTH, BRICK_HEIGHT)
            bricks.append((brick_rect, color))
  4. 游戏主循环

    python 复制代码
    # 初始化挡板和小球
    paddle = pygame.Rect((SCREEN_WIDTH - PADDLE_WIDTH) // 2, SCREEN_HEIGHT - PADDLE_HEIGHT - 10, PADDLE_WIDTH, PADDLE_HEIGHT)
    ball = pygame.Rect(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2, BALL_RADIUS * 2, BALL_RADIUS * 2)
    ball_dx = BALL_SPEED * random.choice([-1, 1])
    ball_dy = BALL_SPEED * random.choice([-1, 1])
    
    running = True
    clock = pygame.time.Clock()
    
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
    
        # 挡板移动
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and paddle.left > 0:
            paddle.left -= PADDLE_SPEED
        if keys[pygame.K_RIGHT] and paddle.right < SCREEN_WIDTH:
            paddle.right += PADDLE_SPEED
    
        # 小球移动
        ball.x += ball_dx
        ball.y += ball_dy
    
        # 小球与墙壁碰撞检测
        if ball.left <= 0 or ball.right >= SCREEN_WIDTH:
            ball_dx = -ball_dx
        if ball.top <= 0:
            ball_dy = -ball_dy
        if ball.colliderect(paddle):
            ball_dy = -ball_dy
    
        # 小球与砖块碰撞检测
        for brick in bricks[:]:
            if ball.colliderect(brick[0]):
                bricks.remove(brick)
                ball_dy = -ball_dy
                break
    
        # 小球出界检测
        if ball.bottom >= SCREEN_HEIGHT:
            running = False
    
        # 绘制游戏元素
        screen.fill(BLACK)
        pygame.draw.rect(screen, WHITE, paddle)
        pygame.draw.ellipse(screen, WHITE, ball)
        for brick in bricks:
            pygame.draw.rect(screen, brick[1], brick[0])
    
        pygame.display.flip()
        clock.tick(60)
    
    pygame.quit()

难点分析

  1. 碰撞检测: 处理小球与砖块的碰撞检测是该项目的难点之一。需要考虑小球与砖块的不同碰撞方向,并正确反弹小球。
  2. 游戏主循环: 在游戏主循环中,既要处理用户输入,又要更新游戏状态,还要刷新屏幕显示,确保游戏流畅运行。

源代码

python 复制代码
import pygame
import random

# 初始化Pygame
pygame.init()

# 屏幕尺寸
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Breakout Game")

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)

# 砖块设置
BRICK_WIDTH = 75
BRICK_HEIGHT = 20
BRICK_PADDING = 10
BRICK_ROWS = 6
BRICK_COLUMNS = 10

# 挡板设置
PADDLE_WIDTH = 100
PADDLE_HEIGHT = 10
PADDLE_SPEED = 6

# 小球设置
BALL_RADIUS = 10
BALL_SPEED = 3  # 降低速度

# 创建砖块
bricks = []
for row in range(BRICK_ROWS):
    for col in range(BRICK_COLUMNS):
        brick_x = col * (BRICK_WIDTH + BRICK_PADDING) + BRICK_PADDING
        brick_y = row * (BRICK_HEIGHT + BRICK_PADDING) + BRICK_PADDING
        if row < 2:
            color = RED
        elif row < 4:
            color = YELLOW
        elif row < 6:
            color = GREEN
        else:
            color = BLUE
        brick_rect = pygame.Rect(brick_x, brick_y, BRICK_WIDTH, BRICK_HEIGHT)
        bricks.append((brick_rect, color))

# 挡板
paddle = pygame.Rect((SCREEN_WIDTH - PADDLE_WIDTH) // 2, SCREEN_HEIGHT - PADDLE_HEIGHT - 10, PADDLE_WIDTH, PADDLE_HEIGHT)

# 小球
ball = pygame.Rect(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2, BALL_RADIUS * 2, BALL_RADIUS * 2)
ball_dx = BALL_SPEED * random.choice([-1, 1])
ball_dy = BALL_SPEED * random.choice([-1, 1])

# 游戏循环
running = True
clock = pygame.time.Clock()

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 挡板移动
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and paddle.left > 0:
        paddle.left -= PADDLE_SPEED
    if keys[pygame.K_RIGHT] and paddle.right < SCREEN_WIDTH:
        paddle.right += PADDLE_SPEED

    # 小球移动
    ball.x += ball_dx
    ball.y += ball_dy

    # 小球与墙壁碰撞检测
    if ball.left <= 0 or ball.right >= SCREEN_WIDTH:
        ball_dx = -ball_dx
    if ball.top <= 0:
        ball_dy = -ball_dy
    if ball.colliderect(paddle):
        ball_dy = -ball_dy

    # 小球与砖块碰撞检测
    for brick in bricks[:]:
        if ball.colliderect(brick[0]):
            bricks.remove(brick)
            ball_dy = -ball_dy
            break

    # 小球出界检测
    if ball.bottom >= SCREEN_HEIGHT:
        running = False

    # 绘制游戏元素
    screen.fill(BLACK)
    pygame.draw.rect(screen, WHITE, paddle)
    pygame.draw.ellipse(screen, WHITE, ball)
    for brick in bricks:
        pygame.draw.rect(screen, brick[1], brick[0])

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

pygame.quit()

代码效果


相关推荐
Kisorge12 分钟前
【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数
c语言·开发语言
轻口味1 小时前
命名空间与模块化概述
开发语言·前端·javascript
晓纪同学2 小时前
QT-简单视觉框架代码
开发语言·qt
威桑2 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服2 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生2 小时前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb
明月看潮生2 小时前
青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
开发语言·青少年编程·编程与数学·goweb
Java Fans2 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手3 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
算法小白(真小白)3 小时前
低代码软件搭建自学第二天——构建拖拽功能
python·低代码·pyqt