4.1 兵种三角与克制矩阵
150% 的单一克制环在骑兵/弓兵这一对直接饱和到 100%/0%,另两对也偏到 86/14、88/15。本节把《王朝纪元》的兵种三角写成 3x3 整数百分比矩阵,用 S 层脚本对每个有序对跑带抖动的确定性战斗,得出胜率矩阵,并校验克制对、被克对与镜像对是否都落在目标带内。
category
150% 的单一克制环在骑兵/弓兵这一对直接饱和到 100%/0%,另两对也偏到 86/14、88/15。本节把《王朝纪元》的兵种三角写成 3x3 整数百分比矩阵,用 S 层脚本对每个有序对跑带抖动的确定性战斗,得出胜率矩阵,并校验克制对、被克对与镜像对是否都落在目标带内。
把 3.1 的确定伤害与 3.2 的分布装进回合循环:每回合双方按「存活数 × 单位伤害」同时结算,谁的血量池先见底谁输。复用 core.ts 的 resolveBattle 跑枪兵 300 对骑兵 300,3 回合收敛;再给回放日志算 FNV-1a 指纹,Python 与 TypeScript 哈希同为 0x71e54817。
命中与暴击让伤害从确定值变成分布:85% 命中、25% 暴击、180% 暴击倍率,解析期望恰为 204。用自实现确定性 PRNG(mulberry32,Python 与 TypeScript 同算法同种子)跑 20 万次,实测均值 203.961、偏差仅 0.01%,并说明暴击真正的代价是方差而不是均值。
把 SLG 的伤害从「按比例扣血」还原成一行可判定的整数公式:攻击乘倍率、减去防御、再取保底。用配置驱动的《王朝纪元》护甲扫描(5 档攻击 × 6 档防御 × 3 档地形)复现线性减法模型,演示低攻高防撞上 1 点伤害地板、以及减伤上限为什么必要。
2.2 是从参数推结果,本节反过来:先写下想要的目标体验(累计成本锚点、第几天到几级),再用最小二乘反推曲线参数。我们用 numpy 手写最小二乘比较指数与幂律两个模型,跑出拟合优度与锚点残差,最后反推出达标所需的成本增长率。整个过程只需一份整数配置,全程可复现。
2.1 讲的是「升级变强多少」,本节讲「升级要花多少」。升级成本按整数比复利增长,与每小时有效产出一比,就得到真正的门槛:攒够一级要几小时、满级要几天。我们复用 bastion_core 与伐木场口径逐级对账,并做一组成本增长率的敏感性扫描,看门槛怎么从 8 天翻到 105 天。
成长曲线只有四种基本家族:线性、指数、对数(饱和型)与分段。本节把四族放进同一份整数配置,在 1–30 级上逐级求值,用「末首倍率、加速比、中点占比」三个标量给曲线做体检,并跑出一张四族对比 SVG。指数与分段末值几乎相同,形状却完全相反——这正是选型的关键。
验收在 Python 侧跑完了,交付前还差最后一步:亲手证明同一份配置在 S 与 P 两侧算出同一串数。本篇给出一段配置驱动的原型回放,把结算、战斗、赛季推进串成一条确定性转录,用 node --test 钉成断言,再在原型层复核跨章不变量,最后收束整部设计案的交付。
装配只保证了产物齐全,验收才回答「数对不对」。本篇把前面各章留下的产物汇总进一次全链路验收,逐项断言关键不变量:经济守恒、战力排序、概率归一、匹配收敛、赛季压缩在带内、实验第一类错误率覆盖。检查分声明式与派生两类,覆盖 S 仿真、P 原型、B 基准三层,再补一层余量基准看结论过得稳不稳。
前 15 章各产出一批 config、sim、proto 与 out 产物,收尾这一章要做的不是再写一套结论,而是把它们装配成一份可交付的设计案。本篇给出一份装配清单,把两卷 30 章的代表性交付物登记成可追溯索引,跑一个脚本逐条核对「配置源 + 产物」是否真的在磁盘上,并报告覆盖度。
联盟从健康到瓦解不是一夜之间。这一节用「健康 vs 衰退」两个剧本逐日对照,量出谁先亮红灯:贡献率第 27 天、参与率第 29 天就先越线,而流失率要拖到第 52 天才超标——等流失率起来人早就心散了,预警真正该盯的是前两个领先指标,不是流失率。
GVG 是「一群人对一群人」。这一节把联盟总战力配对与三据点战场结算都建成可跑模型:按窗口 5000 配对时战力差 2482、碾压率 0%,窗口放宽到 20000 时碾压率飙到 34.8%;再用 30 个种子的 B 基准证明匹配均衡度与战场时长偏差都稳定。
联盟是 SLG 的社交骨架:一群人的贡献高度不平均,少数核心扛着大多数人。这一节把贡献分布与贡献配额建成可跑模型,扫描 0 到 150 的配额,看联盟在留存率与保留产出率之间怎么权衡——配额 40 只丢 6% 的人,却保住 97.3% 的产出。
把 10000 名玩家按排名分成王者、精英、骨干、活跃、休闲五段,逐段算出结算发放:总发放 850 万玉璧,前 1% 拿走 9%、前 10% 拿走 41%,量出奖励集中度。再用 TS 原型对同一份配置重算一遍保证逐位一致,并算清「结算 1 天 + 准备 3 天」的过渡期占整个 64 天周期的 6%,玩家在这段时间里没有赛季进度产出。
把登录签到、成长竞赛、联盟战、通行证、累充等活动拆成面额、参与率、次数三个数,逐项累加算出赛季奖励预算,再折算成赛季产出预算的比例:按参与率加权后 29%、落在 30%±8% 的目标带内;而把面额直接相加会得到 44%、越界 15 个百分点。用 B 层基准量出「忽略参与率」这个最常见的估算错误。
把 60 天赛季切成开荒、成长、对抗、收官四段,把每日签到、周常任务、成长竞赛、联盟战、收官冲刺等活动铺到每一天上,算出每日活动负载、峰均比 3000‰ 与收官相对开荒的抬升 4500‰。用一份可跑的排期模型回答:赛季该分几段、活动该排多密,才能既填满节奏、又不把玩家在峰值日压垮。
统计显著不等于值得上线。本节把一次实验结果压成可执行的决策:算提升点估计、两比例 z 检验的 p 值、差值的 95% 置信区间与当前样本量下的最小可检测效应,再用业务门槛与护栏指标给出「回滚 / 继续观察 / 全量」的判定,并算出要越过门槛还差多少样本。
显著性不是「p 小于 0.05」这么简单。本节不引入 scipy,用 numpy 手写正态 CDF、两比例 z 检验、Welch t 检验与样本量公式,再用蒙特卡洛实测第一类错误率,量化偷看、多重比较、SRM 与辛普森悖论四个陷阱,并用 B 基准把模拟值与理论值逐项对照。
A/B 实验的第一步是把用户稳定地分到对照组与实验组。本节用确定性 PRNG mulberry32 与 user_id 的 FNV-1a 哈希实现可复现的稳定分流,本机跑出 10 万用户的分桶比例、偏差与稳定性,并量化「每次曝光都重抽」的不稳定分流会让多少用户同时看到多个变体,说明为什么分流必须先于显著性。
留存曲线的形状在第 11 章讲过,这一节讲怎么把新手漏斗和 D1/D7/D30 队列算出来并做分群诊断。用 config/n12_retention.json 定义漏斗各步与三类分群的逐日生存参数,S 层脚本用确定性 PRNG 跑出漏斗人数与 D1/D7/D30,P 层用 TypeScript 同种子复算并断言逐位一致。