在线联机原型全集:第 10 章 城格建造 mini-SLG(10×10 网格,5 分钟一回合)
类别:异步回合制 + 经济循环 + 战略模拟原型 目标:验证回合调度(Job Queue)、经济同步、持久化与事务、一致性结算与延迟推送。 原型代号:
proto-010-city-slg-mini依赖模块:proto-009-coop-minesweeper,proto-007-snake-battle,proto-002-rps推荐语言栈:Go / Java / Rust / TypeScript 协议栈:HTTP + WebSocket + Cron / DelayQueue
一、概述(Overview)
“城格建造 mini-SLG” 是一个模拟经营原型游戏。 每个玩家在 10×10 的网格地图上占据若干地块, 每块地可建造建筑、生产资源、升级与争夺。
它融合了回合制 + 异步调度 + 世界持久化 + 多人结算, 验证一个轻量化 SLG 的核心循环:
建造 → 产出 → 消耗 → 争夺 → 结算 → 下回合。
这一结构可以向任何城市建设、农场经营、策略对战或 MMO 经济系统扩展。
二、核心玩法与系统目标(Gameplay & Objectives)
2.1 基本玩法
- 世界地图为 10×10 网格;
- 玩家可在空地上建造建筑(如伐木场、农场、矿场);
- 每个建筑每个回合产出固定资源;
- 建筑可升级,提升产出;
- 玩家可消耗资源占领相邻地块;
- 回合长度为 5 分钟(服务器定时裁定);
- 每回合结束后统一结算并广播结果。
2.2 系统目标与验证点
| 模块 | 功能目标 | 验证重点 |
|---|---|---|
| 回合调度 | 定时结算所有玩家 | Cron / DelayQueue 任务系统 |
| 经济同步 | 建筑产出 + 资源消耗 | 一致性事务模型 |
| 地块占领 | 区域锁与冲突裁定 | 版本化地图管理 |
| 持久化 | 回合状态快照 | 数据恢复与重演 |
| 结算日志 | 战报与审计 | Deterministic Event Log |
| 离线推送 | 回合结果通知 | Webhook / Push 通知 |
三、系统架构设计(Architecture)
graph TD
A[Client] -->|建造/占地命令| B[Gateway]
B --> C[CityServer]
C --> D[JobQueue]
C --> E[EconomyEngine]
C --> F[GridManager]
C --> G[SettlementService]
C --> H[AuditLogger]
G --> I[Database Snapshot]
H --> J[Event Log]
模块说明
| 模块 | 职责 |
|---|---|
| Gateway | 负责 WebSocket 通信与心跳同步 |
| CityServer | 游戏主逻辑节点,管理房间与玩家状态 |
| JobQueue | 定时任务队列,用于回合调度 |
| EconomyEngine | 资源计算与事务处理 |
| GridManager | 地块与建筑状态维护 |
| SettlementService | 回合结算逻辑与广播 |
| AuditLogger | 战报记录与可重放事件日志 |
| Database Snapshot | Redis + PostgreSQL 状态快照 |
四、核心机制详解(Core Mechanisms)
4.1 网格模型(Grid System)
type Tile struct {
X, Y int
Owner string
Building string
Level int
Production map[string]int
UpdatedAt time.Time
}
type City struct {
ID string
Tiles [][]Tile
Resources map[string]int
Turn int
Version int
}
- 每个 Tile 是独立实体;
- 所有地块构成玩家的城市;
- 城市拥有资源储量(wood, stone, food 等);
- 每回合结算产出与消耗。
4.2 回合调度系统(Round Scheduler)
回合系统基于 DelayQueue 或 Cron:
type RoundTask struct {
CityID string
Round int
Start time.Time
End time.Time
}
执行流程:
- 回合开始:允许操作;
- 回合进行中:玩家发送建造/占领命令;
- 回合结束:结算所有操作;
- 自动生成下回合任务。
func StartRoundLoop() {
for {
task := delayQueue.Pop()
SettleRound(task.CityID, task.Round)
ScheduleNext(task.CityID, task.Round+1)
}
}
4.3 建造与占地操作(Building & Expansion)
客户端命令示例:
{
"cmd": "build",
"x": 3,
"y": 4,
"type": "farm",
"cost": {"wood":100}
}
服务端逻辑:
- 检查资源是否足够;
- 扣除资源;
- 更新 Tile 状态;
- 标记
updated_at; - 添加到“待结算操作表”。
if city.Resources["wood"] >= 100 {
city.Resources["wood"] -= 100
grid[x][y].Building = "farm"
}
4.4 经济引擎(Economy Engine)
资源结算模型:
wood_next = wood_prev + sum(farm_output) - construction_cost
事务性更新:
BEGIN;
UPDATE cities SET resources = resources + delta WHERE id=$1;
INSERT INTO logs (...);
COMMIT;
保证结算中资源一致。
4.5 结算逻辑(SettlementService)
每 5 分钟统一结算所有操作:
- 统计建筑产出;
- 执行升级/建造;
- 执行占地争夺裁定;
- 更新资源;
- 推送结果;
- 写入快照。
func SettleRound(cityID string) {
city := Load(cityID)
city.Resources = RecalculateResources(city)
SaveSnapshot(city)
BroadcastSettlement(city)
}
4.6 快照与回放(Snapshot & Replay)
每个回合生成快照文件:
{
"round": 12,
"resources": {"wood":2300,"stone":1500},
"tiles": [...],
"logs": [...],
"hash": "sha256:abc123"
}
可通过日志重演回放:
replay --city=abc --round=12
4.7 战报与审计日志(Audit & Battle Report)
- 每回合结算生成“战报”;
- 包含产出、占领、升级记录;
- 可导出 PDF / HTML;
- 审计链验证日志一致性。
{
"city":"playerA",
"round":10,
"summary":{
"buildings":3,
"new_land":1,
"production": {"wood":500,"stone":300}
},
"hash":"sha256:e82a..."
}
4.8 离线推送(Offline Notification)
当玩家不在线:
- 服务器通过 Webhook 或邮件发送回合结算摘要;
- 玩家上线后同步新回合状态。
五、状态机(Turn State Machine)
stateDiagram-v2
[*] --> Idle
Idle --> RoundStart: Cron Trigger
RoundStart --> ActionPhase: Allow Commands
ActionPhase --> Settling: Time Expired
Settling --> RoundEnd: Update + Notify
RoundEnd --> Idle: Wait Next Round
六、数据模型(Data Schema)
| 表 | 字段 | 描述 |
|---|---|---|
cities |
id, owner, resources, turn, version | 城市基础状态 |
tiles |
city_id, x, y, building, level, owner | 地块表 |
round_jobs |
city_id, round, start_at, end_at | 回合调度 |
round_logs |
city_id, round, events, hash | 战报 |
snapshots |
city_id, round, data_blob | 快照 |
七、验证指标(Metrics & KPI)
| 指标 | 目标 | 说明 |
|---|---|---|
| 回合调度延迟 | ≤2s | 定时结算精度 |
| 事务提交成功率 | 100% | 不丢单 |
| 快照恢复成功率 | ≥99% | Redis 有效性 |
| 资源同步一致率 | 100% | 无偏差 |
| 离线推送到达率 | ≥98% | Webhook 可靠性 |
| 服务器并发处理量 | ≥10k 回合/节点 | 延迟容忍性 |
八、扩展功能(Extensions)
-
战斗与攻城系统
- 玩家可攻占他人地块;
- 触发战斗结算模块。
-
联盟协作系统
- 多个城市组成联盟;
- 联盟共享资源池。
-
交易与市场
- 玩家之间可交易资源;
- 引入动态价格曲线。
-
异步任务队列
- 建筑升级耗时;
- DelayQueue 触发完成事件。
-
区域分片(Zone Sharding)
- 大地图划分多个分区;
- 通过 Redis Stream 同步边界。
-
战报可视化(Replay Viewer)
- 从日志生成动态图表;
- 支持进度条控制。
九、技术选型(Tech Stack)
| 层级 | 技术 | 理由 |
|---|---|---|
| 后端框架 | Go + Gin / Fiber | 简洁高并发 |
| 调度系统 | DelayQueue / Cron | 任务队列 |
| 存储层 | Redis + PostgreSQL | 快照与事务 |
| 消息总线 | NATS / Kafka | 广播与任务分发 |
| 客户端 | React / Phaser | 网格渲染 |
| 监控 | Prometheus + Grafana | Tick/资源指标 |
| 回放 | Loki + JSONL | 审计分析 |
十、压测与运维(Load & Ops)
| 场景 | 模拟行为 | 目标 |
|---|---|---|
| 1000 城市 | 同步结算 | 处理时间 < 5s |
| 高并发建造 | 50 次/秒 | 无冲突 |
| 异步任务堆积 | DelayQueue 1w 条 | 队列无阻塞 |
| 跨回合恢复 | 回放 round=50 | 状态一致 |
| 离线推送 | 1000 webhook | 失败率 < 1% |
监控指标:
round_job_latency_mstransaction_commit_totalsnapshot_store_totaljob_queue_pending_totalresource_sync_diff_total
十一、设计反思与演化(Reflection & Evolution)
11.1 核心洞察
这是第一个具备“世界持久化”的原型。 它验证了游戏后端从即时交互(Real-time Interaction) 向**周期模拟(Turn-based Simulation)**的架构跃迁。
系统的“节奏”从 Tick(毫秒级)转向 Turn(分钟级)。 验证了任务队列、调度与事务一致性的核心基础。
11.2 技术挑战
- 回合延迟导致的操作感断层;
- 数据一致性与事务锁竞争;
- 经济模型计算性能;
- 玩家离线状态下的同步策略。
11.3 进化方向
| 目标能力 | 下一原型 |
|---|---|
| 长周期模拟 | → #11 云端协作沙盘 |
| 分布式世界快照 | → #12 分区地图系统 |
| 战斗裁定系统 | → #13 战场模块原型 |
| 城市联盟管理 | → #14 社交+经济联合系统 |
十二、总结
“城格建造 mini-SLG” 是整个“联机 Hello World”体系的第一个完整循环。 它让一个世界拥有:
- 自主时间轴;
- 任务调度;
- 经济系统;
- 状态快照;
- 战报与回放。
从此,你的游戏不再只是“玩一局”,而是“在运行一个持续存在的世界”。
“前 9 章教你实时同步, 第 10 章教你让世界自己转动。”