跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

Java 面向对象实现植物大战僵尸简易版

使用 Java 面向对象思想开发简易版植物大战僵尸,设计植物、僵尸、子弹父类及射击、奖励接口,利用集合管理游戏对象状态。实现滚轮机植物选择、僵尸随机生成与移动、碰撞检测、攻击判定及背景音乐播放等功能。探讨代码优化方案,如策略模式替代 Lambda 表达式、虚拟布尔集合优化草地放置等,并提供源码链接供参考学习。

城市逃兵发布于 2025/2/6更新于 2026/10/25104 浏览
Java 面向对象实现植物大战僵尸简易版

Java 面向对象实现植物大战僵尸简易版

前言

本文基于 Java 基础与面向对象编程(OOP)思想,结合集合、多线程等 API,从零开始实现了一个简易版的植物大战僵尸游戏。项目历时约两周完成,旨在通过实战巩固 OOP 核心概念,包括继承、接口、多态及数据结构的选择。文章将详细解析游戏设计思路、核心代码实现及后续优化方案。

游戏设计

游戏核心模式参考了原版中的随机生成关卡:屏幕上方设有滚轮机随机生成植物卡牌,玩家点击选中后可放置于草坪指定位置;右侧则按概率生成不同属性的僵尸。为提升交互体验,实现了鼠标移出屏幕暂停功能,并设计了完整的对象生命周期管理。

暂停机制实现

最简单的暂停方式是监听鼠标是否离开游戏窗口。需引入 MouseMotionListener 事件监听器。

public void mouseMoved(MouseEvent e) {
    // 当游戏处于运行状态时
    if (status == START) {
        int x = e.getX();
        int y = e.getY();
        // 如果鼠标超出了游戏界面
        if (x > Game.WIDTH || y > Game.HEIGHT) {
            status = PAUSE;
        }
    }
}

此外,也可使用键盘监听器(如按下 ESC 键)来触发暂停,原理类似但用户体验更佳。

游戏对象设计

采用面向对象思想,将游戏中的实体抽象为类。主要包含三大父类:植物(Plant)、僵尸(Zombie)、子弹(Bullet)。

继承体系

父类封装共有属性与方法,子类继承并扩展特定行为。例如僵尸父类定义了移动、血量、坐标等通用属性。

public abstract class Zombie {
    protected int width;
    protected int height;
    protected int live;
    protected int x, y;
    
    // 状态定义
    public static final int LIFE = ;   
          ; 
          ;   
        LIFE;
    
    
       ;
}
0
// 存活/移动
public
static
final
int
ATTACK
=
1
// 攻击
public
static
final
int
DEAD
=
2
// 死亡
protected
int
state
=
// 抽象方法:不同僵尸移动方式不同
public
abstract
void
step
()

同理,植物和子弹也遵循此结构。对于部分子类共有的行为(如射击),使用接口进行解耦。

public interface Shoot {
    Bullet[] shoot();
}

游戏内容实现

对象管理与集合选择

游戏对象数量动态变化,推荐使用 ArrayList 而非数组,以便高效处理增删操作。

僵尸生成逻辑

通过随机数控制不同类型僵尸的出现概率。

private List<Zombie> zombies = new ArrayList<>();

public Zombie nextOneZombie() {
    Random rand = new Random();
    int type = rand.nextInt(20);
    if (type < 5) return new Zombie0();
    else if (type < 10) return new Zombie1();
    else if (type < 15) return new Zombie2();
    else return new Zombie3();
}
入场间隔控制

利用定时器或计数器控制对象生成的频率,避免瞬间生成过多对象导致性能问题。

int zombieEnterTime = 0;
public void zombieEnterAction() {
    zombieEnterTime++;
    if (zombieEnterTime % 300 == 0) {
        zombies.add(nextOneZombie());
    }
}

植物滚轮机设计

为解决植物在滚轮机上追击与停止的逻辑冲突,将植物分为两个集合:滚轮机上的植物(plants)和战场上的植物(plantsLife)。

// 滚轮机上的植物
private List<Plant> plants = new ArrayList<>();
// 战场上的植物
private List<Plant> plantsLife = new ArrayList<>();
碰撞检测与状态流转

遍历滚轮机集合,判断相邻植物的 Y 轴距离。若发生重叠,后一个植物进入停止状态;若间距足够,则继续等待。

public void plantBangAction() {
    for (int i = 1; i < plants.size(); i++) {
        Plant current = plants.get(i);
        Plant prev = plants.get(i - 1);
        
        // 检查是否碰撞
        if (current.isStop() && prev.isStop()) {
            if (current.getY() <= prev.getY() + prev.getHeight()) {
                current.goStop();
            } else {
                current.goWait();
            }
        }
    }
}

游戏循环与移动

父类中定义的 step() 方法在子类中重写,实现不同的移动逻辑。主循环中遍历集合调用该方法。

