一、项目前期准备
V4 版本在 V3'双向对抗'基础上,新增定点任务处理、鼠标交互、多线程协作、状态机管理四大核心功能。新手需在 V3 基础(集合、线程通信、扫描攻击)上,额外掌握以下知识点:
1. 鼠标事件监听(MouseListener)
- 作用:捕捉鼠标操作(点击、按压、释放等),实现'鼠标点击生成任务'的交互;
- 核心接口:
MouseListener,需重写 5 个方法(重点用 mousePressed:鼠标按压时触发);
- 关键步骤:给窗口注册鼠标监听器→重写
mousePressed 方法→获取鼠标点击坐标。
2. 距离计算(勾股定理)
- 作用:找到'离任务点最近的无人机',实现任务分配逻辑;
代码实现:
(int) Math.sqrt((t.x - d.x)*(t.x - d.x) + (t.y - d.y)*(t.y - d.y));
公式:两点(无人机坐标 (x1,y1)、任务坐标 (x2,y2))距离 dis =

3. 多线程协作
- 新增
TaskProThread(任务处理线程),与原有 DroneThread(无人机线程)协同工作;
- 核心:通过共享
droneList 和 taskList,实现'任务生成→分配→执行→完成'的闭环。
4. 状态机管理
- 无人机新增 3 种状态:
0(巡逻)、1(跟随入侵者)、2(处理任务);
- 核心:状态决定行为(如巡逻时随机运动,处理任务时飞向任务点),状态切换通过修改
state 属性实现。
5. 坐标与速度适配
- 任务点导向速度:通过计算无人机与任务点的坐标差,调整
runSpeedx 和 runSpeedy,让无人机飞向任务点。
二、项目结构解析
V4 版本的核心变化是新增'任务体系',实现'鼠标点击生成任务→系统分配给最近无人机→无人机完成任务后回归巡逻'的完整流程,同时保留 V3 的双向对抗功能,形成'任务处理 + 敌对对抗'的复合场景。
1. 项目结构分析
| 类名 | 作用 | 核心新增技术点 |
|---|
Task | 任务实体类(存储任务坐标、状态、生命值) | 任务可视化绘制、状态管理(未分配 / 已分配 / 完成) |
TaskProThread | 任务处理线程(分配任务、监控任务进度) | 距离计算、最近无人机匹配、速度调整 |
Drone | 无人机实体类(新增状态、任务相关属性) | 多状态管理、状态可视化(颜色区分)、速度适配 |
DroneListener | 监听器(新增鼠标监听,生成任务) | MouseListener、鼠标坐标获取 |
DroneThread | 核心线程(保留对抗 + 新增任务绘制) | 状态判断、任务与对抗逻辑兼容 |
DroneUI | 界面搭建(新增任务集合、鼠标监听器注册) | 多集合共享、鼠标监听器绑定 |
Intruder | 入侵者实体类(优化边界、新增生命值显示) | 边界调整、生命值可视化 |
2. 项目核心逻辑流程
- 任务生成:用户鼠标点击窗口→监听器捕捉坐标→创建 Task 对象→存入 taskList;
- 任务分配:TaskProThread 遍历 taskList→找到未分配任务→计算所有无人机到任务点的距离→分配给最近的空闲无人机(state=0)→无人机状态改为 2(处理任务);
- 任务执行:无人机线程根据 state=2→调整速度飞向任务点→到达后扣除任务生命值;
- 任务完成:任务生命值≤0→状态改为 2(已完成)→无人机状态重置为 0(巡逻);
- 并行对抗:任务执行过程中,无人机与入侵者的双向扫描攻击正常进行。
三、核心模块详细讲解
1. 新增实体类 —— Task(任务类)
Task 类是'定点任务'的载体,封装了任务的核心信息,支持可视化绘制和状态管理。
(1)关键代码解析
import java.awt.Graphics; import java.awt.Color; public class Task { int x;
(2)理解要点
- 任务状态设计:
0-1-2 的状态流转,确保任务不会重复分配,符合'生成→分配→完成'的逻辑;
- 任务生命值:blood = 10 意味着无人机需要到达任务点附近 10 次(每次扣 1 血)才能完成任务,模拟'持续处理任务'的场景;
- 可视化绘制:fillRect 绘制黑色矩形,新手能直接在窗口看到鼠标点击生成的任务点。
2. 新增线程 —— TaskProThread(任务处理线程)
这是 V4 版本的核心新增线程,负责'任务分配'和'任务进度监控',是连接'任务生成'和'无人机执行'的桥梁。
(1)关键代码解析
import java.util.ArrayList; public class TaskProThread extends Thread { ArrayList<Drone> droneList;
(2)理解要点
任务分配流程
- 遍历任务集合,筛选出'未分配'(state=0)的任务;
- 遍历无人机集合,跳过忙碌的无人机(state=1/2),计算空闲无人机到任务点的距离;
- 选中距离最近的无人机,根据坐标差调整速度方向(确保飞向任务点);
- 更新任务和无人机的状态,完成分配。
距离计算的意义
- 用勾股定理计算'直线距离',确保分配的是'最近'的无人机,符合'高效任务处理'的逻辑;
- 新手无需深入理解数学原理,直接复用
Math.sqrt 的代码即可,重点关注'距离对比'的逻辑。
速度调整逻辑
- 核心:通过
dx(x 方向差值)判断无人机在任务点的左 / 右,通过 dy 判断上 / 下;
- 示例:若
dx>0(任务点在无人机右边),则 runSpeedx=baseSpeedX(向右飞),反之向左飞,确保无人机精准飞向任务点。
3. 实体类优化 —— Drone(多状态管理)
V4 版本的 Drone 类新增了状态、任务索引、运行速度等属性,支持'巡逻→跟随→任务'的状态切换,且状态通过颜色可视化。
(1)关键代码解析
import java.awt.Graphics; import java.awt.Color; public class Drone {
(2)理解要点
状态管理与可视化:
- 状态切换:通过修改
state 属性实现(如任务分配时设为 2,任务完成后设为 0);
- 颜色区分:巡逻(红色灯)、跟随 / 任务(黄色灯),新手无需看代码,直接观察窗口即可判断无人机状态;
- 速度分离:
speedx/y 是默认速度(巡逻时用),runSpeedx/y 是实际运行速度(跟随 / 任务时动态调整),避免速度冲突。
4. 交互核心升级 —— DroneListener(新增鼠标监听)
监听器同时实现 ActionListener(按钮监听)和 MouseListener(鼠标监听),支持'生产无人机 / 入侵者'和'鼠标点击生成任务'两种交互。
(1)关键代码解析
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.Random; public class DroneListener implements ActionListener, MouseListener {
(2)理解要点
鼠标监听使用:
- 接口实现:必须同时重写
MouseListener 的 5 个方法,即使不用也不能删除(否则编译报错);
- 坐标获取:
e.getX() 和 e.getY() 获取的是鼠标在窗口内的坐标,直接用于创建任务点,精准对应点击位置;
- 注册监听:需在
DroneUI 中调用 addMouseListener(droneL),否则鼠标点击无反应。
5. 界面与线程协同 —— DroneUI(新增任务集合与线程)
DroneUI 类新增任务集合(taskList)和任务处理线程(TaskProThread),并注册鼠标监听器,是整个项目的'中枢调度中心'。
(1)关键代码解析
import javax.swing.*; import java.awt.*; import java.util.ArrayList; public class DroneUI extends JFrame {
(2)理解要点
多线程协同:
- 两个线程并行:
DroneThread 负责绘制和对抗,TaskProThread 负责任务分配,通过共享集合通信,互不干扰;
- 集合传递:必须将
taskList 传递给监听器(生成任务)、无人机线程(绘制任务)、任务线程(分配任务),否则功能失效。
6. 敌对实体类优化——Intruder(边界调整 + 生命值可视化)
V4 版本的 Intruder 类优化了边界判断,新增生命值可视化(新手能看到入侵者剩余血量)。
(1)关键代码解析
import java.awt.Graphics; import java.awt.Color; public class Intruder {
(2)理解要点
生命值可视化:
- 背景框 + 填充条:黑色边框是生命值满格的宽度(20 像素),绿色填充条长度随
blood 比例变化(如 blood=50 时,填充 10 像素);
- 数字显示:直接绘制
blood 值,新手无需计算,一眼就能看到入侵者剩余血量。
四、常见问题与注意事项(新手避坑)
1. 鼠标点击不生成任务
- 原因 1:未给窗口注册鼠标监听器(忘记
addMouseListener(droneL));
- 原因 2:
mousePressed 方法名写错(如写成 mousePress);
- 解决:检查监听器注册代码和方法名拼写,确保
MouseListener 的 5 个方法都重写。
2. 任务分配给忙碌的无人机
- 原因:任务分配时未过滤状态(
if (d.state == 1 || d.state == 2)),导致分配给正在跟随 / 处理任务的无人机;
- 解决:确保遍历无人机时,跳过
state=1 和 state=2 的无人机,只选择 state=0 的空闲无人机。
3. 无人机不飞向任务点
- 原因 1:速度调整逻辑错误(如
dx>0 时设为 -baseSpeedX,方向相反);
- 原因 2:
runSpeedx/y 未正确赋值,仍使用默认速度;
- 解决:检查速度调整代码,确保
dx>0 时 runSpeedx=baseSpeedX,dx<0 时为 -baseSpeedX。
4. 任务完成后无人机不回归巡逻
- 原因:任务生命值≤0 时,未将无人机
state 重置为 0;
- 解决:在
TaskProThread 的任务监控逻辑中,添加 d.state = 0(任务完成后重置状态)。
5. 数组下标越界(任务集合)
- 原因:任务完成后未判断
taskList 是否为空,直接调用 taskList.get(d.tindex);
- 解决:在遍历无人机处理任务前,添加
if (taskList.size() == 0) continue;,避免空集合访问。
五、拓展巩固
1. 实现补给仓功能(文档提到的电量 / 弹药补给)
- 需求:添加'补给仓'按钮,点击生成补给点,无人机靠近后恢复电量 / 弹药;
- 步骤:
- 新增
Supply 类(属性:x、y、type,方法:draw);
- 监听器添加'生成补给仓'按钮逻辑,创建
Supply 对象存入 supplyList;
- 无人机线程中,遍历
supplyList,无人机靠近补给点时,恢复电量 / 弹药;
- 补给点被使用后,从
supplyList 中移除。
2. 任务优先级设置
- 需求:给任务添加优先级(1~3 级),高优先级任务优先分配无人机;
- 思路:
Task 类新增 priority 属性(1 = 低,2 = 中,3 = 高);
- 鼠标点击时,按快捷键区分优先级(如按住 Ctrl 点击生成 3 级任务);
TaskProThread 中,先遍历高优先级任务,再处理中、低优先级。
3. 多任务并行处理
- 需求:支持同时分配多个任务,每个任务分配一个空闲无人机;
- 思路:修改
TaskProThread 的任务分配逻辑,遍历所有未分配任务,为每个任务分别匹配最近的空闲无人机(避免一个无人机同时处理多个任务)。
4. 任务超时机制
- 需求:任务生成后 30 秒未完成,自动标记为'失败'并重置;
- 思路:
Task 类新增 createTime 属性(记录生成时间),TaskProThread 中判断当前时间与 createTime 的差值,超过 30 秒则重置任务状态。
六、总结
V4 版本完成了从'单纯对抗'到'任务 + 对抗'的复合场景升级,核心收获如下:
- 交互能力升级:掌握
MouseListener 实现鼠标交互,理解'用户操作→事件触发→逻辑执行'的完整链路;
- 多线程协作:学会多个线程(无人机线程 + 任务线程)通过共享集合通信,避免线程冲突;
- 状态机思维:理解'状态决定行为'的设计模式,能通过状态切换实现复杂功能(巡逻→跟随→任务);
- 数学逻辑落地:将勾股定理等数学知识应用到距离计算中,明白'代码解决实际问题'的思路;
- 可视化优化:通过颜色、图形、数字直观展示状态和数据(如无人机状态灯、入侵者生命值),提升项目可读性。
对于 Java 开发者,V4 版本的学习重点是'模块拆分'和'逻辑协同'—— 复杂项目并非一蹴而就,而是将'任务生成''任务分配''状态管理''对抗逻辑'拆分为多个模块,每个模块负责单一功能,再通过共享数据和线程协作整合。通过本项目,你不仅巩固了多线程、集合、Swing 等基础,还培养了'需求拆解→代码实现→优化迭代'的编程思维,为后续开发更复杂的 Java 应用(如管理系统、小游戏)奠定了坚实基础。