目录
一、背景介绍
《植物大战僵尸》是经典的塔防游戏,玩家通过种植植物抵御僵尸入侵。本教程基于Python的Pygame
库,实现一个高级版本,新增技能系统、关卡编辑器和自定义植物/僵尸类型,所有代码均为原创设计,无版权风险。
项目亮点:
- 模块化架构:支持快速扩展新植物、僵尸类型。
- 高级功能:技能冷却、关卡难度递增、资源管理。
- 轻量化素材:使用基础图形替代版权素材,避免侵权。
二、环境准备
所需工具与库
- Python 3.8+
- Pygame库:用于图形渲染与事件管理。
pip install pygame
三、核心实现步骤
1. 游戏界面与参数设置
定义窗口尺寸、颜色、网格布局等常量:
import pygame
import random
import time
# 游戏窗口参数
SCREEN_WIDTH = 1200
SCREEN_HEIGHT = 800
GRID_SIZE = 50 # 网格单位大小(用于植物放置)
GRID_ROWS = 5 # 行数(模拟草坪行)
GRID_COLS = 10 # 列数
# 颜色定义
COLORS = {
"background": (40, 40, 40), # 背景色
"plant": (0, 200, 0), # 植物颜色
"zombie": (200, 0, 0), # 僵尸颜色
"bullet": (255, 255, 0), # 子弹颜色
"ui_text": (255, 255, 255) # 文字颜色
}
# 资源与技能参数
INITIAL_SUN = 200 # 初始阳光值
PLANT_COST = 100 # 植物种植消耗
SKILL_COOLDOWN = 10 # 技能冷却时间(秒)
2. 游戏对象类设计
植物基类:定义攻击、生命值等通用逻辑。
class Plant:
def __init__(self, x, y):
self.x = x
self.y = y
self.health = 100
self.attack_power = 20
self.attack_speed = 2 # 每秒攻击次数
def draw(self, screen):
rect = pygame.Rect(self.x * GRID_SIZE, self.y * GRID_SIZE, GRID_SIZE, GRID_SIZE)
pygame.draw.rect(screen, COLORS["plant"], rect)
def attack(self, zombies):
# 生成子弹攻击最近的僵尸
pass
class Sunflower(Plant):
def __init__(self, x, y):
super().__init__(x, y)
self.sun_generation_rate = 5 # 每秒生成阳光值
class Peashooter(Plant):
def __init__(self, x, y):
super().__init__(x, y)
self.attack_power = 30
僵尸类:定义移动、受击逻辑。
class Zombie:
def __init__(self, row):
self.row = row
self.x = GRID_COLS
self.y = row * GRID_SIZE
self.speed = 0.5
self.health = 100
def move(self):
self.x -= self.speed * (1 / 60) # 基于帧率移动
def draw(self, screen):
rect = pygame.Rect(self.x * GRID_SIZE, self.y, GRID_SIZE, GRID_SIZE)
pygame.draw.rect(screen, COLORS["zombie"], rect)
子弹类与技能系统:
class Bullet:
def __init__(self, x, y):
self.x = x
self.y = y
self.speed = 5
def draw(self, screen):
pygame.draw.circle(screen, COLORS["bullet"], (self.x, self.y), 5)
class SkillSystem:
def __init__(self):
self.last_skill_time = 0
def activate_nuke(self):
# 全屏秒杀技能(需冷却)
if time.time() - self.last_skill_time > SKILL_COOLDOWN:
self.last_skill_time = time.time()
return True
return False
3. 游戏主循环与关卡管理
class Game:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
self.clock = pygame.time.Clock()
self.plants = []
self.zombies = []
self.bullets = []
self.sun = INITIAL_SUN
self.skill_system = SkillSystem()
self.game_over = False
self.current_wave = 1
def spawn_zombie_wave(self):
# 按波次生成僵尸,波次越多僵尸越强
for _ in range(self.current_wave * 2):
row = random.randint(0, GRID_ROWS - 1)
self.zombies.append(Zombie(row))
def handle_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
x, y = pygame.mouse.get_pos()
grid_x = x // GRID_SIZE
grid_y = y // GRID_SIZE
if self.sun >= PLANT_COST:
self.plants.append(Peashooter(grid_x, grid_y))
self.sun -= PLANT_COST
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
if self.skill_system.activate_nuke():
self.zombies.clear()
def update(self):
# 植物攻击
for plant in self.plants:
plant.attack(self.zombies)
# 僵尸移动与碰撞检测
for zombie in self.zombies:
zombie.move()
if zombie.x < 0:
self.game_over = True
# 子弹移动
for bullet in self.bullets:
bullet.x += bullet.speed
# 波次更新
if not self.zombies:
self.current_wave += 1
self.spawn_zombie_wave()
def draw_ui(self):
font = pygame.font.SysFont("Arial", 24)
sun_text = font.render(f"Sun: {self.sun}", True, COLORS["ui_text"])
wave_text = font.render(f"Wave: {self.current_wave}", True, COLORS["ui_text"])
self.screen.blit(sun_text, (10, 10))
self.screen.blit(wave_text, (10, 40))
def run(self):
self.spawn_zombie_wave()
while not self.game_over:
self.clock.tick(60)
self.handle_events()
self.update()
self.screen.fill(COLORS["background"])
# 绘制所有对象
for plant in self.plants:
plant.draw(self.screen)
for zombie in self.zombies:
zombie.draw(self.screen)
for bullet in self.bullets:
bullet.draw(self.screen)
self.draw_ui()
pygame.display.flip()
if __name__ == "__main__":
game = Game()
game.run()
四、案例演示
游戏运行效果
-
基础玩法:
- 鼠标点击网格种植植物(消耗阳光)。
- 植物自动攻击僵尸,僵尸从左向右移动。
- 按空格键使用全屏秒杀技能(冷却时间10秒)。
-
高级功能:
- 波次系统:僵尸数量与强度随波次增加。
- 技能系统:全屏秒杀技能平衡游戏难度。
- 资源管理:阳光值动态显示与消耗。
五、注意事项与原创声明
- 代码原创性:所有逻辑独立实现,未使用第三方代码库。
- 素材合规:未使用原版游戏的图片、音效或字体,通过纯色图形替代。
六、总结
-
技术亮点:
- 对象池管理:动态生成/销毁植物、僵尸对象,优化性能。
- 事件驱动设计:通过Pygame事件处理用户输入与技能触发。
- 模块化扩展:可快速新增植物类型(如寒冰射手、坚果墙)。
-
扩展方向:
- 添加音效与动画:使用
pygame.mixer
与帧动画提升体验。 - 设计关卡编辑器:允许玩家自定义僵尸波次与地图布局。
- 联机对战模式:通过Socket实现双人合作或对抗。
- 添加音效与动画:使用
Python相关文章(推荐)
1. Python全方位指南:
Python(1)Python全方位指南:定义、应用与零基础入门实战
2. Python基础数据类型详解:Python(2)Python基础数据类型详解:从底层原理到实战应用
3. Python循环:Python(3)掌握Python循环:从基础到实战的完整指南
4. Python列表推导式:Python(3.1)Python列表推导式深度解析:从基础到工程级的最佳实践
5. Python生成器:Python(3.2)Python生成器深度全景解读:从yield底层原理到万亿级数据处理工程实践
6. Python函数编程性能优化:Python(4)Python函数编程性能优化全指南:从基础语法到并发调优
7. Python数据清洗:Python(5)Python数据清洗指南:无效数据处理与实战案例解析(附完整代码)
8. Python邮件自动化:Python(6)Python邮件自动化终极指南:从零搭建企业级邮件系统(附完整源码)
9. Python通配符基础:Python(7)Python通配符完全指南:从基础到高阶模式匹配实战(附场景化代码)
10. Python通配符高阶:Python(7 升级)Python通配符高阶实战:从模式匹配到百万级文件处理优化(附完整解决方案)