这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
11.1 整数化与跨语言一致
浮点让同一份规格在两个宿主上算出不同的末位,跨语言一致就无从谈起。本节给出三条跨语言纪律——预算与阈值一律整数、随机一律自实现可播种 PRNG、config 禁浮点——并把暴击判定、倍率、千分比、向上取整、整数幂逐条改写成整数写法,用一张对照表列出两语言的同一结果。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
浮点让同一份规格在两个宿主上算出不同的末位,跨语言一致就无从谈起。本节给出三条跨语言纪律——预算与阈值一律整数、随机一律自实现可播种 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 节完整清单。
把 InputStream、Reader 与 Charset 的关系拆成三层:字节、字符、编码;用 library 的 CSV 读写演示显式 UTF-8、BOM 处理、严格解码与缓冲包装,并说明 PrintWriter 吞异常、默认字符集和二进制文本混用这三类常见故障。
把「回声」的客户端拆成信息流、详情、互动、实时四条消费线,逐条说明每条线需要什么数据、失败时能退到哪里,并用一段可运行的 TypeScript 把四条面的需求写成结构化输出与测试,最后复盘一次四件事混在一个页面里导致状态互相踩踏的真实事故。
从 File 的布尔返回值讲起,说明 Path 如何表达路径、Files 如何完成读写与属性查询;用 library 的 CSV 落盘串起 resolve、relativize、createDirectories、临时文件与 ATOMIC_MOVE,并给出多进程下避免半个文件的写法与常见边界。
从 CommandParser 解析失败和 exportLoans 的 IOException 出发,讲清技术异常、领域异常与用户可见错误的三层分工;再把 NumberFormatException 包装成 InvalidCommandException、在 CLI 边界统一映射 ErrorCode 与退出码,给出真实输出,并列出丢失 cause、重复记日志、吞异常等边界。
从手工 finally 关闭两个资源时异常互相覆盖的问题出发,讲清 AutoCloseable 的契约、try-with-resources 的逆序关闭和异常抑制机制;再把 AuditLog 与 LoanBatch 接到 library 的借阅审计和报表导出上,并给出资源未实现 AutoCloseable、close 抛异常、所有权误用等真实输出与边界。
《游戏美术与技术美术》卷三《风格与品类美术实战》附录:全卷风格参数与公式索引、st<章号>_ 工具链命名约定、六层可运行性口径与逐层复现命令,并给出可跑的 S 层清点脚本与 P 层索引校验内核,两者对同一份工作区算出的清单与摘要逐位一致,并附一键复现与排错顺序。
等距资产不能随便画尺寸:底菱要落在半行网格上、宽度要偶数才能整数居中、锚点必须是底菱中心、单件还得装进图集格。本节把 C1–C6 这 6 条约束写成整数判据,对《星屑旅店》的 6 件等距资产逐件过账,让灯具半行不对齐、雨棚超格超宽这三条真实违例当场现形。
等距板只要有两格以上高度,就会出现遮挡。本节把绘制顺序与遮挡深度都写成整数规则:按 (tx+ty, tx) 升序落笔,深度数同屏幕列 (tx-ty) 上位于本格前方、blockHeight ≥ 1 的地块数,超过 cap 判越界;再用单文件 HTML 看板并排画两套主题,Playwright 断言整数账与 Python 逐位一致。
等距(2.5D)是一套跨主题的投影,不是主题包:tile 宽高定死之后,cozy-clean 与 voxel 的屏幕坐标逐位相同。本节用与卷一 [16.2 双案例回放:《星屑旅店》6 主题的规范装配] 同源的整数变换,算《星屑旅店》8×8 地板的正变换、逆变换回程、包围盒与菱形填充率,并证明投影与主题正交。
引擎不吃体素,吃三角网格,所以体素美术的最后一关是「体素 → 网格」的转换账。本节用《星屑旅店》的体素灯具算两种路线:朴素路线每个暴露面出 1 个四边形(476 三角),贪心合并把同朝向同色共面的相邻面并成矩形(60 三角),合并率 873 千分比;再与三角预算和材质槽预算对账。
体素美术通常不做实时求值光照,而是把每个面朝向的亮度烘成固定档位。于是最终颜色数 = 基础色数 × 档位数——这条乘法就是调色板上限的账。本节用《星屑旅店》的体素灯具算这笔账:6 个面朝向直接着色会得到 18 色、越过 16 色上限,折叠成 4 个档位后回到 12 色,并让 Python 与 TypeScript 各自独立复算、逐位对齐。
体素风格看起来只是「把东西做成方块」,落到规范上却是一笔干净的整数账:格子里有多少体素、包围盒多大、多少个面被相邻体素挡掉、多少格完全埋在内部。本节把《星屑旅店》的体素灯具用 8 个轴对齐盒描述,光栅化成网格,算体素数、包围盒、暴露面与剔除面,并让 Python 与 TypeScript 各自独立复算、逐位对齐。