Python 游戏编程入门:用 Pygame 打造坦克大战(一)基础框架搭建
·
Python 游戏编程入门:用 Pygame 打造坦克大战(一)基础框架搭建
摘要:本系列文章将带你从零开始,使用 Python 和 Pygame 库完整实现经典游戏——坦克大战。这是第一篇,主要讲解环境搭建、面向对象分析和项目框架搭建。
🎮 前言
小时候最痴迷的游戏是什么?对我来说,一定是红白机上的《坦克大战》(Battle City)。那个保护基地、消灭敌人、吃道具升级的像素游戏,承载了太多童年回忆。
今天,我们将用 Python 重现这款经典游戏!
本系列你将学到:
- Pygame 游戏开发基础
- 面向对象设计思想
- 游戏循环和事件处理
- 碰撞检测和精灵管理
- 完整的游戏项目开发流程
适合人群:
- 有 Python 基础,想学习游戏开发
- 想通过项目实战提升编程能力
- 对游戏开发感兴趣的初学者
一、Pygame 环境搭建
1.1 安装 Pygame
pip install pygame
1.2 验证安装
python -m pygame.examples.aliens
如果能看到一个外星人射击的小游戏窗口,说明安装成功!
1.3 Pygame 简介
Pygame 是 Python 最常用的 2D 游戏开发库,提供:
- 图形渲染(Surface、Sprite)
- 事件处理(键盘、鼠标)
- 声音播放
- 碰撞检测
- 游戏循环控制
跨平台支持:Windows、macOS、Linux
二、面向对象分析
在写代码之前,先用面向对象的思想分析游戏。
2.1 识别游戏对象
坦克大战中有哪些"角色"?
| 对象 | 说明 |
|---|---|
| 我方坦克 | 玩家控制,可移动、发射子弹 |
| 敌方坦克 | AI 控制,随机移动、发射子弹 |
| 子弹 | 从我方或敌方坦克发射 |
| 墙壁 | 普通墙(可破坏)、钢墙(不可破坏)、水(子弹可过)、草(坦克可过) |
| 基地 | 需要保护的目标 |
2.2 类结构设计
Tank (基类)
├── MyTank (我方坦克)
└── EnemyTank (敌方坦克)
Bullet (子弹类)
Wall (墙壁类)
Base (基地类)
Main (主程序类)
2.3 坦克类属性设计
class Tank:
def __init__(self, x, y):
self.x = x # 坦克 x 坐标
self.y = y # 坦克 y 坐标
self.direction = 'U' # 方向:U/D/L/R
self.speed = 3 # 移动速度
self.hp = 1 # 生命值
self.image = None # 坦克图片
self.rect = None # 坦克矩形区域
2.4 子弹类属性设计
class Bullet:
def __init__(self, x, y, direction, is_my_bullet):
self.x = x # 子弹 x 坐标
self.y = y # 子弹 y 坐标
self.direction = direction # 子弹方向
self.speed = 5 # 子弹速度
self.is_my_bullet = is_my_bullet # 是否我方子弹
self.rect = None # 子弹矩形区域
三、项目框架搭建
3.1 项目目录结构
tank_battle/
├── main.py # 主程序入口
├── tank.py # 坦克类
├── bullet.py # 子弹类
├── wall.py # 墙壁类
├── base.py # 基地类
├── images/ # 图片资源
│ ├── tank1.png
│ ├── tank2.png
│ ├── bullet.png
│ └── ...
└── sounds/ # 音效资源
├── fire.wav
└── explode.wav
3.2 主程序入口 (main.py)
import pygame
import sys
# 初始化 pygame
pygame.init()
# 设置窗口
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('坦克大战 - Python 版')
# 游戏主循环
running = True
clock = pygame.time.Clock()
while running:
# 1. 事件处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 2. 更新游戏逻辑
# TODO: 更新坦克位置、子弹位置等
# 3. 渲染绘制
screen.fill((0, 0, 0)) # 黑色背景
# TODO: 绘制坦克、子弹、墙壁等
pygame.display.flip()
# 4. 控制帧率
clock.tick(60) # 60 FPS
# 退出游戏
pygame.quit()
sys.exit()
3.3 游戏循环详解
游戏循环是游戏的核心,每一帧都执行以下步骤:
┌─────────────────┐
│ 1. 事件处理 │ ← 检测键盘、鼠标输入
├─────────────────┤
│ 2. 更新逻辑 │ ← 更新对象位置、状态
├─────────────────┤
│ 3. 渲染绘制 │ ← 绘制所有对象到屏幕
├─────────────────┤
│ 4. 帧率控制 │ ← 控制游戏速度
└─────────────────┘
↓
循环继续
四、加载主窗口
4.1 完整的主窗口代码
import pygame
import sys
class Game:
def __init__(self):
# 初始化 pygame
pygame.init()
# 窗口设置
self.SCREEN_WIDTH = 800
self.SCREEN_HEIGHT = 600
self.screen = pygame.display.set_mode((self.SCREEN_WIDTH, self.SCREEN_HEIGHT))
pygame.display.set_caption('坦克大战 - Python 版')
# 加载窗口图标
try:
icon = pygame.image.load('images/icon.png')
pygame.display.set_icon(icon)
except:
pass # 如果图片不存在,使用默认图标
# 游戏时钟
self.clock = pygame.time.Clock()
# 游戏状态
self.running = True
self.game_over = False
def run(self):
"""游戏主循环"""
while self.running:
# 控制帧率
self.clock.tick(60)
# 事件处理
self.handle_events()
# 更新逻辑
if not self.game_over:
self.update()
# 渲染绘制
self.render()
# 退出
pygame.quit()
sys.exit()
def handle_events(self):
"""处理事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
def update(self):
"""更新游戏逻辑"""
pass
def render(self):
"""渲染绘制"""
# 填充背景色
self.screen.fill((0, 0, 0))
# 更新显示
pygame.display.flip()
if __name__ == '__main__':
game = Game()
game.run()
4.2 运行效果
运行后应该看到一个 800x600 的黑色窗口,标题为"坦克大战 - Python 版"。
五、事件处理
5.1 键盘事件
def handle_events(self):
"""处理事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
# 键盘按下
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
print("向上移动")
elif event.key == pygame.K_DOWN:
print("向下移动")
elif event.key == pygame.K_LEFT:
print("向左移动")
elif event.key == pygame.K_RIGHT:
print("向右移动")
elif event.key == pygame.K_SPACE:
print("发射子弹")
# 键盘松开
elif event.type == pygame.KEYUP:
print("按键松开")
5.2 持续按键检测
上面的代码只能检测单次按键,如果想实现"按住方向键持续移动",需要用 pygame.key.get_pressed():
def handle_events(self):
"""处理事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
# 获取所有按键状态
keys = pygame.key.get_pressed()
# 持续移动
if keys[pygame.K_UP]:
self.player.move('U')
elif keys[pygame.K_DOWN]:
self.player.move('D')
elif keys[pygame.K_LEFT]:
self.player.move('L')
elif keys[pygame.K_RIGHT]:
self.player.move('R')
5.3 常用按键映射
# 方向键
pygame.K_UP # 上
pygame.K_DOWN # 下
pygame.K_LEFT # 左
pygame.K_RIGHT # 右
# 功能键
pygame.K_SPACE # 空格
pygame.K_RETURN # 回车
pygame.K_ESCAPE # ESC
# 字母键
pygame.K_a # A
pygame.K_s # S
pygame.K_d # D
pygame.K_w # W
六、第一篇总结
6.1 核心知识点
| 知识点 | 说明 |
|---|---|
| Pygame 安装 | pip install pygame |
| 窗口创建 | pygame.display.set_mode() |
| 游戏循环 | while running + 事件处理 + 更新 + 渲染 |
| 帧率控制 | pygame.time.Clock().tick(60) |
| 事件处理 | pygame.event.get() |
| 按键检测 | pygame.key.get_pressed() |
| 面向对象 | 坦克、子弹、墙壁等类设计 |
6.2 代码仓库
本系列代码已开源,欢迎 Star 和 Fork:
- GitHub: [待补充]
- Gitee: [待补充]
6.3 下篇预告
下一篇我们将实现:
- ✅ 左上角文字绘制(显示敌方坦克数量)
- ✅ 加载我方坦克
- ✅ 坦克移动和方向切换
- ✅ 敌方坦克随机出现
📚 参考资料
- Pygame 官方文档
- B 站教程:python+pygame 坦克大战
- UP 主:一只幸运猫喵
我是宇总,一个热爱编程的开发者。如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注!🎯
下一篇:Python 游戏编程入门:用 Pygame 打造坦克大战(二)核心功能实现
标签:#Python #Pygame #游戏开发 #坦克大战 #编程入门
更多推荐
所有评论(0)