下面是一个专为SLG 游戏中塔防玩法设计的战斗通信协议与功能设计方案,适用于使用 TCP + Protobuf / WebSocket 的通信模式,具备实时性、扩展性和跨平台兼容性。该设计涵盖了塔防战斗的:
- 功能需求分析
- 协议设计(数据结构、通信流程)
- 关键交互指令定义
- 实现建议与可扩展项
一、塔防战斗功能目标与场景
功能目标
- 支持 PVE / PVP 模式塔防对战
- 玩家可布置防御建筑、使用技能、升级炮塔
- 敌方单位成波次入侵,AI 控制行动
- 战斗胜负判定,战报生成与同步
使用场景
模式 |
说明 |
PVE 挑战 |
怪物一波波进攻主城,玩家布置防御塔 |
PVP 攻防 |
进攻方部署怪物阵容,防守方部署塔 |
资源守卫 |
保护矿点、主城,周期刷怪塔防防守 |
二、通信架构概述
1
2
3
4
5
6
7
8
|
┌────────────┐ ┌────────────┐
│ 客户端 │◀──TCP──▶│ 战斗服务端 │
└────────────┘ └────────────┘
▲ ▲
│ │
布防请求 ▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶ 构建战斗场景
技能释放、炮塔升级 ▶▶▶▶▶▶▶▶▶▶▶▶ 行为广播
战斗结果获取 ◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀◀ 战报结算
|
三、通信协议设计
建议采用 Protobuf + TCP / WebSocket(无额外头部),封装格式为:
1
2
3
4
5
|
message TowerDefendMessage {
required uint32 cmd = 1; // 消息类型
required bytes payload = 2; // 实际数据(对应不同 cmd 类型)
optional uint64 seq_id = 3; // 可选,用于 ack、重发等
}
|
四、指令协议定义(建议使用 Protobuf)
1. 初始化战斗请求(玩家发起战斗)
1
2
3
4
5
6
7
8
9
10
11
|
message TowerInitRequest {
uint32 stage_id = 1; // 关卡ID
repeated TowerSlot towers = 2; // 玩家部署的初始塔
}
message TowerSlot {
uint32 tower_type = 1; // 炮塔类型
uint32 x = 2; // 格子坐标
uint32 y = 3;
uint32 level = 4; // 等级
}
|
2. 服务端返回战斗开始信号
1
2
3
4
5
6
|
message TowerInitResponse {
bool success = 1;
uint64 battle_id = 2;
string scene_seed = 3; // 随机种子,用于客户端模拟敌人路径
repeated MonsterWaveConfig waves = 4;
}
|
3. 客户端操作行为上报(如技能、升级)
1
2
3
4
5
6
7
|
message TowerBattleAction {
uint64 battle_id = 1;
uint32 op_type = 2; // 1=技能释放 2=塔升级 3=快速修复
uint32 x = 3;
uint32 y = 4;
uint32 tower_type = 5;
}
|
⚠️ 服务端需校验资源是否足够,否则返回失败或强制回滚。
4. 服务端广播行为/状态更新
1
2
3
4
5
|
message TowerSyncEvent {
uint64 battle_id = 1;
uint32 event_type = 2; // 1=怪物出现 2=攻击动作 3=塔升级完成
bytes event_payload = 3;
}
|
所有客户端(或观战者)都将收到广播保持同步。
5. 战斗结束通知(服务端)
1
2
3
4
5
6
7
8
9
|
message TowerBattleResult {
uint64 battle_id = 1;
bool victory = 2;
uint32 stars = 3;
uint32 duration = 4;
uint32 killed = 5;
uint32 damage_taken = 6;
repeated DropItem rewards = 7;
}
|
五、战斗流程协议时序图
1
2
3
4
5
6
7
8
9
10
11
12
|
客户端 服务端
│ │
│── TowerInitRequest ──>│ (拉取怪物波次 & 初始化)
│<── TowerInitResponse ─│
│ │
│── TowerBattleAction ─>│ (如释放技能)
│ │
│<── TowerSyncEvent ───│ (同步怪物出现/伤害等)
│<── TowerSyncEvent ───│
│ │
│ │(战斗逻辑跑完)
│<── TowerBattleResult ─│(告知胜负+奖励)
|
六、关键机制设计
1. 布塔与升级限制
- 同一坐标不可重复布塔
- 升级耗费资源,由服务端判断是否足够
- 防止作弊:一切资源变化由服务端校验
2. 波次怪物生成机制
- 使用统一随机种子,客户端自行推演轨迹
- 每波怪物出现时间点服务端广播(防断线问题)
3. 状态同步
- 服务端向每个客户端定时广播最新战斗状态
- 包括:塔状态、怪物坐标/血量、技能 CD 等
4. 战斗结果存档与战报
- 战斗日志结构存 Redis / Mongo
- 战报可供玩家分享、回放、申诉
七、扩展建议
功能 |
实现方向 |
回放机制 |
战斗记录保存 op list + scene_seed |
观战模式 |
客户端订阅同步事件流 |
PVP 模拟攻防 |
玩家配置怪物编队,攻守转换 |
自动战斗 |
设定 AI 布塔策略(预定义脚本) |
塔防迷宫生成器 |
前端拖动地形 + 校验路径合法性 |
总结
项目 |
建议 |
协议封装 |
Protobuf + 简洁 TCP 或 WebSocket |
数据同步 |
广播型同步事件(防止状态不一致) |
战斗执行权 |
服务端主控,客户端只做动画播放 |
反作弊 |
所有行为服务端校验 + 日志留存 |
可维护性 |
指令编号清晰、模块解耦,支持版本升级 |