📈 GH Trending Explorer 🎲 Surprise me

← all repos

Windy-Field / Simplified-Plants-VS-Zombies

git clone https://github.com/Windy-Field/Simplified-Plants-VS-Zombies.git

【TODO】An simplified implementation of the classic Plants-VS-Zombies game, developed in Java language, featuring some different backgrounds (yards) and some funny game modes

—
stars, 24h
—
stars, 7 days
+132
stars, 30 days · #1,776
132
★ total
1
forks · 0 open issues

Star history starts 2026-10-20; the chart appears after the second daily snapshot.

LanguageJava
License—
Created2026-09-24 (26d ago)
Last push16d ago
Watchers2
OwnerUser

GitHub topics

Links

README excerpt
# 植物大战僵尸(Java 版)
这是一个使用 Java Swing 编写的植物大战僵尸学习项目。项目包含冒险模式、传送带关卡、坚果保龄球关卡和图形化关卡编辑器,适合学习 Java 桌面程序、游戏循环、动画播放、碰撞检测和 JSON 文件读写。
本项目代码规模较小,非常适合大一~大二阅读、参考。
**本项目仅能用于学习,禁止商用,严禁抄袭!**
作者:**Windy-Field / Octorange**
## 游戏截图
| 主菜单 | 选卡界面 |
| --- | --- |
| | |
| 经典关卡 | 传送带关卡 |
| --- | --- |
| | |
| 坚果保龄球关卡 | 关卡编辑器 |
| --- | --- |
| | |
## 当前版本
### V1.8
- 增加铲子卡槽。点击植物可以移除植物,点击空草坪格会自动收回铲子,右键可以取消操作。
- 增加橄榄球僵尸。它使用 `assets/Zombies/FootballZombie/` 下的动画,移动速度为每个固定步长 1.5 像素;缺少专属掉头动画时会使用普通僵尸动画。
- 优化窝瓜攻击。窝瓜仍在所在行的左、中、右三格内索敌,并优先锁定距离最近的僵尸;砸下时会攻击锁定目标左右各半格范围内、躯干与范围相交的僵尸。
- 清理植物和僵尸的公共逻辑,删除未使用的字段、常量和重复方法。
### V1.7
- 增加双发向日葵。每次生产阳光时会生成两颗阳光。
- 将植物的产阳光数量写入 `PlantDefinition`,并继续整理植物资料和行为代码。
### V1.6
- 增加火炬树桩、火焰豌豆和子弹转换规则。
- 普通豌豆经过火炬树桩后会变成火焰豌豆;冰豌豆经过火炬树桩后会恢复为普通豌豆。
### V1.5 及更早版本
- 增加 1x、1.5x、2x 三档战斗速度,并使用固定时间步长推进战斗。
- 增加小丑僵尸、传送带关卡、坚果保龄球关卡和图形化关卡编辑器。
- 增加开场演出、阳光收集、卡片冷却和小推车防线等基础机制。
## 运行环境
- 建议使用 Windows 系统。启动脚本使用 PowerShell,其他系统不保证能够正常运行。
- 需要 JDK 17 或更高版本。
- 项目自带 Gson 2.11.0,文件位于 `lib/gson-2.11.0.jar`,无需单独下载。
- 游戏需要仓库根目录下的 `assets/` 素材目录。
## 快速开始
请在仓库根目录中运行以下命令:
 [code] 
也可以直接使用 PowerShell:
 [code] 
脚本会自动暂存、提交、同步远程提交并推送。遇到冲突、未登录 GitHub 或远程地址不正确时会停止,不会强制覆盖远程内容。
使用 IntelliJ IDEA 时,请打开仓库根目录,并将运行配置的工作目录设置为仓库根目录。IDEA 会根据 `pom.xml` 使用 `lib/gson-2.11.0.jar`。
游戏入口是 `src/main/java/pvz/Main.java`,编辑器入口是 `src/main/java/pvz/EditorMain.java`。
## 素材目录
 [code] 
素材缺失或损坏时,请运行 `run.bat test`。自检程序会检查素材、资料表、动画和关卡文件是否能够正常使用。
## 自检程序
`run.bat test` 会在不打开游戏窗口的情况下运行 `SelfCheckTest`。它会检查以下内容:
- 界面图片、背景、植物素材和僵尸素材;
- 植物与僵尸资料表、卡片、动画和基础行为;
- 橄榄球僵尸的速度、动画和死亡流程;
- 窝瓜的索敌、锁定目标和多目标压扁范围;
- 铲子、传送带、保龄球、选卡、种植和出怪流程;
- 关卡编辑器的保存、读取和游戏侧加载;
- 游戏渲染结果和固定时间步长。
全部通过时,程序会输出 `PASS`,并把测试画面保存到 `build/`。自检会临时使用 `assets/levels/level_99.json`,使用前会检查该文件是否已经存在,结束后会删除临时文件。
## 关卡编辑器
编辑器的网格横向表示波次,纵向表示草坪的 5 行。每个格子表示某一波在某一行出现的僵尸以及出现数量。
| 操作 | 作用 |
| --- | --- |
| 将僵尸拖入格子 | 在格子中添加僵尸 |
| 点击格子 | 选中格子 |
| Ctrl + 左键 / Ctrl + 右键 | 减少 / 增加僵尸数量 |
| 滚轮 | 快速调整僵尸数量 |
| 将格子拖到其他格子 | 移动内容;目标格有内容时会交换 |
| 将格子拖出网格或按 Delete | 删除格子中的僵尸 |
| 按 R 或勾选“随机行出怪” | 让这一波的僵尸随机选择行 |
编辑器可以设置初始阳光、阳光生成间隔、出怪间隔、卡槽数量、卡池、禁用植物和必选植物。卡槽数量的范围是 1~8;禁用植物和必选植物只对正常选卡关卡生效。
点击“保存并试玩”可以在新窗口中运行当前关卡。勾选“开发者模式”后,试玩画面会显示碰撞箱、血量和场上对象数量;该设置不会写入关卡文件。
## 游戏操作
| 操作 | 作用 |
| --- | --- |
| 点击植物卡片,再点击草坪 | 种植植物 |
| 点击铲子,再点击植物 | 移除植物 |
| 点击空草坪格 | 收回铲子 |
| 鼠标右键 | 取消手中的卡片或铲子 |
| 点击右上角速度按钮 | 切换 1x、1.5x、2x 战斗速度 |
## 项目结构
 [code] 
项目遵循以下规则:
- `PlantCatalog` 和 `ZombieCatalog` 保存植物、僵尸的固定资料。品种差异应优先写入资料表,不要在多个类中重复判断名称。
- `Layout` 保存坐标、时间、血量、伤害和界面布局常量;`LevelJson` 保存关卡 JSON 的字段约定。
- `PlantActions`、`CombatSystem` 和 `LevelSystem` 分别处理植物行为、战斗过程和关卡流程。
- 新增品种时应优先复用已有的资料类和行为处理器,只有通用规则无法表达时才新增类。
## 新增植物示例
下面以新增“寒冰双发射手”为例。新增植物时,应先复用已有的植物资料和行为,再补充确实缺少的代码。
### 必做步骤
1. 将基础动画和状态动画放入 `assets/Plants/寒冰双发射手/`。
2. 将卡片图片放入 `assets/Cards/`,并让文件名与 `PlantDefinition.cardPicture` 一致。
3. 在 `world/Assets.java` 的 `loadPlants()` 中登记动画。普通动画使用 `animation()`,序列动画使用 `sequence()`,需要拉伸的动画使用 `stretchedAnimation()`。
4. 在 `plant/PlantCatalog.java` 中增加一条完整的 `PlantDefinition`,填写名称、卡片、花费、冷却、血量、睡眠状态、可被吃状态、行为类别、产阳光数量、绘制偏移、攻击动画和子弹转换资料。
5. 为植物选择已有的 `PlantAction