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 下篇预告

下一篇我们将实现:

  • ✅ 左上角文字绘制(显示敌方坦克数量)
  • ✅ 加载我方坦克
  • ✅ 坦克移动和方向切换
  • ✅ 敌方坦克随机出现

📚 参考资料


我是宇总,一个热爱编程的开发者。如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注!🎯

下一篇Python 游戏编程入门:用 Pygame 打造坦克大战(二)核心功能实现


标签:#Python #Pygame #游戏开发 #坦克大战 #编程入门

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