Plane War 是一个 基于 WebSocket 的在线双人实时对战飞机大战游戏,支持玩家匹配、房间战斗、飞机移动与射击、血量和胜负判定等核心玩法。项目使用 Golang + Gin + WebSocket 实现后端逻辑,前端使用 HTML5 Canvas 渲染游戏场景。
- 双人匹配机制
- 玩家加入匹配队列后等待对手
- 匹配成功后自动生成房间并通知双方
- 房间支持多玩家状态管理(当前实现双人)
- 房间状态:等待、进行中、结束
- 玩家离开房间或掉线时自动清理房间
- 飞机移动与实时同步
- 射击与子弹碰撞检测
- 血量同步与死亡判定
- 游戏胜负判定,并通知房间内玩家
-
客户端与服务器实时通信
-
消息类型包括:
match:加入匹配队列move:玩家移动坐标shoot:玩家开火game_state:同步房间状态game_over:通知游戏结束及胜利者
| 模块 | 技术/库 | 说明 |
|---|---|---|
| 后端 | Golang + Gin | HTTP API + WebSocket 游戏逻辑 |
| 实时通信 | Gorilla WebSocket | 房间内实时消息广播 |
| 数据存储 | 内存(RoomMap) | 房间状态与玩家信息存储 |
| UUID | Google UUID | 玩家与房间唯一标识生成 |
| 前端 | HTML + JavaScript + Canvas | 游戏画面渲染和用户操作交互 |
game-server/
├── cmd/server/main.go # 服务器入口
├── internal/
│ ├── api/ws.go # WebSocket API 处理
│ ├── model/
│ │ ├── player.go # 玩家数据模型
│ │ └── room.go # 房间数据模型
│ ├── service/
│ │ ├── match/match.go # 匹配队列与房间生成
│ │ └── game/game.go # 游戏循环与战斗逻辑
│ └── ws/hub.go # Hub管理客户端连接与消息广播
└── static/html/test.html # 游戏测试页面
- 管理所有客户端连接
- 支持注册、注销、广播消息
- 对房间和玩家状态进行并发安全处理
- 实现简单 FIFO 匹配队列
- 队列长度 ≥ 2 时自动创建房间
- 返回房间对象供 Hub 调用
- 房间战斗循环,每 50ms 更新子弹位置和碰撞检测
- 检查玩家存活状态
- 广播房间状态(飞机坐标、血量、子弹信息)
- 游戏结束时广播胜利者信息
- WebSocket 升级及客户端注册
- 接收客户端消息:匹配、移动、射击
- 调用匹配服务与游戏循环逻辑
┌───────────────┐
│ 玩家 Player │
└─────┬─────────┘
│ WebSocket
▼
┌───────────────┐
│ Hub │
│ (客户端管理) │
├───────────────┤
│ Register/Unregister
│ Broadcast消息
└─────┬─────────┘
│
┌────────────┴────────────┐
│ │
▼ ▼
┌──────────────────┐ ┌───────────────────┐
│ 匹配服务 Match │ │ 房间 Room │
│ (队列管理) │ │ (Players & Bullets)│
│ AddPlayer() │ │ 游戏状态同步 │
│ 创建房间 Room │ │ 子弹更新 & 碰撞检测│
└─────────┬────────┘ │ 胜负判定 │
│ └─────────┬─────────┘
│ │
│ ▼
│ broadcastRoomState()
│ │
└───────────────────────────┘
-
玩家 Player
- 通过 WebSocket 连接 Hub
- 发送
match,move,shoot等消息
-
Hub
- 管理客户端连接
- 注册/注销玩家
- 广播消息给房间内玩家
-
匹配服务 Match
- 管理匹配队列
- 队列 ≥ 2 时创建房间
- 返回房间对象给 Hub
-
房间 Room
- 保存玩家信息、子弹、位置、血量
- 游戏循环定时更新子弹位置和碰撞检测
- 胜负判定后广播给玩家
-
消息流
- 玩家 → Hub → 匹配/房间 → Hub → 玩家
- 房间状态实时同步
- 克隆项目:
git clone <仓库地址>
cd game-server- 安装依赖:
go mod tidy- 启动服务器:
go run cmd/server/main.go- 打开浏览器访问:
http://localhost:8080/static/html/test.html
- ✅ 双人匹配队列
- ✅ 房间管理与生命周期
- ✅ 飞机移动与子弹逻辑
- ✅ 血量同步与胜负判定
- ✅ WebSocket 实时消息广播
当前阶段尚未实现用户注册登录、积分排行榜和大厅页面,这将在后续阶段实现。