12.2 协同与反协同
协同与反协同是可判定的:定义交互项 I = 两机制同时变化的效果 − 各自单独变化的效果之和,先按观测量的好坏方向定向,再归一化成千分比。本节给出整数判据、实跑出的两处协同与两处反协同,并说明为什么「定向」这一步不能省——少了它,反协同会被符号读成协同。
tag
协同与反协同是可判定的:定义交互项 I = 两机制同时变化的效果 − 各自单独变化的效果之和,先按观测量的好坏方向定向,再归一化成千分比。本节给出整数判据、实跑出的两处协同与两处反协同,并说明为什么「定向」这一步不能省——少了它,反协同会被符号读成协同。
把「机制耦合」写成一个可算的整数:在一个工作点上对每个参数做单参数扰动,看其它量的整数差,落成 7×5 的耦合矩阵与热力格。本节解释为什么 dealt 列恒零、为什么 rewardGold 与 punishHp 是死旋钮,以及为什么耦合是工作点的函数,而不是机制的内禀属性。
可复现分两层。机制层的 digest 是纯整数与布尔的规范化 JSON,跨语言必须逐字相等;表现层的像素位移由宿主浮点算出,浮点加法不满足结合律,换个求和顺序末位就变,只能按声明容差断言。本节给出两侧逐字相同的 digest 字符串,并演示为什么禁写「逐位相等」。
增长与衰减曲线在整数域上必须闭式与递推逐项一致,否则同一份规格在不同宿主会跑出两条曲线。本节用有理数 115/100 与 90/100 各跑 11 项,证明保分子的递推与闭式逐项恒等,而逐步地板除的朴素递推会累积漂移:十级之后差 8,幂运算必须走 BigInt 才不丢位。
浮点让同一份规格在两个宿主上算出不同的末位,跨语言一致就无从谈起。本节给出三条跨语言纪律——预算与阈值一律整数、随机一律自实现可播种 PRNG、config 禁浮点——并把暴击判定、倍率、千分比、向上取整、整数幂逐条改写成整数写法,用一张对照表列出两语言的同一结果。
「卡住」有四种形态:无合法动作的死锁、有动作却不改变状态的停滞、资源不可达目标的不可解、以及撞上上限的截断。本节把 4.3 的搜索器包成一张判据表,用四个夹具各命中一类,并钉死结论的可靠性边界——solvable=true 有证据恒可靠,false 只在 exhausted=true 时才是证明。
第 1、3、4 章各散落着一部分不变量:资源边界、守恒、状态封闭。本节把它们收成一张 8 条的可执行清单,逐条给出整数判据与一个故意造违反的负例。清单在真实轨迹的 26 个状态上全 true,8 条负例全被判 false——把「机制自洽」从零散断言变成可回归的验收面。
状态空间不是「所有可能的状态」,而是「从开局真的能走到的状态」。本节用广度优先展开动作序列的前缀树、以 digest 去重,把《灰烬牌库》12 步内的可达集真的枚举出来:7637 个状态,只占粗粒度上界的十亿分之 250;再拿 8 类「永远不该出现」的状态去扫,命中数全为 0。
机制每回合产生十几次状态变化,玩家只看见其中一部分——「哪些分量被呈现」这份名单,就是机制与玩家的接口。本节把《灰烬牌库》的状态按呈现与否分成 8/12 两堆,从轨迹里抽出 17 条反馈事件与逐回合的净位移/总位移:最强回合 29、最弱回合只有 6,还有 4 条指令的反馈是「什么都没发生」。
上一节的三张表里,状态分量按「会不会被花掉」再分一次,就得到四种资源:能量、手牌、生命、格挡;而目标就是这四种资源的期末余额。本节给一张每回合的收入-支出表,用《灰烬牌库》跑一局账:能量入 12 出 10 余 2、格挡产 10 只吸收 6、伤害 50 有 5 点被溢出截断,账本末态与引擎摘要逐字对拍一致。
机制不是一段文字描述,而是三张能逐字段核对的小表:动词(玩家能做什么)、规则(动词受什么约束、状态怎么变)、状态(规则作用在什么上)。本节用《灰烬牌库》的 play_spec.json 把三张表从规格里解析出来——2 个动词、6 个动作符号、13 条规则、12 个状态分量,并查出 0 个孤儿分量与 2 个没人消费的参数。
《游戏设计》卷一《玩法机制与可执行规格》目录:16 章 48 节,把玩法设计文档写成可执行规格 play_spec.json,让同一份规格被 S 层仿真、P 层确定性内核、W 层可玩原型与 B 层相变扫描四处消费,产出逐字一致的摘要。本页给出七处分工说明、六档可运行性口径、《灰烬牌库》机制总览与全书 16 章 48 节完整清单。
《游戏设计》卷一《玩法机制与可执行规格》全 50 篇。第一部分(第 1–4 章)把机制写透到可执行:机制的最小构成(动词、规则、状态)、资源与目标、反馈接口,play_spec.json 的字段与模式校验、版本与迁移,S 层从规格到轨迹与资源守恒检验,P 层规格驱动的状态机、不变量断言与死锁可解性;第二部分(第 5–8 章)让规格真的跑起来:规格内联进单文件 HTML、Playwright 注入策略真玩并断言状态、原型与内核同源,参数扰动与相变扫描,反馈回路的增益与稳定性,奖励节奏谱与挫败预算;第三部分(第 9–13 章)处理机制的可计算性:随机性的三种结构、方差与体验、可播种随机与确定性回放,状态可达性与不变量清单,机制数值的整数化与跨语言一致、增长衰减的闭式与递推,机制耦合与协同反协同、组合爆炸的控制,机制的增量兼容、赛季与 DLC、退场;第四部分(第 14–16 章)把机制接到体验并做装配:机制到体验的映射与可观测指标,跨语言 digest 与同源不同宿主、偏差与容差,最后装配成一份规格四处消费的完整链路并交付卷二。按章节提供仿真、逻辑内核与原型;完整项目的配置组装与交付验收仍在补齐。全书围绕虚构的卡牌构筑 Roguelike《灰烬牌库》与工具链 ashdeck 展开。
把「留存」拆成两件可算的事:首日新手漏斗(启动→加载→引导→首关→合成→离线收益→首日结算)与跨天留存曲线(D1/D7/D30 锚点整数插值)。给出可跑的 Python 漏斗仿真、同口径的 TypeScript 留存内核与 4 项单元测试,并用三档改造对照回答「改哪一步最划算」。
赛季是把单个活动放大成一段长跑:三个阶段怎么分、每周衰减怎么补、奖励阶梯定多高才不发穿预算。本节给出一份赛季结构与节奏配置,配一个浏览器里打开就能拖的赛季节奏看板(W 层单文件 HTML),把周活跃指数曲线、阶梯达成率与季间衔接衰减一次性拨出来。
12.1 看留存、12.2 看流失,这一节把留存和付费放在一起。用一个潜在活跃度同时驱动留存与付费,先量出「付费玩家 D7 留存更高」的原始溢价,再切活跃度十分位做分组内对照,把溢价里的选择效应分离出来,并给出收入结构与档位留存交叉表,最后讨论这张表怎么用于召回优先级。
上一节是事后诊断,这一节做事前预警:用活跃天数、停滞天数、付费额、是否入盟、等级增益五个特征,手写一个纯 Python 逻辑回归,预测谁会在未来 7 天流失;再用规则基线做同口径对照,跑一条 B 层基准,最后把告警量换算成召回活动的成本与回收价值。
付费点铺好了,还要决定它们什么时候出现,以及怎样不把免费玩家逼走。本节用 config/n09_protection.json 定义免费 / 付费玩家的日产出与内容需求里程碑,用 S 层脚本逐日算免费玩家达成度曲线、定位付费墙出现的天数,并对体验保护门槛做 PASS/WARN 判定与敏感性扫描。
首充、月卡、通行证是 SLG 里最稳定的三类常规付费点,共同点是「高性价比换玩家行为」。本节用 config/pricing.json 的真实参数,逐个算清首充的双倍倍率、月卡的逐日累计与回本天数、通行证的双轨增量价值,并用 P 层 TypeScript 原型做跨语言对照。
付费点不是货架上摆得越多越好。本节先把玩家掏钱的动机拆成进度、竞争、收集、社交、便利五类,再用 config/n09_payment.json 把八个付费点铺到「动机 × 生命周期」两张轴上,用 S 层脚本把每个点归一化成每元玉璧等价,并算出 20 格布局矩阵的覆盖度与缺口。