核心玩法
《食街》的唯一规则源头。 改任何东西之前先读这一份。 一句话:你从一个小吃摊开始,最后经营出一条街、一座食都。
项目目录是 docs/食街/,游戏名《食街》(工作名,可改),口语里就叫"摆摊"。
这是仓库的第五个产品线,和 小农场 / 野花笔记 / 夜市 / 一帖 并列,题材、玩法、画风都不共享。
和《夜市》的区别见 1.2——这两个最容易撞。
本文只有第四节是实测的,其余是初稿。没有原型、没有经济模拟器。
一、一句话定位#
你从一个小吃摊开始,把摊子一个个摆进街里,最后经营出一条街、一座食都。
三个词:选址、配比、长线。
1.1 为什么这次要 SLG#
增量游戏玩到后期都会撞同一堵墙:曲线是对的,但玩家没有"我做了一个决定"的感觉。 点田、点客人、买设施,全都是"赚够了就买下一个",决策的形状是直线。
SLG 补的正好是这个:版图(地方有限)、配比(东西不够分)、长线(几天才成型)。 它的爽点不是"我变强了",是"我这个地方,是我摆出来的"。
1.2 和《夜市》的区别(最容易撞的一个)#
| 夜市 | 食街 | |
|---|---|---|
| 你管几个 | 一个摊 | 一条街 → 几条街 → 一座食都 |
| 核心操作 | 点客人、递餐 | 摆摊、升级、选菜 |
| 时间结构 | 实时挂机,随时看 | 几小时上线一次,每次做 1~3 个决定 |
| 深度在哪 | 流量撮合(λ 和 μ 对不上就堵) | 稀缺资源的分配(摊子不够分) |
| 画面主体 | 一条队列 | 一条街上的人流 |
| 画风 | 深蓝夜 + 暖黄灯笼 | 日间市集,原木 + 条纹布棚 |
① 食街不点客人。 客人在街上自己走、自己买,玩家不伺候队列。 ② 食街是白天。 夜市已经占了"暖夜灯色",这一套再做成夜色就是自己撞自己。
二、先说结论:SLG 要哪一半#
这一节是本文的重心。没想清楚就往下做,做出来的一定是"江南百景图 + 一个讨人厌的掠夺系统"。
2.1 四个项目都守的三条铁律,SLG 里哪条最容易破#
四条产品线共用同三条:零失败 / 不需要盯着屏幕 / 每次操作必有反馈。
把 SLG 拆开看,它和三条约之间的关系完全不对称:
| SLG 的部件 | 对应哪条铁律 | 冲突吗 |
|---|---|---|
| 版图扩张(占格子) | 不需要盯着 | 不冲突——格子是慢慢解锁的 |
| 建造队列(等时间) | 不需要盯着 | 不冲突——SLG 本来就是这样 |
| 兵种 / 武将配比 | 每次操作有反馈 | 不冲突——摆下去就出数 |
| 长线养成(几个月) | 零失败 | 不冲突 |
| PvP 掠夺 | 零失败 | 剧烈冲突——被抢就是损失 |
| 战争在线焦虑(怕被偷袭) | 不需要盯着 | 剧烈冲突——它逼你上线 |
| 付费买战力 | 三条都碰 | 不讨论 |
结论:SLG 的结构(版图 + 队列 + 配比 + 长线)一样都不用砍,只有"掠夺"和"怕被偷袭"不行。
而这两样,恰好是 SLG 里唯一会产生损失的部分。
是"SLG 的损失,你打算用什么替代"的问题。 用"什么都不损失"当然最省事——但那就退化成《江南百景图》了,没有"和别人比"的张力。
2.2 掠夺的替代品:三种不产生损失的对抗#
按"零失败"筛一遍,只剩三种形状:
| 形状 | 怎么做 | 赢的拿什么 | 输的丢什么 |
|---|---|---|---|
| 影子评比 | 系统给一个主题分数线,你拿自己最好的摊子去够 | 限定菜谱 / 摊主 / 装饰 | 什么都不丢,只是这次没拿到 |
| 客场摆摊 | 去别人街区的空位摆一晚 | 分成 | 主场完全不受影响 |
| 同业公会 | 一起完成街区改造目标,共享导流 | 全公会加成 | 无惩罚,只是慢 |
三者的共同点:对抗存在,但代价是"少赚"而不是"被拿走"。
真排行榜一旦有排名,玩家就会去优化排名而不是去经营。 而优化排名的最优解永远是"抄前一名"——这恰好是 SLG 最难看的那种玩法。 影子评比让"比"存在(有仪式感、有目标),但对手不会因为你的存在而变差。
2.3 砍掉掠夺之后,SLG 还剩下什么#
剩下三样,而且都是值钱的三样:
- 版图感 —— 你有一张会变大的地图,上面每一格是你亲手摆的
- 配比焦虑 —— 摊子永远不够分,你必须决定"哪条街先富"
- 长线成型 —— 三天后这条街有名字了,因为它全卖甜的
第 4 节会实测证明:布阵的最优解,贪心算法就能拿到 99.7%。 它是表达系统,不是优化系统。把深度押在"玩家算得比我好"上是押错了。
三、三个尺度:摊 / 街 / 城#
整局游戏只有三个东西,每个尺度上只有一个决定。
| 尺度 | 单位 | 你决定什么 | 频率 |
|---|---|---|---|
| 摊 | 一个摊子 | 卖什么、升到几级、谁来看摊 | 每次上线都动 |
| 街 | 一条街的 7 个格子 | 哪个摊摆在哪个格子、和谁挨着 | 布局定型后很久不动 |
| 城 | 若干条街 | 解锁哪条街、凑什么城市名片 | 几小时一次 |
3.1 摊子#
摊子有四样东西:
| 属性 | 含义 | 怎么变 |
|---|---|---|
| 口味 | 甜 / 咸 / 辣 / 鲜 | 换菜会换口味,口味决定它适合哪条街 |
| 产能 μ | 每分钟能出多少份 | 升级 |
| 单价 p | 一份卖多少 | 升级 / 招牌 |
| 摊主 | 谁在守,带一个加成 | 招募 / 培养 |
3.2 街:七个格子#
一条街 7 个格子,每个格子有自己的客群:
┌───┬───┬───┬───┬───┬───┬───┐
│ 甜 │ 甜 │ 咸 │ 甜★│ 咸 │ 鲜 │ 辣 │ ★ = 地标格
└───┴───┴───┴───┴───┴───┴───┘
人流 1.3 1.1 1.0 1.55 0.95 1.05 0.8
- 客群:这个格子走过的人想吃什么。摆对口味,转化率高;摆反,白摆
- 人流:这个格子有多少人经过
- 地标格:每街只有一格,放对街区主题,全街加成
3.3 城:街区与名片#
解锁第 2 条街之后,"城"这一层才开始:
- 每条街有主题(糖水街 / 辣味巷 / 渔港前街)
- 凑齐某些组合 → 一张城市名片("不夜甜都"、"五味俱全"),全城加成
名片是这个游戏的长线收集目标,也是"我要玩成什么样"的表达出口。
四、布阵到底是不是一道题(实测)#
这一节是本文唯一有数据的地方,也是整个设计最大的一个判断。
工具是 tools/sim/foodstreet.mjs。三次失败、一次成功,全部保留在代码注释里。
4.1 四次模型,三次失败#
判据是"贪心算法(每步选当前边际收益最大的)落后全局最优多少"。 落后越大,说明这个系统越需要玩家动脑;落后接近 0,说明它就是排序题。
| 版本 | 改了什么 | 贪心落后最优 | 判定 |
|---|---|---|---|
| v1 | 收入 = 人流 × 契合 × 强度 × 邻接(±10%) | 3.8% | ✗ |
| v2 | 邻接改成 1.45× / 0.70× 的门槛(同味互抢、互补带客) | 0.0% | ✗ 更糟 |
| v3 | 空档格泄流,把格子数量变成资源 | 0.0% | ✗ |
| v4 | 摊子稀缺,跨街分配(SLG 的"分城") | 0.3% | ✗ |
v2 是最反直觉的一次:我把套装加成从 10% 提到 45%,深度反而从 3.8% 掉到 0。 因为套装越强,"拼出那个套装"就越明显,贪心一眼就能看到。
4.2 根因:可分离乘积#
三次同一个现象,说明不是参数问题,是结构问题:
只要 摊子收入 = f(它所在的格子) × g(它自己)
成立,那么每个 (格子, 摊子) 二元组的边际贡献就是可加的, 贪心必然最优。加多少套装、加多少内耗,都只是把这个可加结构搅匀, 不会改变它的可加性。
"摆位置"这种事,只要收益能拆成"格子的属性 × 摊子的属性",它数学上就是排序题。
想让布阵真的成为一道题,收益必须不可分离——
也就是必须存在 f(a, b) ≠ f(a) + f(b) 的项(真正的套装、真正的互斥)。
而一旦套装做强到能改变最优解,贪心也会跟着学会它。这是个死循环。
4.3 但分布数据说明了另一件事#
v4 里 90 种分法,收入分布是这样的:
| 摆法 | 收入 | 相对最优 |
|---|---|---|
| 最优 | 15.466 | 100% |
| P75 | 11.255 | 72.8% |
| 中位(随便摆) | 9.733 | 62.9% |
| P25 | 8.995 | 58.2% |
| 最差(全摆反) | 6.454 | 41.7% |
翻译成人话:
- 摆对风格 → 拿到 100%;摆反风格 → 只剩 42%。差 1.58 倍。
- 但"理解规则"的贪心就能拿 99.7%。
所以布阵不是一道要算的题,是一道要懂的题。
4.4 于是把它定成"表达系统"#
这是本文最重要的一条设计决定:
布阵在《食街》里不是优化系统,是表达系统。
| 不要的东西 | 换成什么 |
|---|---|
| 精确解、最优解提示 | 街景自己说话:甜口街上摆满辣摊,人流明显绕开 |
| 让玩家做数学 | 让玩家"看一眼就知道该摆什么" |
| 排行榜式的效率比较 | 街的性格:这条街是甜食街,那条是深夜食堂 |
判据也跟着换掉了,从"深度"换成"容差":
| 判据 | 目标 | 实测 |
|---|---|---|
| 容差 | 随便摆不低于最优的 60% | 62.9% ✓ 刚好卡住 |
| 回报 | 看懂规则能拿到 ≥95% | 99.7% ✓ |
| 无通吃 | 换个街景,最优摆法必须跟着变 | ✓(改街景后分组从 AF|BC|DE 变成 BE|CF|AD) |
容差守住了"摆错不至于归零",回报守住了"懂了有好处",无通吃守住了"不能一招通吃"。 零失败的游戏里,布阵的正确形状就是这个。
五、核心循环与时间结构#
SLG 的时间结构本来就是"低频决策 + 长时间产出"——这一条和你"不需要盯着屏幕"是天然一致的。
5.1 一次上线做什么#
| 步 | 做什么 | 花多久 |
|---|---|---|
| ① | 看钱(离线攒的) | 2 秒 |
| ② | 升级 1~2 个摊子 | 10 秒 |
| ③ | 如果解锁了新摊 / 新街 → 重摆一次 | 30~60 秒 |
| ④ | 如果有食评会 → 挑摊子参赛 | 30 秒 |
| ⑤ | 下线 | — |
一次 12 分钟,一天 35 次。 这是设计目标,不是估计。
5.2 为什么这样是对的#
- ② 是增量的部分:升级让数字涨,爽点即时
- ③ 是SLG 的部分:低频、高价值、可以反复想
- ④ 是对抗的部分:有仪式感,但输了什么都不丢
如果玩家每次上线都要重摆,那就变成"回来上班"了。 重摆只在"有新东西"时发生——解锁一个新摊、一条新街、一个地标。 其余时候,摆好的街自己运转。
六、竞争:食评会与客场#
6.1 食评会(影子评比)#
每 12 小时一次,系统给一个主题:
本周主题:深夜食堂 分数线:2,400 分(=你上周水平的 1.15 倍)
- 你用符合主题的摊子摆一组去参赛,按"契合度 × 等级 × 套装"算分
- 过了线拿奖励;没过线什么都不丢,下次再来
- 分数线是针对你自己的历史算的,不是别人的排名
6.2 客场摆摊#
- 别人的街区上有"空摊位",你可以去摆一晚
- 你赚分成,主人拿"人气加成"(因为有人流来了)
- 主场完全不受影响——不去也不亏,去了双方都赚
6.3 同业公会#
- 一起完成"街区改造"(比如公会合计卖出 10 万份)
- 完成后全公会解锁一个新装饰 / 新摊主
- 不做捐献竞速,不做排名
七、成长线#
| 系统 | 买什么 | 有什么用 | 要回来管吗 |
|---|---|---|---|
| 摊子 | 升级 | 产能、单价 | 否 |
| 菜谱 | 解锁 | 换口味、开新分支 | 否 |
| 摊主 | 招募 / 培养 | 守摊加成 | 否 |
| 街 | 解锁格子 | 能摆更多摊 | 否 |
| 街区 | 解锁新街 | 版图扩张 | 否 |
| 城市名片 | 凑组合 | 全城加成 | 否 |
摊主只加数,不替你决定摆哪儿。 这和夜市「手点只拿小费」、一帖「学徒不代抓药」是同一条规矩: 自动化只能外包最不想做的那部分,永远不能外包核心操作。
八、数值(初稿,未跑模拟器)#
这一节全是初稿。 增量部分必须跑模拟器,见第十一节。
| 项 | 初稿 |
|---|---|
| 初始摊子 | 1 个(糖水铺),1 条街的前 2 格 |
| 单格收入 | 人流 × 契合度 × 产能 × 单价 |
| 摊子升级 | 每级 ×1.25,价格 ×2.2 |
| 解锁下一格 | 前 4 格之后,每格涨 3 倍 |
| 解锁下一条街 | 当前街摆满 5 个摊 |
参考夜市踩过的坑:涨价倍率 ÷ 增益倍率 < 2 时,最优解会变成"永远只买最便宜的那个"。 这里摊子升级是 ×2.2 / ×1.25 ≈ 1.76,偏低,需要模拟器复核。
九、画风基调(提案,未量过)#
市集的日间暖色。 和现有四套都不撞:
| 层 | 色系 | 用在哪 |
|---|---|---|
| 木 | 原木 / 浅胡桃 | 推车、招牌、棚架 |
| 布 | 条纹布(红白 / 蓝白) | 遮阳棚——这是这套画风的记忆点 |
| 白 | 搪瓷白 | 锅、碗、招牌底 |
| 亮 | 果酱红 / 芥末黄 | 招牌字、点缀 |
| 灰 | 铁皮灰 | 烟囱、水桶、推车轮 |
和另外四套的关系:比夜市亮(白天)、比一帖艳(市集)、比小农场杂(东西多)、比野花笔记暖。
真正定下来要单独写 美术风格.md,并且必须重新量化取色。
现在一条阈值都没有。
十、明确砍掉,不许加回来#
| 砍掉的东西 | 理由 |
|---|---|
| PvP 掠夺 / 被抢资源 | 直接破零失败 |
| 被偷袭 / 离线会被打 | 逼玩家上线 |
| 客人等太久生气走掉 | 制造焦虑(夜市也砍过) |
| 体力 / 门票 / 冷却 / 签到 | 破"不需要盯着" |
| 真人排行榜 / 好友比数值 | 把"经营"变成"冲榜" |
| 摊子会倒闭 / 亏本 | 零失败 |
| 付费买战力 | 不讨论 |
| 布阵最优解提示 / 效益对比条 | 一旦有,玩家就会去解方程,表达系统当场变成作业 |
| 摊主代摆摊子 | 核心决策被自动化 |
十一、待验证(都没验证)#
三条假设,按风险排序#
"看街下菜"玩家能不能一眼看懂。 这是"表达系统"能不能成立的前提。如果玩家看不出"这条街适合甜摊", 布阵就变成瞎试,表达就没了。需要做单街原型,摆五个摊看会不会自己反应过来。
增量节奏。 第一个摊几秒买得起、什么时候能解锁第二条街、第二天还在不在玩。 必须跑模拟器,不能估。
食评会会不会变成焦虑源。 "12 小时一次、过不了线就没了"——这已经在**制造"错过"**了。 如果实测玩家会因为怕错过而强迫自己上线,就得改成"随时可以交卷"。
下一步#
- 单街原型:一页 HTML,7 个格子、6 个摊子,能拖能摆,收入实时变
- 经济模拟器:
tools/sim/foodstreet-econ.mjs,跑 72 小时看解锁节奏 -
美术风格.md:量化取色 - 食评会的替代设计(如果第 3 条假设挂了)
是更清楚的反馈。玩家看不懂自己摆错了,再深的系统也没用。