下载 App
开发者日志 03 · 以水定绿
《绿洲涌现》开发日志 · 第 3 篇
让"有限"真的有限
"以水定绿"是治沙领域的一句行话:绿化的规模,要适应当地水资源的承载力。种得多不等于种得好——水供不上,苗全得死。
设计上最难的一点是:怎么让玩家真的感到水是有限的?
如果水只是一个缓慢增长的进度条,玩家很快就会忽略它。我们试过几种方案:
| 方案 | 问题 |
|---|---|
| 水无限,只限制种植速度 | 失去了"定绿"的核心张力 |
| 水会枯竭,用完就 Game Over | 太惩罚,玩家不敢做任何决策 |
| 水有限但可购买 | 变成了资源管理,不是生态模拟 |
最终方案是:水有三个约束,互相咬合。
约束一:供需缺口
供水来自滴灌站(0.55 + 等级 × 0.35 / 秒),需求来自植被——而且随季节变化。
风沙季(第 2 季)的需求倍率最高,这就是为什么"全年预算"比"当前季余额"更重要:
lua复制
lua-- 全年净额 = (供水 - 四季平均需求 - 生产负荷) × 55秒 × 4季 annualNet = (supply - total / 4 - production) * Config.SEASON_SECONDS * 4
玩家很容易踩的坑:当前季度盈余,但全年赤字。 因为风沙季那一下会吃掉大半缓冲。所以第一章验收里,我们用的是全年口径,不是瞬时口径。
约束二:养护储备
水库存不是越大越好。我们有"未来 55 秒最低水"这个指标——按当前布局和已知天气事件推演,未来一季里水库最低会掉到多少。
如果这个最低点低于储备线(12),就判定为"养护储备不足"。玩家必须先停下来回蓄,而不是继续扩种。
这条规则制造了一个反直觉的体验:有时候最好的操作是什么都不做。 这正是我们想要的——真实治沙里,很多时候就是要等。
约束三:承载边界
第三章做第二章时,我们加了"承载边界"这个概念。它回答一个具体问题:
以现在的水,最多能养活多少块地?
算法很朴素——把每块地的年需求排序,从最小的开始装,装到预算用完为止:
lua复制
luatable.sort(demands) -- 从最省水的开始 local budget = supply * SEASON_SECONDS * 4 for _, annual in ipairs(demands) do if used + annual > budget then break end used = used + annual capacity = capacity + 1 end
这个数字直接展示在界面上,玩家能清楚看到:“我现在的水,最多撑 87 块地,已经用了 40 块。”
性能上踩过坑:这个计算最初每帧全图扫描,帧时间飙到 11.7 秒。加了签名缓存——只有关键状态变化时才重算——才压回正常。
洪水:水多也是问题
有意思的是,沙漠边缘不只是缺水,还会有上游来水。
洪水是一笔独立的水账:它不进入生态库,不能用来浇灌。玩家可以选择花 120 资金建调蓄沉淀池,截留一部分、沉淀后受控下泄。
这个设计的意图是打破"水越多越好"的直觉:洪水是压力,不是资源。 处理它需要成本,不处理它会淹掉低洼地块。
这一篇的教训
"有限"不是把数字调小,而是让玩家在多个约束之间做取舍。
如果只有一条规则(水会耗尽),玩家只需要"省着用"。有了三条互相咬合的规则(供需缺口 + 储备底线 + 承载上限),玩家才需要真正思考:“我这块地该不该种?现在种还是等一季?

