第 17 章回答的是「当玩家不需要抢毫秒、只需要抢回合时,一致性该怎么做」。答案是把实时帧同步换成战术锁步:客户端在计划阶段离线规划,服务器在冻结瞬间一次性裁定并发冲突,再用确定性解释器产出事件日志。这一章的价值在于,它把第 16 章的关键帧与增量恢复经验迁移到回合语义上,同时第一次引入「悔棋」与「分支回放」——这两项能力只有在事件溯源架构下才成立。
本章定位
- 全集位置:第 17 章,属「实时对战进阶」层,是锁步一致性在回合制下的代表作。
- 难度梯度:进阶。核心难点不在网络时序,而在「命令的抽象层次」与「冻结瞬间的确定性裁定」。
- 前置章节:第 2 章石头剪刀布(提交窗口与时序基元)、第 14 章房间逃脱(事件溯源与快照)、第 16 章简版 MOBA(关键帧加增量恢复思路)。
- 后续衔接:第 19 章战场吃鸡复用本章的事件溯源思想,第 26 章合作解谜则把锁步用于同一帧内的多人协同触发。
核心验证目标
- 五相位回合结构:PLAN(离线规划)→ LOCK(命令缓冲区冻结)→ RESOLVE(确定性解释器结算)→ SYNC(广播事件流与回合哈希)→ CLEANUP(刷新冷却、增益与地形效果)。
- 命令缓冲区版本化:客户端提交
cmd_buf(ver=n),冻结时写入frozen_ver=n+1;计划阶段可多次覆盖以最后版本为准,LOCK 之后一律拒绝。 - 命令抽象层次:原子命令(移动、朝向、攻击、技能、守望、交互)、复合命令(路径、条件分支、序列)与应急条件(接触时停靠/闪避/交战),禁止客户端直接写入坐标与属性。
- 确定性结算:随机数来自服务器同一 RNG 种子,结算顺序固定,锁步期间不接收新命令,计划阶段的并发冲突在冻结瞬间一次裁定。
- 双层冲突裁定:合法性过滤(预算不足、目标非法、前置条件不满足直接删除并留错误事件)与竞争决胜(优先级序、敏捷值降序、单位 ID 升序、同格抢占、资源抢占锁)。
- 事件溯源衍生能力:悔棋与分支回放、断线恢复、观战与回放共享同一份事件日志,回放即重放事件流。
技术栈建议
| 层次 | 推荐选型 | 说明 |
|---|---|---|
| 服务端 | Go 优先,Java 备选 | 承载冻结、解释器与事件日志 |
| 客户端 | TypeScript 或 Unity | 计划阶段的路径与技能预览 |
| 规则共享 | 可选 WASM | 前后端共享确定性规则库 |
| 协议 | HTTP 加 WebSocket | HTTP 用于配对与断线恢复,WebSocket 用于指令与状态广播 |
| 时钟 | Tick 即回合步 | 与实时帧不同,无需高频心跳 |
本章文章
| 文章 | 核心内容 |
|---|---|
| 在线联机原型全集:第 17 章 战棋对战 | 六边格棋盘、计划-锁步-结算三阶段、命令缓冲区、冲突裁定、战争迷雾、悔棋与分支回放 |
与相邻章节的关系
- 上一章:第 16 章 简版 MOBA 提供了关键帧与一致性哈希,本章把其迁移到回合步并强化了事件溯源。
- 下一章:第 18 章 城市经营 从「回合锁步」转向「墙钟时间驱动」,用定时作业替代帧循环。
- 横向参照:第 26 章 合作解谜系统 把锁步压缩到同一逻辑帧内,是对本章模型的极限简化。