在线联机原型全集:第 10 章 城格建造 mini-SLG(City SLG Mini)

第 10 章:城格建造 mini-SLG(City SLG Mini),介绍了一个简单的异步回合制 + 经济循环 + 战略模拟游戏原型,包括玩家匹配、房间创建、加入、退出、动作选择、提交、判定、结算、存档等功能。

城格建造 mini-SLG(City SLG Mini)

  • 类别:异步回合制 + 经济循环 + 战略模拟原型
  • 目标:验证回合调度(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 SnapshotRedis + 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
}

执行流程:

  1. 回合开始:允许操作;
  2. 回合进行中:玩家发送建造/占领命令;
  3. 回合结束:结算所有操作;
  4. 自动生成下回合任务。
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 分钟统一结算所有操作:

  1. 统计建筑产出;
  2. 执行升级/建造;
  3. 执行占地争夺裁定;
  4. 更新资源;
  5. 推送结果;
  6. 写入快照。
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)

字段描述
citiesid, owner, resources, turn, version城市基础状态
tilescity_id, x, y, building, level, owner地块表
round_jobscity_id, round, start_at, end_at回合调度
round_logscity_id, round, events, hash战报
snapshotscity_id, round, data_blob快照

七、验证指标(Metrics & KPI)

指标目标说明
回合调度延迟≤2s定时结算精度
事务提交成功率100%不丢单
快照恢复成功率≥99%Redis 有效性
资源同步一致率100%无偏差
离线推送到达率≥98%Webhook 可靠性
服务器并发处理量≥10k 回合/节点延迟容忍性

八、扩展功能(Extensions)

  1. 战斗与攻城系统

    • 玩家可攻占他人地块;
    • 触发战斗结算模块。
  2. 联盟协作系统

    • 多个城市组成联盟;
    • 联盟共享资源池。
  3. 交易与市场

    • 玩家之间可交易资源;
    • 引入动态价格曲线。
  4. 异步任务队列

    • 建筑升级耗时;
    • DelayQueue 触发完成事件。
  5. 区域分片(Zone Sharding)

    • 大地图划分多个分区;
    • 通过 Redis Stream 同步边界。
  6. 战报可视化(Replay Viewer)

    • 从日志生成动态图表;
    • 支持进度条控制。

九、技术选型(Tech Stack)

层级技术理由
后端框架Go + Gin / Fiber简洁高并发
调度系统DelayQueue / Cron任务队列
存储层Redis + PostgreSQL快照与事务
消息总线NATS / Kafka广播与任务分发
客户端React / Phaser网格渲染
监控Prometheus + GrafanaTick/资源指标
回放Loki + JSONL审计分析

十、压测与运维(Load & Ops)

场景模拟行为目标
1000 城市同步结算处理时间 < 5s
高并发建造50 次/秒无冲突
异步任务堆积DelayQueue 1w 条队列无阻塞
跨回合恢复回放 round=50状态一致
离线推送1000 webhook失败率 < 1%

监控指标:

  • round_job_latency_ms
  • transaction_commit_total
  • snapshot_store_total
  • job_queue_pending_total
  • resource_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 章教你让世界自己转动。”

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页