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
- GitHub: github.com/Windy-Field/Simplified-Plants-VS-Zombies
- Releases · Issues · Hacker News mentions
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