一款用 Java + Processing 4 编写的本地 / 联机双人(或人机)弓箭对战小游戏。两名角色在 640×640 的竞技场内互相射箭,用短弓快速骚扰、用长弓蓄力致命一击,先击杀对手者获胜。支持通过 Relay 服务器进行互联网联机对战。
| 按键 | 功能 |
|---|---|
| ↑ ↓ ← → | 移动角色 / 蓄力长弓时调整瞄准方向 |
Z |
发射短弓箭(自动瞄准,即时射出) |
X |
蓄力长弓;松开后射出长弓箭(需蓄力约 0.5 秒) |
N |
打开联机大厅(开房 / 加入房间) |
P |
暂停 / 继续 |
| 鼠标点击 | 显示 / 隐藏操作说明窗口 |
- 短弓:即时射出,自动指向对手,速度较慢,命中后击飞对手(不致命)。
- 长弓:蓄力后射出高速分段箭矢,命中可直接击杀对手。两箭相撞均会碎裂。
- 启动后进入演示模式(双方均为 AI 对战)。
- 按
Z键开始正式对局(玩家控制白色角色,AI 控制黑色角色)。 - 任意一方被击杀后显示胜负结果,片刻后自动返回演示模式。
- 按
N键打开联机大厅,选择 Host(开房等待)或 Join(输入对方 IP 加入)。
方式一:直连(同一局域网)
- 一方按
N → H开房,记下显示的本机 IP。 - 另一方按
N → J,输入对方 IP(端口默认7777)后按 Enter。 - 连接建立后自动进入联机对战。
方式二:通过 Relay 服务器(跨网络)
- 在公网机器上启动 Relay 服务:
java -jar server/build/libs/dual-server-1.0-all.jar [port] # 默认端口 7777 - 双方均按
N → J,输入 Relay 服务器的公网 IP 与端口,依次连接即可配对。
./gradlew :server:fatJar
# 输出:server/build/libs/dual-server-1.0-all.jarRelay 服务器无图形界面,不依赖 Processing,可部署到任意 JDK 21+ 环境。
| 依赖 | 版本 |
|---|---|
| JDK | 21(推荐 Oracle JDK 21) |
| Gradle | 无需手动安装,使用内置 Wrapper |
关于 JDK 路径:
gradle.properties中的org.gradle.java.installations.paths指向本机 JDK 21 安装路径。 换台机器时,请将该路径改为实际路径,或删除该行并将JAVA_HOME环境变量指向 JDK 21。
# 直接运行游戏(开发调试)
./gradlew run
# 构建 Relay 服务器 fat JAR
./gradlew :server:fatJar
# 启动 Relay 服务器
java -jar server/build/libs/dual-server-1.0-all.jar [port]
# 打包为 Windows 安装包(.exe,需要 WiX 3.x)
./gradlew packageApp安装包输出到 build/dist/ 目录。
# 编译并运行测试
./gradlew build
# 仅运行测试
./gradlew test
# 清理构建产物
./gradlew cleansrc/main/java/com/likanug/dual/
├── App.java # Processing 入口,键盘事件 / 联机大厅 UI
├── GameConstants.java # 所有游戏数值常量
├── actor/ # 角色与箭矢实体
│ ├── ActorGroup.java # 一方阵营(玩家 + 箭矢列表)
│ ├── actor/
│ │ └── player/ # 玩家角色(PlayerActor, NullPlayerActor)
│ └── arrow/ # 箭矢(短弓箭、长弓箭各组件)
├── game/
│ ├── GameSystem.java # 游戏主循环、屏幕震动、粒子生成
│ └── GameBackground.java # 背景线条渲染
├── inputDevice/ # 输入设备抽象(KeyInput, InputDevice)
├── network/ # 联机网络层
│ ├── NetworkMessage.java # 协议编解码
│ ├── GameNetwork.java # P2P 网络基类(发送 / 接收输入)
│ ├── NetworkServer.java # Host 模式(监听连接)
│ └── NetworkClient.java # Join 模式(连接到 Host)
├── particle/ # 粒子系统(对象池复用)
├── playerEngine/ # 玩家行为引擎(人类 / AI / 网络)
│ ├── NetworkPlayerEngine.java# 联机远端玩家驱动
│ └── *PlayerPlan.java # AI 决策计划(移动、点射、蓄力击杀)
├── pool/ # 泛型对象池(ObjectPool, Poolable)
└── state/ # 状态机
├── GameSystemState.java # 游戏系统状态基类
├── StartGameState.java # 开始/倒计时状态
├── PlayGameState.java # 对战状态(碰撞检测、胜负判定)
├── GameResultState.java # 结果展示状态
└── *PlayerActorState.java # 玩家状态(移动、拉弓、受伤)
server/src/main/java/com/likanug/dual/server/
├── ServerApp.java # Relay 服务器入口
├── RelayServer.java # TCP accept 循环,多房间管理
├── RelayRoom.java # 单个房间:握手 + 双向消息转发
└── NetworkProtocol.java # 服务端协议常量- Processing 4.5.0:渲染与窗口管理
- Guava 32:工具库
- JUnit 5:单元测试
- jpackage + WiX 3:Windows 安装包打包
