在线联机原型全集:第 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 章教你让世界自己转动。”

相关技术栈与进一步学习

本原型验证的核心技术:异步回合制、经济循环与供需平衡、策略模拟、离线收益计算

相关教程关联内容
《游戏服务端编程实践》
《游戏服务端高级进阶知识储备》

💡 如果你想系统性地理解游戏服务端开发的全栈知识体系,可以参考
《产品原型开发指南》目录页
了解从「联机 Hello World」到「永续自治世界」的完整学习路线。

核心概念定义

异步回合制(Asynchronous Turn-based):一种不要求所有玩家同时在线的回合制游戏模式:玩家在自己的回合内提交决策,服务器在收集到后续动作或到达截止时间后推进世界状态,支持离线时的异步推进。


经济循环(Economic Cycle):游戏中资源从「生产 → 运输 → 消费 → 回收」的闭环流动过程,包含产出率、消耗率、存储上限、损耗因子等参数,是策略游戏可持续性的数学基础。


离线收益(Offline Income):玩家不在线期间,服务器根据预设规则(如时间曲线函数)计算并累积应得游戏资源,在玩家下次登录时一次性发放的机制,常用于放置类/模拟经营类游戏。

常见问题解答(FAQ)

以下问答帮助快速回顾本原型的核心要点,也有助于搜索引擎与大模型更好地理解内容主题。

Q1: 异步回合制如何避免一个玩家拖慢全局?

设置回合超时机制:玩家在 N 秒内未提交操作,服务器自动使用该玩家的预设策略或 AI 托管执行,保证游戏节奏不被单个离线玩家打断。

Q2: 经济循环中的通胀怎么控制?

通过产出上限(资源总量不再随时间增加)、消耗税率、以及动态定价因子来调节。例如在 SLG 中,高级建筑的资源产出效率递减,天然抑制通胀。

Q3: 离线收益需要封顶吗?

是的,通常设置收益时间上限(如最多累积 8 小时)并采用对数曲线(时间越长边际收益越低),鼓励定期登录但不过度惩罚非连续游戏玩家。

Q4: 异步回合制和实时同步有什么区别?

异步回合制中玩家可以离线思考,服务器在收到动作或超时后才推进;实时同步要求所有玩家同时在线并持续收发状态更新。前者适合策略/经营,后者适合动作/竞技。

继续阅读

探索更多技术文章

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

全部文章 返回首页

「products」更多文章