核心玩法
夜市的唯一规则源头。 改任何东西之前先读这一份。 一句话:小人从街那头走过来排队,你把吃的递过去,金币进袋。 赚到的钱拿去扩充食品种类和数量,让队伍一直排到街角。
数值全部来自 tools/sim/night.mjs 的实测,命令写在第五节和第八节,没有一个数是估的。

一、玩家眼前是什么#
竖屏。一条夜市街,右侧是你的摊位,摊上一个灶台、几口锅、一排灯笼。街上有人走来走去。
屏幕上一共只有三样东西:人、吃的、金币。
| 是什么 | 玩家对它做什么 | |
|---|---|---|
| 队伍 | 摊位前排成一列的无脸圆脑袋小人,头顶冒气泡显示他想吃什么 | 点他 —— 递给他,他冒爱心、头顶弹金币、开心走掉 |
| 灶台 | 摊台上的一排灶口,每口灶绑一道菜,带进度环和待取的份数 | 点开可以升级、换菜、加灶 |
| 金币 | 右上角钱袋 | 花掉它,让上面两件事变大 |
小人的样子见美术风格:圆脑袋、没有五官、胶囊身体、两条短腿,可爱、好画、好动。
没有五官,情绪就只能靠动作表达——这恰好是最省素材、也最好看的一条路。 等待 = 轻轻左右晃;拿到吃的 = 蹦一下冒爱心;好奇 = 歪头; 被晾太久 = 原地坐下(不是生气,更不会走,见第三节铁律二)。 一张头、一张身体、两条腿、两条胳膊,六个零件就能演完所有情绪。
二、三条铁律#
- 零失败。 不存在"客人等太久跑了""食材坏了""今天亏本"。 队伍满了,后面来的人就只是街上的路人——他从头到尾就不属于你,走过不算损失。 贵客会一直站在摊位旁边等你,你不来他也不走。
- 不需要盯着屏幕。 这个游戏可以一直玩,但永远不必。 你离开了,摊子还在出餐、还在收钱(离线结算见第十节)。 想做任何东西之前先问一句:"它需要玩家盯着屏幕吗?" 需要 → 砍掉。
- 每次点击都必然成功。 点一位客人一定有反馈:有现成的食物就直接成交, 没有就当场把那口灶的火催旺(进度条往前跳一截)。没有"点错了"这回事。
老版本的诊断里写过一句"技巧空间 = 0:所有操作都是条件满足即成功"。 这里把它反过来用:既然做不出"做得好/做得差", 那就让每一次点击都爽——点下去一定推进、一定有数字、一定有声光。 手感靠"必然的反馈",不靠"可能失败的风险"。
三、核心循环#
街上有人走过(人流量 λ)
│
▼
队伍里排着等你出餐的客人
│
┌─────────┴─────────┐
│ │
灶自己出餐 你亲手递
(产能 μ) (这一单多收小费)
│ │
└─────────┬─────────┘
▼
金币
│
┌───────────┼───────────┬──────────┐
▼ ▼ ▼ ▼
加一口灶 雇一位店员 解锁新菜 升小费罐
(产量) (乘区) (单价) (手点收益)
一句话:产能够不够、单价高不高,是你唯一要操心的两件事。客流自己会追上来。
四、三条轨道(每条只管一件不同的事,不许重叠)#
| 轨道 | 玩家买什么 | 管什么 | 公式 |
|---|---|---|---|
| 灶(规模) | 加一口灶、换一道菜 | 产能 μ | μ = Σ(1/t_i) × 0.5 × (1 + 0.2×店员) × (在场 ? 1.3 : 1) |
| 菜(单价) | 解锁新菜、升级老菜 | 单价 p | p_i = 基础价 × 1.16^等级 × 招牌倍率 |
| 人(跑腿) | 雇店员、升小费罐 | 乘区 / 手点 | 见上、见第五节 |
收入/秒 = 成交率 × Σ(每道菜的产能占比 × 它的单价)
成交率 = min(λ, μ) ← 客流和产能,谁小谁说了算
4.1 min(λ, μ) 就是本作的核心#
这条公式让瓶颈永远看得见,而且不用写在面板上:
| 你在屏幕上看到 | 说明 | 该做什么 |
|---|---|---|
| 队伍排到街角、还不断有人走过 | λ > μ,产能不够 | 加灶、雇店员 |
| 摊位前空着、街上人也不多 | λ < μ,客流不够 | 等几秒(口碑会涨上来),或者干脆去升级菜 |
| 队伍刚好在动、源源不断 | 两条都跟得上 | 继续攒钱 |
别的增量游戏要靠一句话提示玩家"你该升级了"。这里不用: 队伍的长度和大街上走过的人流,本身就是那块面板。 加产能够不够、还差多少,一眼就看出来。
4.2 为什么客流是自适应的#
口碑跟着生意走。 你服务得越多,名声越大,来的人越多:
λ 向 1.35 × 实际成交率 一阶收敛(时间常数 30 秒)
稳态只有唯一自洽解:λ = 1.35 × 成交率,而 成交率 = min(λ, μ),
所以只能是 成交率 = μ、λ = 1.35 μ。
也就是产能永远是瓶颈,队伍永远是满的。
这不是偷懒,是故意的。它带来三个好处:
- 玩家只需要管产能和单价——主界面概念从 4 个砍到 3 个,符合约定里"新东西要进主界面,先砍掉一个旧的"。
- 那条"永远排着队、永远有人从队尾走过来"的画面,就是夜市该有的样子。
- 加产能之后会有 约 30 秒的窗口:队伍被瞬间清空 → 街上的人继续涌进来 → 队伍又满了。 这个"清空再填满"的循环,是全局最强的正反馈。
一开始把「名气」做成花钱买 +18%。结果 λ 指数爆炸到 228 人/秒,把模拟器跑死。 根因是刀刃失衡:λ 成为瓶颈时买名气给的是线性回报, 而它的涨价被其他轨道的收入增长抵消 → 回本时间恒定 → 无限正反馈。 这正是工程约定里记过的那种"调参救不了"的结构问题。 改成"口碑跟着生意走"之后,λ 再也不需要玩家管,也不可能失控。
五、手点:全程唯一的一个操作#
5.1 点谁、发生什么#
| 情况 | 点下去发生什么 | 玩家看到什么 |
|---|---|---|
| 这位客人要的菜有现成的 | 立刻成交,这一单多收小费 | 盘子飞过去、爱心跳出、金币飞进钱袋 |
| 这位客人要的菜还在做 | 当场把那口灶的进度催满 | 进度环"唰"地转满、冒一股热气、紧接着成交 |
| 队伍空了,街上有人 | 吆喝一声,拉一位路人进队 | 那位路人头上冒一个"?",然后拐进队伍 |
三种情况合起来仍然是一个操作(点),符合"一个小游戏只允许一种操作类型"的规矩。
5.2 为什么手点只给小费,不给额外产能#
手点不能凭空多出餐来——一口灶一个制作周期内只能被催满一次。 所以手点的上限 = 产能上限,它抢不走挂机轨的活。
于是:
| 收入 | |
|---|---|
| 完全不点(离线) | 成交率 × 单价 |
| 一直点(在线) | 上面这一项 × (1 + 小费率),外加贵客 |
「一直点 ÷ 完全不点」必须收敛。 这是约定里那条刀刃平衡教训的直接移植: 点击给一个永久约 1.3~1.5 倍的注意力优势,不是无限优势。发散就说明点击变成必需品,设计就错了。
实测(--compare):同一摊子状态下,在场 ÷ 离场 = 1.30×;
算上小费和贵客,终局收入率之比 2.55×(含前面复利导致的摊子规模差异)。
早期数值、换算成时间口径,见数值实测。
六、贵客:让后期的手点依然值得#
后期产能大到每秒几百份,一次点击的小费占比会趋近于零。光靠小费,点击在中期就死了。
所以加贵客:
- 每隔 90~150 秒来一位,站在摊位侧面(不占队伍位,所以不会堵住别人)
- 头顶一个大大的金色标志,只有亲手递才卖给他——店员不搭理他
- 一次给 ≈ 8 秒的产量,锚定当前收入,所以永远不会被稀释
- 他不会走。 你三小时不来,他就在那儿站三小时
实测:贵客约占总收入 10%。也就是"想起来就点一下"≈ 多 10%, "完全不点"一点也不亏。
限时就等于"你不来就亏",那是强迫,不是选择(见共用判断标准 4.3)。 站着不走反而是奖励:你随时回来,惊喜一直都在。
七、食品与配表#
20 道菜,7 个类别。每一档 p ×1.45、t +0.2 秒、解锁价 ×3。
| 菜 | 类别 | 单价 p | 出餐 t | 解锁价 |
|---|---|---|---|---|
| 烤肠 | 烧烤 | 6 | 1.6 | 开局自带 |
| 茶蛋 | 小吃 | 8 | 1.8 | 120 |
| 糖葫芦 | 甜 | 12 | 2.0 | 600 |
| 煎饼 | 主食 | 18 | 2.2 | 2.6 千 |
| 珍珠奶茶 | 饮 | 26 | 2.4 | 1.1 万 |
| 烤冷面 | 主食 | 38 | 2.6 | 4.8 万 |
| 炸鸡 | 荤 | 55 | 2.8 | 21 万 |
| 麻辣烫 | 主食 | 80 | 3.0 | 92 万 |
| 章鱼小丸子 | 小吃 | 115 | 3.2 | 400 万 |
| 关东煮 | 小吃 | 165 | 3.4 | 1800 万 |
| 烤鱿鱼 | 海鲜 | 240 | 3.6 | 7800 万 |
| 生蚝 | 海鲜 | 350 | 3.8 | 3.4 亿 |
| 小龙虾 | 海鲜 | 500 | 4.0 | 15 亿 |
| 蛋烘糕 | 甜 | 720 | 4.2 | 65 亿 |
| 羊肉串 | 烧烤 | 1040 | 4.4 | 280 亿 |
| 蟹粉生煎 | 主食 | 1500 | 4.6 | 1200 亿 |
| 柠檬茶 | 饮 | 2200 | 4.8 | 5400 亿 |
| 杨枝甘露 | 甜 | 3200 | 5.0 | 2.3 兆 |
| 佛跳墙 | 主食 | 4600 | 5.2 | 10 兆 |
| 龙虾粥 | 海鲜 | 6600 | 5.4 | 44 兆 |
7.1 越贵越慢,这是「扩充食品类型」真正的取舍#
p 涨,t 也涨。 单位时间产值 p/t 是递增的(3.75 → 1222),
所以上新菜永远有正收益;但新菜更慢,会吃掉产能。
于是"我该上哪道菜"变成了一个真决策:
| 打法 | 适合 |
|---|---|
| 全上快的便宜菜 | 产能足、客流猛的时候,靠数量堆 |
| 全上慢的贵菜 | 产能吃紧时反而亏,因为 min(λ, μ) 被 μ 卡住 |
| 混搭 + 凑招牌 | 大多数时候的最优解 |
7.2 「扩充数量」= 同一道菜占多口灶#
摊上可以同时摆 3 口烤肠灶,这一道菜的单位时间产值就翻三倍, 而且直接触发「五连灶」招牌(见 7.3)。
7.3 招牌组合:扩充菜单的第二个动机#
摊上同时满足条件时,给一个乘区。每一道菜都能进多条招牌。
| 招牌 | 条件 | 效果 |
|---|---|---|
| 冰火两重天 | 烧烤 + 饮 | 两者 p ×1.25 |
| 甜咸配 | 甜 + 小吃 | 甜 p ×1.3 |
| 主食搭档 | 两类主食 | 主食 p ×1.2 |
| 海陆双拼 | 海鲜 + 荤 | 两者 p ×1.3 |
| 夜市全席 | 七类各至少一种 | 全体 p ×1.6 |
| 五连灶 | 同一道菜占 ≥3 口灶 | 该菜 p ×1.5 |
八、花钱的地方#
| 买什么 | 效果 | 起始价 | 每次涨价 |
|---|---|---|---|
| 加一口灶 | 产量 +1 口(摆现有菜里 p/t 最高的那道) |
120 | ×1.45 |
| 解锁新菜 | 上新菜,自带够用的灶(见下) | 见第七节表 | 固定价 |
| 升级菜 | 该菜 p ×1.16、t ×0.97(最快 0.5 秒) | 90 | ×1.50 |
| 雇店员 | 全体灶产能 ×(1 + 0.2×店员数) | 300 | ×1.55 |
| 升小费罐 | 小费率 +0.05(上限 +1.00) | 900 | ×1.55 |
模拟器里踩过:均匀点单时,新解锁的菜只配一口灶,却要分走一份客流, 那口灶供不上 → 点它的客人永远卡在队首 → 队伍被整条堵死。 实测 λ 从 26.7 塌到 4.15,产能还有 39 却卖不动。
两条一起修才对:① 客人按产能加权点单(需求 ∝ 供给);
② 解锁新菜时按 0.5 份/秒 的产能给它配灶。
单独修哪一条都还剩一半的问题。
没有"补货""库存""食材会坏"这回事。 那是被砍掉的一类东西: 需要回来管的,一律不做。
九、抽卡与商业化(只是福利,不进核心数值)#
抽卡不是主要内容。它在核心循环之外,只提供两类东西: 好看和方便。抽不到任何东西,你一样能把摊子开下去。
9.1 卡池#
| 池子 | 内容 | 有没有数值 |
|---|---|---|
| 摊车外观 | 推车、灶台、招牌布、灯笼样式 | 无 |
| 小人的衣服 | 路人身上那套配色和头饰,抽到就进随机池 | 无 |
| 贵客造型 | 贵客头上的标志和打扮 | 无 |
| 今日天象 | 当晚 λ 或 p +30% | 有,但当晚失效 |
- 来源:每日免费 1 抽(打开就送)+ 看广告 1 抽 + 里程碑送抽
- 重复的转成「夜明珠」,攒够可以指定兑换一个外观——不做纯随机
- 不卖数值强度。 一张都抽不到,摊子该怎么开就怎么开
9.2 收费点#
| 收费点 | 形式 | 硬性约束 |
|---|---|---|
| 外观直购 | 内购 | 只卖"好看",不卖加成 |
| 去广告 | 内购 | — |
| 离线时长提升 | 内购 | 不买也有 8 小时,买了是 24 小时 |
| 看广告 ×2 离线收益 | 激励视频 | 不看也有 1×,不亏 |
"不看这个广告,我会不会觉得亏?" 会 → 这是强迫,不是选择 → 砍掉。 所以所有广告位都必须"默认那份本来就在"。把 ×2 做成 ×0 或者 1,就是把福利做成税。
十、离线与挂机#
- 离线时店员照常出餐,但队伍不积累(人不会在你摊前站一晚上)
- 离线按稳态收入率结算:
离场产能 × 单价 - 上限 8 小时(可在商店提到 24 小时),超出部分直接丢弃
- 回来时给一个"收摊钱袋"弹窗,金币一次性飞进来
离线不欠账: 不设"补货""清洁""人气衰减"这类回来必须清的账。 关掉就关掉,回来接着排。
十一、开局 5 分钟(这块是设计出来的,不是自然长出来的)#
| 时间 | 屏幕上发生什么 | 玩家做什么 |
|---|---|---|
| 0:00 | 空街、暗灯笼、你的小摊。3 秒后街那头走来第一个小人 | 看 |
| 0:06 | 他站到摊前,头顶冒一个烤串气泡 | 点他 → 递出烤串 → 爱心 + 金币 |
| 0:20 | 又来了两位。摊位前第一次有两个人排队 | 连点两下 |
| 0:30 | 攒够钱,第 2 口灶 的按钮开始发光 | 加灶 |
| 1:00 | 茶蛋解锁,队伍里开始出现想吃茶蛋的小人 | 点新菜 |
| 3:20 | 攒够 300,第一位店员上岗,灶台开始自己转 | 松手试试 |
| 5:00 | 三道菜、八口灶、三位店员,队伍稳定在五六个人 | 可以关掉了 |
实测(--policy active):5 分钟时收入约 38/秒、8 口灶、3 位店员;
30 分钟 8 道菜、34 口灶,收入 2.1 万/秒。
开局那一下必须有表情——爱心、小跳、金币飞进钱袋的声音。 玩家前 60 秒记住的不是 +6 金币,是"我递给他,他开心了"。
十二、界面分区#
沿用旧项目的字母代号习惯,竖屏自上而下五块:
| 代号 | 名称 | 内容 |
|---|---|---|
| H | 资源栏 | 金币、当前收入/秒、摊子阶段 |
| SC | 街景 | 夜空 + 灯笼 + 街 + 摊位 + 排队的小人 + 街上的路人 + 贵客 |
| K | 灶台 | 一排灶口:菜图标 / 进度环 / 待取份数 |
| B | 菜单条 | 已解锁的菜,点开升级;未解锁的显示"还差 X" |
| T | 页签栏 | 菜单 / 扩充 / 图鉴 / 商店 |
主界面只有三样东西(人、吃的、金币)。店员、排队位、招牌这些统统收进页签里。
十三、已经被砍掉、不许加回来的#
| 砍掉 | 为什么 |
|---|---|
| 补货 / 库存 / 食材会坏 | 要回来管 |
| 客人等太久会生气跑掉 | 制造焦虑,违反铁律一 |
| 限时贵客 | "不来就亏" = 强迫 |
| 体力 / 门票 / 冷却 | 违反铁律二 |
| 排行榜 / 好友比数值 | 会把"看"变成"冲" |
| 花钱买名气 / 花钱买客流 | 刀刃失衡,试过了,λ 会指数爆炸 |
| 排队位作为升级项 | 稳态下队伍永远是满的,加位子没有任何数值意义 |
| 12 档业态晋升 / 考核 | 老版本那套太沉;现在用"摊子换名字"做轻量替代 |
十四、复现本文所有数字#
node tools/sim/night.mjs --hours 1 --policy active --trace # 开局到一小时的时间线
node tools/sim/night.mjs --hours 24 --policy active --trace # 二十四小时的曲线
node tools/sim/night.mjs --compare --hours 4 --runs 3 # 松手判据(三口径对照)
实测数据、踩过的坑、以及每一条结论对应的证据,都记在数值实测。 改任何配表之后先跑一遍这个脚本,别凭感觉调。