public void zombieStepAction() {
    if (zombieStepTime++ % 3 == 0) {
        for (Zombie z : zombies) {
            if (z.isLife()) {
                z.step();
            }
        }
    }
}

使用 Lambda 表达式可简化集合遍历与过滤操作,提高代码可读性。

bullets.forEach(b -> b.step());

攻击判定

通过坐标矩形相交检测(AABB)判断僵尸是否接触到植物。

public boolean zombieHit(Plant p) {
    int x1 = this.x - p.getWidth();
    int x2 = this.x + this.width;
    int y1 = this.y - p.getHeight();
    int y2 = this.y + this.height;
    int px = p.getX();
    int py = p.getY();
    return px >= x1 && px <= x2 && py >= y1 && py <= y2;
}

游戏优化方案

1. 草地放置限制

原设计使用 empty 和 hold 状态,优化后可直接使用布尔值标记格子是否被占用,减少状态枚举的复杂度。

2. 移除植物功能

新增铲子对象(Shovel),当铲子与植物坐标重合且处于激活状态时,从集合中移除植物。

public void shovelEnterAction() {
    if (shovels.isEmpty()) {
        shovels.add(new Shovel());
    }
}

需注意边界情况,如场上无植物时铲子应自动失效。

3. 奖励机制

通过接口 Award 定义特殊僵尸的击杀效果(如全屏静止、清除所有僵尸)。

public interface Award {
    int getAwardType();
    int CLEAR = 0;
    int STOP = 1;
}

4. 背景音乐播放

使用独立线程加载 WAV 格式音频文件,避免阻塞主游戏线程。

Runnable r = () -> {
    // 音频解码与播放逻辑
};
new Thread(r).start();

后续优化方向

  1. 植物合成系统:如玉米加农炮需要多个小玉米合成。建议维护一个待合成植物集合,通过坐标判断满足条件时合并。
  2. 动作类僵尸:增加撑杆跳、跳舞僵尸等特殊状态机,处理跳跃、眩晕等复杂逻辑。
  3. 植物智能攻击:植物仅在视野范围内有僵尸时才发射子弹,节省资源。
  4. 配置化参数:将血量、速度、冷却时间等写入配置文件,便于调整数值平衡。

总结

本案例完整展示了 Java 面向对象在游戏开发中的应用。通过合理设计类层次结构、利用集合管理动态数据、运用接口解耦行为,构建了一个可扩展的游戏框架。学习过程中遇到的难点主要集中在状态管理、碰撞检测及多线程资源调度上。希望读者能通过源码实践,深入理解 OOP 核心思想。

源码获取

项目源码已托管至 GitHub,欢迎查阅与改进。 https://github.com/llx330441824/plant_vs_zombie_simple.git

目录

  1. Java 面向对象实现植物大战僵尸简易版
  2. 前言
  3. 游戏设计
  4. 暂停机制实现
  5. 游戏对象设计
  6. 继承体系
  7. 游戏内容实现
  8. 对象管理与集合选择
  9. 僵尸生成逻辑
  10. 入场间隔控制
  11. 植物滚轮机设计
  12. 碰撞检测与状态流转
  13. 游戏循环与移动
  14. 攻击判定
  15. 游戏优化方案
  16. 1. 草地放置限制
  17. 2. 移除植物功能
  18. 3. 奖励机制
  19. 4. 背景音乐播放
  20. 后续优化方向
  21. 总结
  22. 源码获取

更多推荐文章

查看全部
  • AI 智能客服系统构建方案:选型指南与实战避坑
  • 大模型技术:检索增强生成 RAG 详解
  • 飞书机器人与 Claude Code 交互:从手机指令到 AI 处理的全自动流程
  • 无人机法律法规全体系梳理
  • GitHub 学生认证与 PyCharm 配置 Copilot 全流程指南
  • LLaMA Factory 大模型微调实战指南
  • Python 库 adarsha-pdf 语法、参数及实际案例
  • 爬虫与大模型结合实践:从基础提取到框架应用
  • 国内大型语言模型研发进展与突破性应用
  • JVM 垃圾回收核心:根可达性、三色标记与 CMS/G1 对比
  • 图论入门:基本概念与代码实现(邻接矩阵、邻接表、DFS/BFS)
  • 自然语言处理在医疗健康领域的应用与实战
  • C 语言数据结构与算法基础:文件操作、排序查找及链表简介
  • GitNexus 技术解析:基于知识图谱的代码库分析工具
  • Python 面试高频题:从可变对象到垃圾回收机制
  • 利用 ChatGPT 提示词定制个性化学习计划指南
  • OpenClaw 浏览器控制方案:利用 Chrome Debug 模式实现全自动控制
  • 大模型微调七步法:构建垂直领域专用模型
  • AI 产品经理面试核心考点与实战指南
  • 2025 年免费数字人工具评测:五大 AI 平台对比

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online