这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
1.3 路径的回放与复现
同一条选择序列推进两次,走出的状态必须逐位一致。本节用三条证据钉死这件事:确定性序列回放两次摘要相同、每个前缀从零重放等于全程记录、500 条采样序列各自回放两次逐条一致,并说明「回放无隐藏状态」到底在保证什么、为什么它是本卷所有度量的前提。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
同一条选择序列推进两次,走出的状态必须逐位一致。本节用三条证据钉死这件事:确定性序列回放两次摘要相同、每个前缀从零重放等于全程记录、500 条采样序列各自回放两次逐条一致,并说明「回放无隐藏状态」到底在保证什么、为什么它是本卷所有度量的前提。
同一条路径可以写成三种编码:人可读的规范串、机器可比的紧凑整数元组、以及只对状态算的 FNV-1a 摘要。本节给出三种编码的构造规则,并用 Python 与 TypeScript 两侧对同一条路径算出逐位一致的结果,说明摘要绑定的是编码串而不是文本。
一次通关可以被拆成三种表示:玩家按下的选择序列、引擎走出的节点序列、以及每一步之后的完整状态轨迹。本节用《雾港夜航》的首选项确定性策略走完一条 25 步路径,逐步骤打印好感度、置位 flag、持有物品与 FNV-1a 状态摘要,并给出节点数等于选择数加一的整数不变量。
《叙事策划与叙事工艺》卷三《叙事体验与路径度量》目录:16 章 48 节,把玩家路径变成可度量的对象——路径的表示与采样、分支覆盖率与缺口、结局分布熵、张力曲线与 MAE、后果可见性、节奏密度、好感度曲线形状、一致性残差,以及反推与演化回归。本页给出分工说明、六档可运行性口径与全书 16 章 48 节完整清单。
说明压测结果为什么不能把各实例 P99 取平均:用桶计数合并的 Go 实现与测试证明平均 P99 会低估长尾;再给出基于目标利用率、N+1 故障域与扩容阈值的容量余量公式和 arch-lab 订单系统算例,并列出只能写「不可判定」的证据条件。
把测试从「跑过」变成「可验收」:用 JaCoCo 的 LINE 与 BRANCH 计数读懂报告,按模块设置 60% 行覆盖率门槛,在 quality profile 里串起编译、测试、Checkstyle、SpotBugs 和覆盖率,最后落到一条 CI 命令。
实时选型常被简化成「聊天就上 WebSocket」,但真实约束远不止消息方向。本节把延迟、在线规模、运维能力、二进制与上行频率写成结构化输入,用可测试的打分函数输出推荐、置信度与警告,说明同一份需求为什么允许有两个合理答案,并给出四组场景的分数对照与一次选型回滚复盘。
规格演化后(新增 flag、新增物品、新增好感度变量、新增节点),旧存档必须仍能读。本节实跑兼容性矩阵:四种新规格下旧存档全部读入成功并给出补默认值规则;迁移函数三条判据——缺失字段补默认、多余字段丢弃并报告、类型不符拒绝——逐条在本机实跑验证。
区分 Checkstyle 管源码风格、SpotBugs 管字节码缺陷:给出一份只保留命名、导入、大括号和魔法数字的精简规则集,用真实违规输出解释阈值与抑制范围,再用 CT_CONSTRUCTOR_THROW 说明 SpotBugs 的第一条告警为什么把异常类声明为 final 就能修复。
《叙事策划与叙事工艺》卷二《叙事引擎与分支系统》附录 A:把全卷 16 章 48 节散落的对话树节点与选项字段、嵌套数组条件文法与四类效果算子汇成索引表,给出本卷 S/P/W/D 四层共 43 个仿真脚本、31 个内核模块与 37 份产物的实盘清点,并附一段可跑的 TypeScript 对话树格式检查器——它连同三个注入负例证明格式约定不是纸面条文。
浏览器里走完同一条确定性策略路径(总是选第一个可用选项,共 25 个事件),读出终局状态,与 Python 侧产物比对 canonical 串与 FNV-1a 摘要。三侧锚点一致:摘要 4162796975、节点 e_lit、结局 灯守。只对整数状态写逐位一致。
给可玩原型挂一套稳定的 data-* 选择器契约:当前节点、每个选择按钮、四个好感度、已置位 flag、持有物品各有一个可寻址的属性。再用 Playwright 无头打开这页单文件 HTML,断言 DOM 已绘制、按钮数等于当前可用选项数、点击后节点推进。
把 config/story_spec.json 与 core/src/inkwell/engine.ts 一起内联进一个单文件 HTML,产出 web/dist/ne09.html。本节实测产物 41641 字节、script src 0、外部 http(s) 链接 0,给出零外部依赖的自检口径与双击即玩的最小交付形态。
四条必须恒为 0 的残差:钳位(可达状态与转移后都在 [0,100] 内)、初值(每个声明角色的 init 落在自身 range 内)、累积口径(新值恒等于 clamp(旧值 + add),set 不写好感度)、门限可达性(15 条门限均可跨过)。四条残差合计 0;lin 与 hai 有 affinity 声明却不在 state.vars,按「声明未用=报告,用了未声明=FAIL」报告。
好感度的分段在规格里就是一串 [aff, 名, >=, 整数] 阈值门,长在选项 when、节点 line_when、结局 when 三处。本节把 15 条门限全抽出来,再逐条扰动 ±5,在同一采样口径下重算覆盖率与可达结局集合,找出 4 条临界门限;并如实说明为什么放宽 5 点不起作用而收紧 5 点才起作用——基线覆盖率已饱和在 1000‰。B 层只打印 WARN,退出码 0。
好感度是一台受钳位约束的整数状态机:状态 = 节点 + 4 个好感度整数 + 18 个 flag + 9 个物品。本节把《雾港夜航》的完整状态空间 BFS 一遍,实测四个变量的可达值域分别是 yan 21、hui 35、shen 12、mu 16,值域之积 141120,而真正可达的好感度四元组只有 87190——四个变量之间并不独立。P 层用同一批选项断言初值来源、add 累加与钳位。
把分支宽度与深度当两条扰动轴:宽度因子 k 把每个有选项节点的出度乘以 2、3、4,路径数从约 4.50×10 的 11 次方一路涨到 10 的 30 次方量级,而去重跳转覆盖率始终 1000‰ 纹丝不动;深度预算 L 把探索限制在 L 步内,可达覆盖率随 L 上升、在 L=22 触顶。B 层只打印软告警,恒 exit 0。
路径数有两层上界:朴素乘积上界 5 的 31 次方约 4.66×10 的 21 次方,真实结构路径数 450208471680,剪枝后 BFS 可达边 115/115 即 1000‰。本节推导优惠券收集器的采样上界(覆盖 115 条边约 613 条路径),并实测随机与贪心两种策略在 N=100/1000/10000/20000 下的覆盖率收敛曲线。
宽度就是一个节点的出度:同时摆在玩家面前的选项数。本节给 48 个对话节点量出度,实测直方图是 5 个 0 出度、16 个 2 出度、26 个 3 出度、1 个 5 出度,最宽的一步是 d_dq_2 的 5 个选项;再按边距离分 23 层看每层宽度,并把 115 个选项去重成 56 条唯一跳转、47 个不同目标。
5 个结局(灯守 / 离港 / 真相 / 缄默 / 沉没)全部可达,但可达不等于易达。本节为每个结局给出一条真实可回放的到达路径,再用 20000 条均匀随机采样算分布:离港 10074、沉没 5507、缄默 3223、灯守 1018、真相仅 178。并厘清 endings 的 id 与 dialogue 的 ending 两个口径。