> **GESP等级：二级 | 考级考点：GESP Python 二级**

# 弹球大作战 (Pinball Breakout)

完整弹球游戏项目，采用 **OOP（面向对象编程）** 设计 | Python + Pygame

## 三层功能

| 层级 | 功能 | 说明 |
|------|------|------|
| ⭐ | 基础模式 | 完整打砖块游戏：物理碰撞、计分系统、生命值、关卡管理 |
| ⭐⭐ | 自定义模式 | 包含基础模式全部功能 + 实时调整颜色/速度/挡板/背景 |
| ⭐⭐⭐ | 扩展模式 | 包含前两级全部功能 + 道具系统/特殊砖块/粒子特效/连击/最高分 |

## 项目结构

```
第21节_弹球大作战/
├── main.py        # 主入口 - 菜单界面 + 层级/难度选择
├── game.py        # Game类 + Brick类 + Particle类 + PowerUp类
├── ball.py        # Ball类 - 球体物理/碰撞/渲染
├── README.md      # 本文档
└── highscore.json  # 最高分存档（自动生成）
```

## 快速开始

```bash
# 安装依赖
pip install pygame

# 启动游戏
python main.py
```

## 操作说明

### 菜单界面
| 按键 | 功能 |
|------|------|
| ↑ ↓ | 选择功能层级 |
| ← → | 切换难度 |
| 鼠标点击 | 直接选择层级/点击开始 |
| Enter/Space | 开始游戏 |
| ESC | 退出 |

### 游戏中

#### 通用控制
| 按键 | 功能 |
|------|------|
| 鼠标移动 | 控制挡板位置 |
| ← → / A D | 键盘控制挡板 |
| Space | 发射球 |
| ESC | 暂停/继续 |
| F1 | 打开/关闭设置面板 |
| R | 重新开始（游戏结束或过关时） |

#### 二级功能 (⭐⭐)
| 按键 | 功能 |
|------|------|
| C | 循环切换球颜色 |
| V | 循环切换背景色 |
| + / = | 增加球速度 |
| - | 减少球速度 |
| [ | 缩小挡板 |
| ] | 放大挡板 |

#### 三级功能 (⭐⭐⭐)
| 按键 | 功能 |
|------|------|
| T | 开关球的轨迹特效 |
| G | 开关球的发光特效 |

## 游戏机制

### 物理系统
- 球与挡板碰撞角度由碰撞位置决定（边缘大角度，中心垂直）
- 砖块碰撞采用最小重叠向量法精确判断碰撞方向
- 球速恒定（仅改变方向），确保游戏体验一致

### 砖块类型（三级功能）
| 类型 | 外观 | 属性 |
|------|------|------|
| 普通 | 彩色 | 1次击碎，按行计分（10-60分） |
| 坚硬 | 银色 | 需要2次击碎，100分 |
| 不可摧毁 | 灰色带X | 无法击碎 |

### 道具系统（三级功能）
砖块被击碎时有 15% 概率掉落道具：

| 道具 | 效果 | 颜色 |
|------|------|------|
| W | 挡板变宽（10秒） | 蓝色 |
| M | 分身球（最多5个） | 紫色 |
| S | 减速（8秒） | 绿色 |
| +1 | 增加一条命 | 红色 |

### 连击系统
- 1秒内连续击碎砖块触发连击
- 连击数作为分数倍率：得分 = 砖块分值 x 连击数
- 最高连击在游戏中记录

## 类设计

### `Ball` (ball.py)
```
Ball
├── 属性: x, y, vx, vy, radius, color, base_speed, active, trail, glow
├── 方法: move(), draw(), bounce_wall(), bounce_paddle(), bounce_brick()
├── 方法: set_speed(), set_color(), cycle_color(), reset(), clone()
└── 常量: COLORS（10种预置颜色）
```

### `Brick` (game.py)
```
Brick
├── 属性: rect, color, hp, points, type, destroyed
├── 方法: hit(), update(), draw()
└── 类型: normal / hard / unbreakable
```

### `PowerUp` (game.py)
```
PowerUp
├── 属性: rect, type, color, speed, active
├── 方法: update(), draw(), apply()
└── 类型: wide / multi / slow / life
```

### `Particle` (game.py)
```
Particle
├── 属性: x, y, vx, vy, color, life, size
├── 方法: update(), draw()
└── 重力衰减特效
```

### `Game` (game.py)
```
Game
├── 属性: screen, clock, balls, bricks, paddle, score, lives, tier
├── 方法: run(), _handle_events(), _update(), _draw()
├── 方法: _on_brick_destroyed(), _on_ball_lost(), _reset_game()
└── 层次: 三级功能按 tier 条件分支
```

## 难度预设

| 难度 | 球速 | 挡板宽度 | 砖块行数 |
|------|------|----------|----------|
| 简单 | 4 | 120 | 4 |
| 普通 | 5 | 100 | 5 |
| 困难 | 7 | 80 | 6 |

## 扩展建议

- 增加更多道具类型（穿透球、火焰球等）
- 增加关卡设计（不同砖块布局）
- 增加排行榜系统
- 增加游戏暂停菜单
- 增加音效和背景音乐
- 支持手柄控制

## 兼容性

- 操作系统: Windows / macOS / Linux
- Python: 3.8+
- 依赖: pygame 2.0+
