一个使用 Python + Pygame 编写的 2D 塔防 Demo。项目以单文件 pvz.py 为核心,完成了从菜单、难度选择、种植防守到五波结算的完整可玩流程,适合学习 Pygame 游戏循环、状态管理与基础塔防逻辑。
本项目是学习与作品集用途的非官方 Demo,不包含原版游戏资源,也不具备商业用途授权。
- 5 行草坪、阳光经济、植物卡片与卡片冷却。
- 三档难度:Easy、Normal、Hard;难度会调整僵尸数量、血量与波次间隔。
- 五波僵尸进攻:开局倒计时、波次预警、进度条,以及普通/路障/铁桶僵尸。
- 四张植物卡:
- Sunflower:定期生产阳光。
- Peashooter:发现同路前方僵尸后发射豌豆。
- Wallnut:高生命值的阻挡植物。
- Cherry Bomb:短暂预警后清除 3×3 区域内的僵尸。
- 双发射手合成:选中豌豆射手卡后点击场上的普通豌豆射手,会消耗 100 阳光并将其原地合成为双发射手。它保留已有护具,生命值在原值基础上增加 100、最高为 200,并以 0.15 秒间隔连发两颗豌豆。
- 护具掉落与装备:击败带路障或铁桶的僵尸时有概率掉落对应护具;拾取后可从顶部库存栏选中,为向日葵、豌豆射手、双发射手或坚果墙装备。护具会先吸收伤害,伤害不会溢出到植物本体。
- 每行一辆一次性小推车:僵尸进入房屋列时自动启动并清理该行僵尸。
- 铲子、右键取消选择、暂停、胜利/失败与重开流程。
- 顶部倍速按钮:可循环切换
x1.0、x1.25、x1.5、x2.0;仅游戏模拟加速,菜单与暂停保持正常速度。 - 植物、僵尸与樱桃炸弹拥有状态动画;窗口可自由缩放,画面会保持原始宽高比。
- Python 3
- Pygame 2
首次运行时,在项目根目录执行:
python -m pip install pygame
python pvz.pyWindows 用户也可以直接双击项目根目录的 启动游戏.bat。它会自动切换到脚本所在目录再启动游戏;若 Python 或 Pygame 缺失,窗口会保留错误信息,按上方命令安装后重试即可。
| 操作 | 说明 |
|---|---|
| 左键植物卡 | 选择/取消选择植物。 |
| 左键草坪空格 | 种下已选植物。 |
| 左键场上普通豌豆射手(已选豌豆卡) | 合成为双发射手。 |
| 左键阳光或掉落护具 | 收集资源或护具。 |
| 左键顶部护具库存 | 选择/取消选择护具;再点击可装备的植物即可使用。 |
| 左键铲子 | 进入/退出铲除模式;铲除模式下点击植物可移除它。 |
左键顶部 xN.N 面板 |
循环切换游戏倍速。 |
| 右键 | 取消当前植物、铲子或护具选择。 |
Esc |
暂停/继续;在难度选择界面返回菜单。 |
R |
在胜利或失败界面重新开始。 |
测试会自动使用 Pygame 的 dummy SDL 驱动,不会打开游戏窗口:
python -m unittest discover -s tests -v当前测试覆盖开局与波次计时、各难度波次数量、僵尸阻挡与豌豆目标、小推车、阳光、护具掉落与装备、双发射手合成与连发、倍速、窗口映射,以及动画资源等核心逻辑。
.
├── pvz.py # 主程序:玩法、状态、资源加载与渲染
├── 启动游戏.bat # Windows 双击启动入口
├── tests/
│ └── test_game_logic.py # 无窗口回归测试
├── assets/
│ ├── animations/ # 植物、僵尸的动画帧与 manifest
│ └── static/ # 棋盘、植物、僵尸、道具与特效贴图
├── artifacts/ # 已生成的双发射手预览图
├── DEVLOG.md # 项目开发记录与待办
└── AGENTS.md # 协作约定
- 保持单文件结构,便于阅读、演示和快速迭代。
dt驱动移动、攻击、冷却、阳光、波次与动画;倍速通过统一缩放游戏模拟时间实现。WaveManager管理五波敌人的倒计时、保底护具和难度缩放。- 路障/铁桶采用“普通僵尸或植物本体 + 独立护具”的组合模型;护具可掉落并重新装备给植物。
- 游戏以固定逻辑尺寸绘制,再按窗口大小等比映射;较大窗口会使用高分辨率渲染路径,减少放大时的锯齿。
核心玩法链路已经完整可玩,但它仍是训练 Demo,并非原版《植物大战僵尸》的完整复刻。后续可继续根据实机体验调整数值与护具落点,并扩展更多植物、僵尸和关卡内容。