Skip to content

Clyanser/plane_war

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation


🛩️ Plane War 在线双人飞机大战

项目简介

Plane War 是一个 基于 WebSocket 的在线双人实时对战飞机大战游戏,支持玩家匹配、房间战斗、飞机移动与射击、血量和胜负判定等核心玩法。项目使用 Golang + Gin + WebSocket 实现后端逻辑,前端使用 HTML5 Canvas 渲染游戏场景。


功能概览

1. 玩家匹配系统

  • 双人匹配机制
  • 玩家加入匹配队列后等待对手
  • 匹配成功后自动生成房间并通知双方

2. 房间管理

  • 房间支持多玩家状态管理(当前实现双人)
  • 房间状态:等待、进行中、结束
  • 玩家离开房间或掉线时自动清理房间

3. 游戏战斗逻辑

  • 飞机移动与实时同步
  • 射击与子弹碰撞检测
  • 血量同步与死亡判定
  • 游戏胜负判定,并通知房间内玩家

4. WebSocket 消息机制

  • 客户端与服务器实时通信

  • 消息类型包括:

    • 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    # 游戏测试页面

核心模块说明

1. ws/hub.go

  • 管理所有客户端连接
  • 支持注册、注销、广播消息
  • 对房间和玩家状态进行并发安全处理

2. service/match/match.go

  • 实现简单 FIFO 匹配队列
  • 队列长度 ≥ 2 时自动创建房间
  • 返回房间对象供 Hub 调用

3. service/game/game.go

  • 房间战斗循环,每 50ms 更新子弹位置和碰撞检测
  • 检查玩家存活状态
  • 广播房间状态(飞机坐标、血量、子弹信息)
  • 游戏结束时广播胜利者信息

4. api/ws.go

  • WebSocket 升级及客户端注册
  • 接收客户端消息:匹配、移动、射击
  • 调用匹配服务与游戏循环逻辑

系统架构图(字符版)

                ┌───────────────┐
                │   玩家 Player │
                └─────┬─────────┘
                      │ WebSocket
                      ▼
                ┌───────────────┐
                │      Hub      │
                │ (客户端管理)  │
                ├───────────────┤
                │ Register/Unregister
                │ Broadcast消息
                └─────┬─────────┘
                      │
         ┌────────────┴────────────┐
         │                         │
         ▼                         ▼
┌──────────────────┐       ┌───────────────────┐
│ 匹配服务 Match    │       │ 房间 Room          │
│ (队列管理)       │       │ (Players & Bullets)│
│ AddPlayer()      │       │ 游戏状态同步        │
│ 创建房间 Room    │       │ 子弹更新 & 碰撞检测│
└─────────┬────────┘       │ 胜负判定           │
          │                 └─────────┬─────────┘
          │                           │
          │                           ▼
          │                     broadcastRoomState()
          │                           │
          └───────────────────────────┘

🔹 图解说明

  1. 玩家 Player

    • 通过 WebSocket 连接 Hub
    • 发送 match, move, shoot 等消息
  2. Hub

    • 管理客户端连接
    • 注册/注销玩家
    • 广播消息给房间内玩家
  3. 匹配服务 Match

    • 管理匹配队列
    • 队列 ≥ 2 时创建房间
    • 返回房间对象给 Hub
  4. 房间 Room

    • 保存玩家信息、子弹、位置、血量
    • 游戏循环定时更新子弹位置和碰撞检测
    • 胜负判定后广播给玩家
  5. 消息流

    • 玩家 → Hub → 匹配/房间 → Hub → 玩家
    • 房间状态实时同步

运行方法

  1. 克隆项目:
git clone <仓库地址>
cd game-server
  1. 安装依赖:
go mod tidy
  1. 启动服务器:
go run cmd/server/main.go
  1. 打开浏览器访问:
http://localhost:8080/static/html/test.html

开发状态

  • ✅ 双人匹配队列
  • ✅ 房间管理与生命周期
  • ✅ 飞机移动与子弹逻辑
  • ✅ 血量同步与胜负判定
  • ✅ WebSocket 实时消息广播

当前阶段尚未实现用户注册登录、积分排行榜和大厅页面,这将在后续阶段实现。


About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published