纠正仓库内容为衍生项目,标明 campaign-200-r2 最新版
This commit is contained in:
@@ -0,0 +1,645 @@
|
||||
# NumberSwipe 50关DEMO设计与难度曲线
|
||||
|
||||
版本:2026-10-14 v1。面向首次接触的新玩家,目标是验证趣味性、规则理解与章节节奏。当前交付是关卡制作任务与目标曲线,没有具体坐标、作者解或50关可玩包。
|
||||
|
||||
## 研究如何适配本项目
|
||||
|
||||
研究正文来源:G:/下载/NumberSwipe_Research_H5.html。源文件SHA-256记录在demo-design.json;报告中的外部Zip统计未在本项目复算。采用有效分叉、区域风险、错误发现延迟、目标跨度、逻辑依赖和视觉操作负担的分层思路。公式权重、章节8/9/10节拍及报告首通指标均是待测假设。
|
||||
|
||||
本项目数字表示绝对访问步号,不能将Zip的编号升序直接迁移。每个拼块一步、每格恰好一次、共边移动、完整有序解唯一。按节点数量使用5–19格,不迁移研究报告6×6/7×7的面积规模。普通方格固定起点下目标格奇偶由天然二分图固定,奇偶优先放在大格或无双色的六边盘。双色严格交替时不叠加奇偶。方向通道仅用于单位方格整盘。步进门空盘关、起点也切换,出发前判门位、撤销恢复。单位方格门题主要判断通过方向;通过大格或含三角邻接的六边图才强调不同路线的到达状态。
|
||||
|
||||
保留当前五个原型及已认可的40关作为参考,不恢复相对步差、先后链、窗口或开关格。当前Variants没有奇偶判定,双色启用仍依赖mode名称:组合主线落地需独立增加features开关、奇偶判定/提示/求解器/必要性检查,并限制图示与实际规则一致。本轮不修改这些运行代码,不调整手机体验。
|
||||
|
||||
## 节拍选择
|
||||
|
||||
默认A:每10关第8关峰值、第9关释放、第10关收束。新机制采用演示→练习→变化→组合→巩固的五关单元;不要求每个10关章都新增规则。
|
||||
|
||||
B为对照:同一套题,把各章第8关移到第10关,9/10关前移为8/9。A/B拥有完全相同关卡ID和内容,只改变顺序。首次制作先校验A,再与B比较。不是随机动态调难。
|
||||
|
||||
前两关完成操作教学;大格与墙在1–10关;方向与双色在11–20关;奇偶与门在21–30关;六边迁移在31–40关;最后10关只深化组合。保留两次起点未知(37、38),不把起点未知作为所有关卡的固定难度旋钮。
|
||||
|
||||
目标分0–100是策划标尺,不是搜索节点数、通过概率或玩家实测难度。各章目标峰值40/46/50/58/72,最后一关54分收束,不在50关耗尽难度上限。释放题也必须有可解释的选择,避免机械蛇形或连续闭眼画。
|
||||
|
||||
## 五章目标
|
||||
|
||||
| 关卡 | 阶段 | 新内容 | 峰值关/目标分 |
|
||||
|---|---|---|---|
|
||||
| 1–10 | 覆盖、大格与墙 | 大格一步、永久墙 | 8/40 |
|
||||
| 11–20 | 方向与双色 | 六种明确通道、换颜色 | 18/46 |
|
||||
| 21–30 | 奇偶与步进门 | 步号奇偶、每步切换门 | 28/50 |
|
||||
| 31–40 | 六边迁移与起点推理 | 六向邻接、未知起点 | 38/58 |
|
||||
| 41–50 | 组合应用与收束 | 不新增规则 | 48/72 |
|
||||
|
||||
## 最新项目研究补充与桥接验证
|
||||
|
||||
已纳入原项目docs/一笔画竞品调研与关卡编排方案.md、2026-10-14补充的《一笔画深度调研-制作与难度证据.md》及45关结构审计JSON。该审计针对原项目26数字关+19六边关;本次另行读取Variants的40关,二者不能混为同一题库的验收。
|
||||
|
||||
技能依赖:覆盖/纠错→大格计步→枢纽出口→异形共边;基本共边→横竖端口→明确拐角→方向联合;精确步号与实际拼块图→单奇偶→双奇偶;步号与撤销→起步切换→通过方向→大格到达状态;熟悉墙→六向共边→旧规则迁移。未知起点依赖端点和步号推理,先小盘专项。
|
||||
|
||||
先制作并测试6道桥接样题,均计入50关:
|
||||
|
||||
|设计号|验证任务|控制变量|
|
||||
|---|---|---|
|
||||
|05|异形共边|只增加L形读盘,不叠奇偶或未知起点|
|
||||
|13|拐角端口|只增加一种明确拐角,能解释反向通过|
|
||||
|18|双色与墙联合|先掌握16/17,再测试异色出口保留|
|
||||
|21|单奇偶|按节点计步,条件必要,不靠天然属性|
|
||||
|24|双奇偶与区域|先掌握21–23,每条条件各自有效|
|
||||
|28|大格与门位|先掌握26/27,检查实际步数关系|
|
||||
|
||||
教学测试按课程顺序。难度校准先让玩家学会对应规则,再交错代表题,避免把学习熟练或记忆同盘答案误判为题更容易。四层去重分别检查外观几何、真实邻接、约束配置、关键解法;几何相同且推理不同可以少量保留,四层等价仅限明确强化用途。
|
||||
|
||||
## 逐关制作任务
|
||||
|
||||
表中格数、约束预算与曲线为候选制作目标;盘面通过验证与试玩之前都不能标记为完成。格式是设计任务数据,不是游戏可直接读取的关卡JSON。
|
||||
|
||||
### 第1章 · 覆盖、大格与墙
|
||||
|
||||
结束操作教学,建立计步与区域收尾。
|
||||
|
||||
|关|标题/功能|格数|机制|目标分|核心任务|
|
||||
|---:|---|---:|---|---:|---|
|
||||
|1|第一笔 · 演示/热身|5|数字基础|12|理解全格覆盖与固定步号|
|
||||
|2|先收短支路 · 练习|8|数字基础|16|根据端点与剩余区域判断访问顺序|
|
||||
|3|大块一步 · 变化|8|大格/异形|20|按拼块而非面积计步|
|
||||
|4|枢纽留后 · 组合|10|大格/异形|22|决定何时使用大格枢纽|
|
||||
|5|认清异形共边 · 巩固|11|大格/异形|26|异形整块一步,辨认哪些边实际共边|
|
||||
|6|边上的墙 · 演示/迁移|9|墙|30|认识永久封边,靠数字选绕行方向|
|
||||
|7|近路要绕 · 练习/挑战|11|墙|35|先观察墙改变了哪些邻接|
|
||||
|8|第一座桥 · 章节峰值|13|大格/异形+墙|40|大格必须留到完成一侧之后|
|
||||
|9|绕过去就好 · 释放|9|墙|24|以一次短推理完成释放关|
|
||||
|10|对称小花园 · 收束|12|大格/异形+墙|28|迁移已学规则并顺畅结束章节|
|
||||
|
||||
#### 01 · 第一笔
|
||||
|
||||
- 盘面:紧凑小盘;一个浅分叉,终点清晰。
|
||||
- 条件预算:数字1、5。
|
||||
- 顿悟:理解全格覆盖与固定步号。
|
||||
- 诱惑路线:直接滑向终点,留下一个未走格。
|
||||
- 排除依据:终点到达时仍有剩余格,必须先覆盖。
|
||||
- 目标:分值8–16;有效关键选择1–2处;最长依赖约1层;思考时间P50候选目标8–18秒。
|
||||
|
||||
#### 02 · 先收短支路
|
||||
|
||||
- 盘面:主区旁有短支路;支路不是视觉隐藏格。
|
||||
- 条件预算:数字1+一个中段数字。
|
||||
- 顿悟:根据端点与剩余区域判断访问顺序。
|
||||
- 诱惑路线:先进入主区,支路失去可续接入口。
|
||||
- 排除依据:完整覆盖要求保留支路访问机会。
|
||||
- 目标:分值12–20;有效关键选择1–2处;最长依赖约1层;思考时间P50候选目标8–18秒。
|
||||
|
||||
#### 03 · 大块一步
|
||||
|
||||
- 盘面:两条候选路线视觉长度相近,经过拼块数不同。
|
||||
- 条件预算:一个2×2大格;数字1+中段数字。
|
||||
- 顿悟:按拼块而非面积计步。
|
||||
- 诱惑路线:把大格误当多步,选择面积更短的一侧。
|
||||
- 排除依据:实际步号对不上中段数字。
|
||||
- 目标:分值16–24;有效关键选择1–2处;最长依赖约1层;思考时间P50候选目标12–35秒。
|
||||
|
||||
#### 04 · 枢纽留后
|
||||
|
||||
- 盘面:两片区域通过两个通口连接,大格位于路线中段。
|
||||
- 条件预算:一个多出口大格;少量数字。
|
||||
- 顿悟:决定何时使用大格枢纽。
|
||||
- 诱惑路线:过早进入大格并从近出口离开。
|
||||
- 排除依据:剩余区域无法接续或不能按时到数字。
|
||||
- 目标:分值18–26;有效关键选择1–2处;最长依赖约1层;思考时间P50候选目标12–30秒。
|
||||
|
||||
#### 05 · 认清异形共边
|
||||
|
||||
- 盘面:凹口接触邻格;只新增异形读盘,不同时增加未知起点。
|
||||
- 条件预算:一个L形格+早期引导数字;不加奇偶。
|
||||
- 顿悟:异形整块一步,辨认哪些边实际共边。
|
||||
- 诱惑路线:按包围盒把凹口当成块内,错误认定邻接。
|
||||
- 排除依据:以真实占地共边判邻接,不能跨空洞。
|
||||
- 目标:分值22–30;有效关键选择1–2处;最长依赖约1层;思考时间P50候选目标12–35秒。
|
||||
|
||||
#### 06 · 边上的墙
|
||||
|
||||
- 盘面:墙封住明显直达边;绕行仍有两种选择。
|
||||
- 条件预算:一堵必要墙;数字1。
|
||||
- 顿悟:认识永久封边,靠数字选绕行方向。
|
||||
- 诱惑路线:把墙当作一个格,或尝试穿过。
|
||||
- 排除依据:墙只封边,另一条真实共边才可通行。
|
||||
- 目标:分值26–34;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标12–35秒。
|
||||
- 原型参考:walls/02, walls/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 07 · 近路要绕
|
||||
|
||||
- 盘面:空间近而路径远,墙后保留区域出口。
|
||||
- 条件预算:一至两堵必要墙;一个中段数字。
|
||||
- 顿悟:先观察墙改变了哪些邻接。
|
||||
- 诱惑路线:先绕进近侧,过早占用唯一续接节点。
|
||||
- 排除依据:后段覆盖或步号不成立。
|
||||
- 目标:分值31–39;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标12–30秒。
|
||||
- 原型参考:walls/02, walls/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 08 · 第一座桥
|
||||
|
||||
- 盘面:两片区域有两个通口,墙与大格共同限制跨区顺序。
|
||||
- 条件预算:一个大格;两堵必要墙。
|
||||
- 顿悟:大格必须留到完成一侧之后。
|
||||
- 诱惑路线:先走枢纽,再试图回补区域。
|
||||
- 排除依据:大格只能一次,剩余区域被切断。
|
||||
- 目标:分值36–44;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标20–45秒。
|
||||
- 原型参考:walls/02, walls/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 09 · 绕过去就好
|
||||
|
||||
- 盘面:小盘面,墙排除一个清楚的诱惑方向。
|
||||
- 条件预算:一堵必要墙;起点给定。
|
||||
- 顿悟:以一次短推理完成释放关。
|
||||
- 诱惑路线:忽略墙尝试直达。
|
||||
- 排除依据:正确绕行只需一个局部判断。
|
||||
- 目标:分值20–28;有效关键选择1–2处;最长依赖约1层;思考时间P50候选目标12–28秒。
|
||||
- 原型参考:walls/02, walls/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 10 · 对称小花园
|
||||
|
||||
- 盘面:近似对称外形,内部线索清楚打破对称。
|
||||
- 条件预算:一个大格;一堵必要墙。
|
||||
- 顿悟:迁移已学规则并顺畅结束章节。
|
||||
- 诱惑路线:按外形镜像照走。
|
||||
- 排除依据:线索和墙形成可见的不对称依据。
|
||||
- 目标:分值24–32;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标12–28秒。
|
||||
- 原型参考:walls/02, walls/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
### 第2章 · 方向与双色
|
||||
|
||||
明确进出边,再规划异色续接。
|
||||
|
||||
|关|标题/功能|格数|机制|目标分|核心任务|
|
||||
|---:|---|---:|---|---:|---|
|
||||
|11|左右通道 · 演示/热身|9|方向|24|认识左右两边连接、可反向通过|
|
||||
|12|上下通道 · 练习|10|方向|28|独立区分横线和竖线|
|
||||
|13|认清拐角 · 变化|11|方向|32|辨认拐角连接边,不把它理解成单向右转|
|
||||
|14|两角相接 · 组合|13|方向+墙|35|用后段出口反推前段入口|
|
||||
|15|直线与拐角 · 巩固|14|方向+墙|38|巩固明确边配对与区域收尾|
|
||||
|16|蓝橙第一步 · 演示/迁移|9|大格/异形+双色|26|认识每步换颜色,大格仍一步|
|
||||
|17|留下另一种颜色 · 练习/挑战|12|大格/异形+双色|32|不能仅以颜色合法判断下一步|
|
||||
|18|双色跨区 · 章节峰值|15|大格/异形+双色+墙|46|先定访问顺序,再选异色出口|
|
||||
|19|短短的接力 · 释放|10|大格/异形+双色|32|以已掌握规则降低认知负担|
|
||||
|20|双色回环 · 收束|13|大格/异形+双色|36|稳定应用双色和一步大格,顺畅收束|
|
||||
|
||||
#### 11 · 左右通道
|
||||
|
||||
- 盘面:通道还有上下几何邻格。
|
||||
- 条件预算:一个lr通道;起点给定。
|
||||
- 顿悟:认识左右两边连接、可反向通过。
|
||||
- 诱惑路线:从上或下进入通道。
|
||||
- 排除依据:图示只连接左右边。
|
||||
- 目标:分值20–28;有效关键选择1–2处;最长依赖约1层;思考时间P50候选目标12–35秒。
|
||||
- 原型参考:direction/01, direction/02, direction/04;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 12 · 上下通道
|
||||
|
||||
- 盘面:把横向题的结构改为纵向应用,增加一处分叉。
|
||||
- 条件预算:一个du通道。
|
||||
- 顿悟:独立区分横线和竖线。
|
||||
- 诱惑路线:从左侧切入纵向通道。
|
||||
- 排除依据:进出边必须是上与下。
|
||||
- 目标:分值24–32;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标12–35秒。
|
||||
- 原型参考:direction/01, direction/02, direction/04;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 13 · 认清拐角
|
||||
|
||||
- 盘面:拐角格至少有三个邻格,图形指向两边。
|
||||
- 条件预算:一个明确拐角;中段数字。
|
||||
- 顿悟:辨认拐角连接边,不把它理解成单向右转。
|
||||
- 诱惑路线:使用另一种转弯方向。
|
||||
- 排除依据:图形未连接的边不能成为进出边。
|
||||
- 目标:分值28–36;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标12–35秒。
|
||||
- 原型参考:direction/01, direction/02, direction/04;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 14 · 两角相接
|
||||
|
||||
- 盘面:前后通道共享一片区域的入口出口选择。
|
||||
- 条件预算:两个不同拐角;一堵必要墙。
|
||||
- 顿悟:用后段出口反推前段入口。
|
||||
- 诱惑路线:先满足第一个通道,却留错第二个入口。
|
||||
- 排除依据:两个通道要求必须同时成立。
|
||||
- 目标:分值31–39;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标15–40秒。
|
||||
- 原型参考:direction/01, direction/02, direction/04;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 15 · 直线与拐角
|
||||
|
||||
- 盘面:旧结构换成新方向布局,保持两三个有效分叉。
|
||||
- 条件预算:一横或竖通道+一拐角;一堵墙。
|
||||
- 顿悟:巩固明确边配对与区域收尾。
|
||||
- 诱惑路线:通道局部满足但走过区域出口。
|
||||
- 排除依据:剩余区域无法完整覆盖。
|
||||
- 目标:分值34–42;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标15–40秒。
|
||||
- 原型参考:direction/01, direction/02, direction/04;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 16 · 蓝橙第一步
|
||||
|
||||
- 盘面:至少一处同色共边,色彩鲜明。
|
||||
- 条件预算:一个大格;两色全盘;起点给定。
|
||||
- 顿悟:认识每步换颜色,大格仍一步。
|
||||
- 诱惑路线:走向共享边的同色邻格。
|
||||
- 排除依据:下一步必须另一种颜色。
|
||||
- 目标:分值22–30;有效关键选择1–2处;最长依赖约1层;思考时间P50候选目标12–35秒。
|
||||
- 原型参考:block-alternation/03, block-alternation/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 17 · 留下另一种颜色
|
||||
|
||||
- 盘面:大格有多个异色出口,只有一个能续接全盘。
|
||||
- 条件预算:大格双色;一个必要中段数字。
|
||||
- 顿悟:不能仅以颜色合法判断下一步。
|
||||
- 诱惑路线:走向合法异色近出口。
|
||||
- 排除依据:后段区域缺少异色续接机会。
|
||||
- 目标:分值28–36;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标15–40秒。
|
||||
- 原型参考:block-alternation/03, block-alternation/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 18 · 双色跨区
|
||||
|
||||
- 盘面:两个区域的跨区出口同时受颜色和墙影响。
|
||||
- 条件预算:两个多单位块;两堵必要墙。
|
||||
- 顿悟:先定访问顺序,再选异色出口。
|
||||
- 诱惑路线:选当前合法的异色出口,提前跨区。
|
||||
- 排除依据:另一区域无法按交替顺序收尾。
|
||||
- 目标:分值42–50;有效关键选择3–4处;最长依赖约3层;思考时间P50候选目标20–45秒。
|
||||
- 原型参考:block-alternation/03, block-alternation/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 19 · 短短的接力
|
||||
|
||||
- 盘面:小盘面,一个明确的同色诱惑与一个收尾判断。
|
||||
- 条件预算:一个大格;少量数字。
|
||||
- 顿悟:以已掌握规则降低认知负担。
|
||||
- 诱惑路线:误走同色共边或留错最后异色格。
|
||||
- 排除依据:颜色与覆盖条件给出直接排除。
|
||||
- 目标:分值28–36;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标12–28秒。
|
||||
- 原型参考:block-alternation/03, block-alternation/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 20 · 双色回环
|
||||
|
||||
- 盘面:视觉呈回环,但路径不闭合;出口清楚。
|
||||
- 条件预算:一个长条或大格;起点给定。
|
||||
- 顿悟:稳定应用双色和一步大格,顺畅收束。
|
||||
- 诱惑路线:为追求形状闭合而提前封住尾段。
|
||||
- 排除依据:完成要求是覆盖路径,不是闭环。
|
||||
- 目标:分值32–40;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标12–28秒。
|
||||
- 原型参考:block-alternation/03, block-alternation/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
### 第3章 · 奇偶与步进门
|
||||
|
||||
真实步号与到达状态,五关单元引入。
|
||||
|
||||
|关|标题/功能|格数|机制|目标分|核心任务|
|
||||
|---:|---|---:|---|---:|---|
|
||||
|21|偶数落脚 · 演示/热身|10|大格/异形+奇偶|30|认识访问步号的偶数要求|
|
||||
|22|奇数绕行 · 练习|12|大格/异形+奇偶|34|独立应用奇数要求|
|
||||
|23|凹口的步号 · 变化|13|大格/异形+奇偶|39|迁移奇偶到异形区域|
|
||||
|24|墙后先收尾 · 组合|15|大格/异形+奇偶+墙|43|让墙影响区域顺序,再由奇偶筛掉另一选择|
|
||||
|25|少量线索也够 · 巩固|12|大格/异形+奇偶|36|巩固奇偶,避免连续多条件压力|
|
||||
|26|门随脚步开关 · 演示/迁移|9|步进门|32|起步也切换,移动前看门位|
|
||||
|27|从另一侧通过 · 练习/挑战|12|步进门|38|用步号判断通过方向,不假设绕路能改目标奇偶|
|
||||
|28|大块改变节拍 · 章节峰值|15|大格/异形+步进门|50|在大格图中规划真实到达状态|
|
||||
|29|墙和门分开看 · 释放|12|大格/异形+步进门+墙|40|以短组合应用释放认知负担|
|
||||
|30|顺着节拍收尾 · 收束|14|大格/异形+步进门|42|巩固大格计步与门位,完成顺畅章节收束|
|
||||
|
||||
#### 21 · 偶数落脚
|
||||
|
||||
- 盘面:两种区域顺序使标记落在不同奇偶步。
|
||||
- 条件预算:一个必要偶标记;一个大格;数字1。
|
||||
- 顿悟:认识访问步号的偶数要求。
|
||||
- 诱惑路线:按面积或颜色想象奇偶。
|
||||
- 排除依据:整块一步,实际访问步号必须为偶。
|
||||
- 目标:分值26–34;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标12–35秒。
|
||||
|
||||
#### 22 · 奇数绕行
|
||||
|
||||
- 盘面:换一类结构,保留两个访问顺序。
|
||||
- 条件预算:一个必要奇标记;长条。
|
||||
- 顿悟:独立应用奇数要求。
|
||||
- 诱惑路线:选择空间较短但步号为偶的路线。
|
||||
- 排除依据:拼块步数决定奇偶,距离不决定。
|
||||
- 目标:分值30–38;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标20–55秒。
|
||||
|
||||
#### 23 · 凹口的步号
|
||||
|
||||
- 盘面:凹口新增真实邻接,但不新增块内步数。
|
||||
- 条件预算:L形或T形;一至两个必要奇偶。
|
||||
- 顿悟:迁移奇偶到异形区域。
|
||||
- 诱惑路线:把凹口内单位方格拆开数步。
|
||||
- 排除依据:异形整块只访问一次。
|
||||
- 目标:分值35–43;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标20–55秒。
|
||||
|
||||
#### 24 · 墙后先收尾
|
||||
|
||||
- 盘面:区域有两个通口,墙限制一侧,奇偶限制次序。
|
||||
- 条件预算:两个必要奇偶;一至两堵墙。
|
||||
- 顿悟:让墙影响区域顺序,再由奇偶筛掉另一选择。
|
||||
- 诱惑路线:先满足一个奇偶却过早离开区域。
|
||||
- 排除依据:另一条件或剩余覆盖不成立。
|
||||
- 目标:分值39–47;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标20–55秒。
|
||||
- 原型参考:walls/02, walls/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 25 · 少量线索也够
|
||||
|
||||
- 盘面:比24关更短但保留一个可解释分叉。
|
||||
- 条件预算:一个必要奇偶;一个中段数字。
|
||||
- 顿悟:巩固奇偶,避免连续多条件压力。
|
||||
- 诱惑路线:机械沿边走,忽略到达步号。
|
||||
- 排除依据:奇偶直接排除这一条完整路线。
|
||||
- 目标:分值32–40;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标20–55秒。
|
||||
|
||||
#### 26 · 门随脚步开关
|
||||
|
||||
- 盘面:门在前段;能看到另一侧入口选择。
|
||||
- 条件预算:一道门;空盘关;数字1。
|
||||
- 顿悟:起步也切换,移动前看门位。
|
||||
- 诱惑路线:把门当静态墙或等待自动打开。
|
||||
- 排除依据:只有落格才切换,等待无效。
|
||||
- 目标:分值28–36;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标12–35秒。
|
||||
- 原型参考:rhythm-door/01, rhythm-door/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 27 · 从另一侧通过
|
||||
|
||||
- 盘面:普通方格中从正确一侧接近门。
|
||||
- 条件预算:一道门;一个中段数字。
|
||||
- 顿悟:用步号判断通过方向,不假设绕路能改目标奇偶。
|
||||
- 诱惑路线:从当前关闭的一侧接近,试图靠等待或同侧绕圈补拍。
|
||||
- 排除依据:正交单位格固定起点的格奇偶不随绕路改变。
|
||||
- 目标:分值34–42;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标20–55秒。
|
||||
- 原型参考:rhythm-door/01, rhythm-door/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 28 · 大块改变节拍
|
||||
|
||||
- 盘面:经过不同拼块的区域顺序影响到门时的步号。
|
||||
- 条件预算:一道门;一至两个大格。
|
||||
- 顿悟:在大格图中规划真实到达状态。
|
||||
- 诱惑路线:选择视觉近但落格次数不合适的接近路线。
|
||||
- 排除依据:门在出发前状态关闭。
|
||||
- 目标:分值46–54;有效关键选择3–4处;最长依赖约3层;思考时间P50候选目标30–75秒。
|
||||
- 原型参考:rhythm-door/01, rhythm-door/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 29 · 墙和门分开看
|
||||
|
||||
- 盘面:永久墙只阻一条边,门保留清楚的跨区判断。
|
||||
- 条件预算:一道门+一堵墙;短盘面。
|
||||
- 顿悟:以短组合应用释放认知负担。
|
||||
- 诱惑路线:把黑黄墙也当作会切换的门。
|
||||
- 排除依据:永久墙始终不可跨越。
|
||||
- 目标:分值36–44;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标18–40秒。
|
||||
- 原型参考:rhythm-door/01, rhythm-door/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 30 · 顺着节拍收尾
|
||||
|
||||
- 盘面:近似对称两区,关键经过时机清楚。
|
||||
- 条件预算:一道门;起点给定。
|
||||
- 顿悟:巩固大格计步与门位,完成顺畅章节收束。
|
||||
- 诱惑路线:门开就立刻跨区,留下本侧格。
|
||||
- 排除依据:需要先完成本侧再合法跨门。
|
||||
- 目标:分值38–46;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标18–40秒。
|
||||
- 原型参考:rhythm-door/01, rhythm-door/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
### 第4章 · 六边迁移与起点推理
|
||||
|
||||
旧规则迁移到六向几何,适度减少起点信息。
|
||||
|
||||
|关|标题/功能|格数|机制|目标分|核心任务|
|
||||
|---:|---|---:|---|---:|---|
|
||||
|31|六向邻接 · 演示/热身|10|墙|34|只新增六向几何,复用熟悉墙规则|
|
||||
|32|六边留出口 · 练习|13|墙|38|识别多出口枢纽,规划区域收尾|
|
||||
|33|六边换颜色 · 变化|13|双色|43|把交替迁移到六向盘面|
|
||||
|34|颜色之外还有墙 · 组合|15|双色+墙|47|分清颜色阻挡与墙阻挡,两者联动|
|
||||
|35|六边小花园 · 巩固|12|双色+墙|40|巩固六边迁移,以一次区域判断完成|
|
||||
|36|六边也有奇偶 · 演示/迁移|14|奇偶|44|把奇偶迁移到非天然黑白图|
|
||||
|37|起点没有写出 · 练习/挑战|12|奇偶|49|首次只增加起点未知的信息负担|
|
||||
|38|找起点再跨区 · 章节峰值|17|奇偶+墙|58|先定端点,再定访问方向与区域次序|
|
||||
|39|给回起点的短题 · 释放|12|奇偶+墙|42|移除起点负担,形成明确释放|
|
||||
|40|六边收束 · 收束|15|奇偶+墙|46|熟练应用已学条件,顺畅结束章节|
|
||||
|
||||
#### 31 · 六向邻接
|
||||
|
||||
- 盘面:紧凑六边盘,保留三角邻接。
|
||||
- 条件预算:一堵墙;数字1。
|
||||
- 顿悟:只新增六向几何,复用熟悉墙规则。
|
||||
- 诱惑路线:漏看斜向共边,或认为碰角也能走。
|
||||
- 排除依据:以实际六边共边判断邻接。
|
||||
- 目标:分值30–38;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标12–35秒。
|
||||
- 原型参考:walls/02, walls/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 32 · 六边留出口
|
||||
|
||||
- 盘面:更多六向出口中保留后续区域连接。
|
||||
- 条件预算:两堵必要墙;一个中段数字。
|
||||
- 顿悟:识别多出口枢纽,规划区域收尾。
|
||||
- 诱惑路线:先走看似安全的近出口。
|
||||
- 排除依据:覆盖余区所需通口被用掉。
|
||||
- 目标:分值34–42;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标20–55秒。
|
||||
- 原型参考:walls/02, walls/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 33 · 六边换颜色
|
||||
|
||||
- 盘面:三角邻接有同色边,两个异色候选都可起手。
|
||||
- 条件预算:蓝橙全盘;起点给定。
|
||||
- 顿悟:把交替迁移到六向盘面。
|
||||
- 诱惑路线:以六向相邻为由走同色格。
|
||||
- 排除依据:仍必须每步换色。
|
||||
- 目标:分值39–47;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标20–55秒。
|
||||
- 原型参考:block-alternation/03, block-alternation/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 34 · 颜色之外还有墙
|
||||
|
||||
- 盘面:颜色先筛候选,墙再影响区域出口。
|
||||
- 条件预算:两堵必要墙,均在异色共边上。
|
||||
- 顿悟:分清颜色阻挡与墙阻挡,两者联动。
|
||||
- 诱惑路线:选异色格却忽略边墙。
|
||||
- 排除依据:异色仍可能被永久墙封边。
|
||||
- 目标:分值43–51;有效关键选择3–4处;最长依赖约3层;思考时间P50候选目标20–55秒。
|
||||
- 原型参考:hex-alternation/04, hex-alternation/07;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 35 · 六边小花园
|
||||
|
||||
- 盘面:比34更短,几何主题清楚,不重教规则。
|
||||
- 条件预算:一堵必要墙;起点给定。
|
||||
- 顿悟:巩固六边迁移,以一次区域判断完成。
|
||||
- 诱惑路线:追随主题外形,留错末端。
|
||||
- 排除依据:末端颜色与区域覆盖共同排除。
|
||||
- 目标:分值36–44;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标20–55秒。
|
||||
- 原型参考:hex-alternation/04, hex-alternation/07;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 36 · 六边也有奇偶
|
||||
|
||||
- 盘面:保留三角邻接,可改变路线步号关系。
|
||||
- 条件预算:一至两个必要奇偶;无双色。
|
||||
- 顿悟:把奇偶迁移到非天然黑白图。
|
||||
- 诱惑路线:照搬单位方格天然奇偶规律。
|
||||
- 排除依据:三角邻接允许不同访问奇偶,须按路线计步。
|
||||
- 目标:分值40–48;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标20–55秒。
|
||||
|
||||
#### 37 · 起点没有写出
|
||||
|
||||
- 盘面:有可辨认的端点候选,盘面缩小。
|
||||
- 条件预算:一个必要奇偶;不给1;其他条件减少。
|
||||
- 顿悟:首次只增加起点未知的信息负担。
|
||||
- 诱惑路线:任意格起手再穷举。
|
||||
- 排除依据:端点结构与奇偶可排除起点候选。
|
||||
- 目标:分值45–53;有效关键选择3–4处;最长依赖约3层;思考时间P50候选目标12–35秒。
|
||||
|
||||
#### 38 · 找起点再跨区
|
||||
|
||||
- 盘面:区域连接清楚,但两端和方向需要联合判断。
|
||||
- 条件预算:两个必要奇偶;两堵墙;不给1。
|
||||
- 顿悟:先定端点,再定访问方向与区域次序。
|
||||
- 诱惑路线:选对几何端点却朝错误方向走。
|
||||
- 排除依据:奇偶与墙共同排除反向完整路线。
|
||||
- 目标:分值54–62;有效关键选择3–4处;最长依赖约3层;思考时间P50候选目标30–75秒。
|
||||
- 原型参考:walls/02, walls/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 39 · 给回起点的短题
|
||||
|
||||
- 盘面:短盘面,只保留一个区域收尾问题。
|
||||
- 条件预算:一个必要奇偶;一堵墙;恢复1。
|
||||
- 顿悟:移除起点负担,形成明确释放。
|
||||
- 诱惑路线:提前经过跨区口。
|
||||
- 排除依据:区域覆盖与奇偶给出短排除。
|
||||
- 目标:分值38–46;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标18–40秒。
|
||||
- 原型参考:walls/02, walls/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 40 · 六边收束
|
||||
|
||||
- 盘面:对称主题外形,线索给出清楚解题入口。
|
||||
- 条件预算:一至两个必要奇偶;一堵墙。
|
||||
- 顿悟:熟练应用已学条件,顺畅结束章节。
|
||||
- 诱惑路线:照镜像选择次序。
|
||||
- 排除依据:明确线索打破对称。
|
||||
- 目标:分值42–50;有效关键选择3–4处;最长依赖约3层;思考时间P50候选目标18–40秒。
|
||||
- 原型参考:walls/02, walls/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
### 第5章 · 组合应用与收束
|
||||
|
||||
增加推理依赖,不继续增加规则。
|
||||
|
||||
|关|标题/功能|格数|机制|目标分|核心任务|
|
||||
|---:|---|---:|---|---:|---|
|
||||
|41|通道再接力 · 演示/热身|15|方向+墙|44|用熟悉机制开始综合阶段|
|
||||
|42|两个双色枢纽 · 练习|16|大格/异形+双色+墙|48|两个局部选择不能独立处理|
|
||||
|43|奇偶分配区域 · 变化|17|大格/异形+奇偶+墙|52|协调两处步数条件,不能各自贪心满足|
|
||||
|44|六边出口互锁 · 组合|18|双色+墙|56|一个区域选择影响另一个区域的出口|
|
||||
|45|方向决定门路 · 巩固|16|方向+步进门|58|后段通道反推穿门方向|
|
||||
|46|先定奇偶,再定节拍 · 演示/迁移|17|大格/异形+奇偶+步进门|60|前段奇偶选择影响后段门位|
|
||||
|47|墙通道门三者联动 · 练习/挑战|18|方向+墙+步进门|65|从后段限制逐步反推,而非起手试画|
|
||||
|48|六边综合峰值 · 章节峰值|19|奇偶+墙+步进门|72|端点、区域、步号和门状态构成可解释依赖链|
|
||||
|49|回到双色小题 · 释放|12|大格/异形+双色+墙|48|在挑战后用已掌握能力快速完成|
|
||||
|50|继续还有新花园 · 收束|16|双色+墙|54|展示机制的可持续变化,顺畅完成DEMO|
|
||||
|
||||
#### 41 · 通道再接力
|
||||
|
||||
- 盘面:横竖与拐角配合,两片区域相互制约。
|
||||
- 条件预算:两个必要通道;一至两堵墙。
|
||||
- 顿悟:用熟悉机制开始综合阶段。
|
||||
- 诱惑路线:只满足近侧通道,留错远侧入口。
|
||||
- 排除依据:后段方向要求反推前段入口。
|
||||
- 目标:分值40–48;有效关键选择2–3处;最长依赖约2层;思考时间P50候选目标25–65秒。
|
||||
- 原型参考:direction/01, direction/02, direction/04;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 42 · 两个双色枢纽
|
||||
|
||||
- 盘面:两个枢纽连接区域,颜色限制各自出口。
|
||||
- 条件预算:两个大格或异形;两堵墙。
|
||||
- 顿悟:两个局部选择不能独立处理。
|
||||
- 诱惑路线:先使用更近枢纽的异色出口。
|
||||
- 排除依据:远侧区域失去可交替续接通路。
|
||||
- 目标:分值44–52;有效关键选择3–4处;最长依赖约3层;思考时间P50候选目标25–65秒。
|
||||
- 原型参考:block-alternation/03, block-alternation/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 43 · 奇偶分配区域
|
||||
|
||||
- 盘面:两片区域的访问先后影响两个标记步号。
|
||||
- 条件预算:两个必要奇偶;两堵墙。
|
||||
- 顿悟:协调两处步数条件,不能各自贪心满足。
|
||||
- 诱惑路线:满足第一个条件后直接跨区。
|
||||
- 排除依据:第二个奇偶或完整覆盖冲突。
|
||||
- 目标:分值48–56;有效关键选择3–4处;最长依赖约3层;思考时间P50候选目标25–65秒。
|
||||
- 原型参考:walls/02, walls/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 44 · 六边出口互锁
|
||||
|
||||
- 盘面:三片逻辑区域由至少两类可选通口衔接,避免三枝单枢纽无解。
|
||||
- 条件预算:三堵必要墙;少量数字。
|
||||
- 顿悟:一个区域选择影响另一个区域的出口。
|
||||
- 诱惑路线:抢先用掉当前合法异色出口。
|
||||
- 排除依据:后续区域无法持续交替覆盖。
|
||||
- 目标:分值52–60;有效关键选择3–4处;最长依赖约3层;思考时间P50候选目标25–65秒。
|
||||
- 原型参考:hex-alternation/04, hex-alternation/07;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 45 · 方向决定门路
|
||||
|
||||
- 盘面:方向配对迫使从特定一侧接近门。
|
||||
- 条件预算:两个必要通道+一道门。
|
||||
- 顿悟:后段通道反推穿门方向。
|
||||
- 诱惑路线:通道局部满足,但从关闭侧到门。
|
||||
- 排除依据:门与通道联合排除路线。
|
||||
- 目标:分值54–62;有效关键选择3–4处;最长依赖约3层;思考时间P50候选目标25–65秒。
|
||||
- 原型参考:direction/01, direction/02, direction/04;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 46 · 先定奇偶,再定节拍
|
||||
|
||||
- 盘面:奇偶格远离门口,避免直接重复门条件。
|
||||
- 条件预算:两个必要奇偶+一道门。
|
||||
- 顿悟:前段奇偶选择影响后段门位。
|
||||
- 诱惑路线:把两处条件分别满足,却忽略次序依赖。
|
||||
- 排除依据:路线必须同时满足远处标记与跨门状态。
|
||||
- 目标:分值56–64;有效关键选择4–5处;最长依赖约4层;思考时间P50候选目标25–65秒。
|
||||
- 原型参考:rhythm-door/01, rhythm-door/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 47 · 墙通道门三者联动
|
||||
|
||||
- 盘面:多步入口出口依赖,起点仍给定。
|
||||
- 条件预算:三个必要通道;两堵墙;一道门。
|
||||
- 顿悟:从后段限制逐步反推,而非起手试画。
|
||||
- 诱惑路线:走到中段才发现后段通道进不去。
|
||||
- 排除依据:需要提前保留满足通道与门的接近路线。
|
||||
- 目标:分值61–69;有效关键选择4–5处;最长依赖约4层;思考时间P50候选目标25–65秒。
|
||||
- 原型参考:direction/01, direction/02, direction/04;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 48 · 六边综合峰值
|
||||
|
||||
- 盘面:保留三角邻接,跨区时机与前段次序联动;不给额外新规则。
|
||||
- 条件预算:两个必要奇偶;两堵墙;一道门。
|
||||
- 顿悟:端点、区域、步号和门状态构成可解释依赖链。
|
||||
- 诱惑路线:局部条件都似乎满足,最后跨门状态不对。
|
||||
- 排除依据:前段次序必须为后段合法穿门服务。
|
||||
- 目标:分值68–76;有效关键选择4–5处;最长依赖约4层;思考时间P50候选目标45–100秒。
|
||||
- 原型参考:rhythm-door/01, rhythm-door/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 49 · 回到双色小题
|
||||
|
||||
- 盘面:一个异色出口保留判断,明显短于峰值。
|
||||
- 条件预算:一个大格;一堵墙;恢复清楚起点。
|
||||
- 顿悟:在挑战后用已掌握能力快速完成。
|
||||
- 诱惑路线:随便选合法颜色的出口。
|
||||
- 排除依据:后续收尾给出一个短排除。
|
||||
- 目标:分值44–52;有效关键选择3–4处;最长依赖约3层;思考时间P50候选目标20–45秒。
|
||||
- 原型参考:block-alternation/03, block-alternation/05;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
#### 50 · 继续还有新花园
|
||||
|
||||
- 盘面:新的主题布局,包含两个短推理,但不做终极考卷。
|
||||
- 条件预算:一至两堵墙;起点给定。
|
||||
- 顿悟:展示机制的可持续变化,顺畅完成DEMO。
|
||||
- 诱惑路线:照搬44关的访问次序。
|
||||
- 排除依据:新布局的墙与颜色要求有不同收尾顺序。
|
||||
- 目标:分值50–58;有效关键选择3–4处;最长依赖约3层;思考时间P50候选目标20–45秒。
|
||||
- 原型参考:hex-alternation/04, hex-alternation/07;仅作构造参考,不能视为可直接复用。
|
||||
|
||||
## 51–100关及正式版衔接
|
||||
|
||||
50关验证后,先依据真人数据修改题与关序,再扩展51–100。优先用区域拓扑、空洞、对称/破对称、枢纽先后和线索位置开发新题,不要求增加规则或继续扩大盘面。每个新章先安排熟悉规则的热身,再形成局部峰谷;不规定第51关必须难于第50关。
|
||||
|
||||
优质DEMO题作为内容资产复用,正式首发前统一筛选重排。过难题可移入挑战包。上线后新增章节与主题包,旧内容只进行有依据的局部修正。levelId首次分配后保留;显示顺序由章节manifest决定。规则实质变化增加contentRevision,完全替换题目分配新ID。保存通关进度和分析记录时绑定ID与修订,不能只绑定第几关。
|
||||
|
||||
## 交付与状态
|
||||
|
||||
- index.html:离线规划页,筛选逐关任务、切换A/B曲线、查看详细设计。
|
||||
- demo-design.json:50关任务、稳定ID、章节与A/B关序,所有任务标记design-only。
|
||||
- difficulty-curve.csv:目标曲线与A/B位置;实测难度列留空。
|
||||
- VALIDATION_PLAN.md:难度定义、机器人策略、机制必要性与真人测试标准。
|
||||
- project-snapshot.json:现有40关的结构快照,只是几何指标,不是人类难度。
|
||||
- plan-check.json:设计表一致性检查,不是50关唯一解验收。
|
||||
|
||||
本轮没有制作50个坐标盘面,没有给出真实作者解,没有完成真人难度或手机测试。
|
||||
@@ -0,0 +1,29 @@
|
||||
# 50关DEMO设计规划
|
||||
|
||||
打开index.html查看离线H5规划页。它是设计说明与曲线工具,不是游戏试玩。
|
||||
|
||||
交付:
|
||||
|
||||
- DEMO_DESIGN.md:50关逐关构造、关键推理、诱惑路线与排除理由。
|
||||
- demo-design.json:结构化设计任务、稳定ID、技能前置与A/B关序。
|
||||
- difficulty-curve.csv:目标分、目标带、A/B位置、时间候选目标;实测列留空。
|
||||
- curve-a.svg / curve-b.svg:两套目标曲线图。
|
||||
- VALIDATION_PLAN.md:最新研究适配、制作门槛、指标口径、机器人与真人测试方案。
|
||||
- playtest-template.csv:50关预填ID的记录模板,实测字段留空。
|
||||
- project-snapshot.json:现有40关只读结构快照,不代表真人难度。
|
||||
- plan-check.json / h5-check.json:设计和规划页检查结果,不是关卡唯一性验收。
|
||||
|
||||
依据为用户提供的H5研究、10月14日原项目补充深度调研、原项目45关结构审计,以及Variants实际规则与40关数据。45关与40关是不同题库。外部竞品统计未独立复算,研究中的权重和节拍按待测假设使用。
|
||||
|
||||
默认50关;原40关题目不直接拼入主线。先制作05/13/18/21/24/28六道桥接样题,计入50关,不另加题。当前未制作坐标、答案或50关可玩包。
|
||||
|
||||
修改原项目文件0个;相较历史清单,原项目已有4份研究文件新增,原有91文件内容一致。规划输出仅在本文件夹,不改运行规则、既有关卡、存档或手机体验。
|
||||
|
||||
复核规划:
|
||||
|
||||
```powershell
|
||||
node verify-design.mjs
|
||||
node verify-h5.mjs
|
||||
```
|
||||
|
||||
重建文件需要Python3,按build-design.py → build-docs.py → build-h5.py执行。它们只写当前规划目录。首次分配的levelId需要在未来制作与重排中保留,不能因为显示位置改变而重建ID。
|
||||
@@ -0,0 +1,63 @@
|
||||
# 制作与难度验证规划
|
||||
|
||||
## 1. 三类难度分开保存
|
||||
|
||||
- targetDifficulty:策划目标分,当前有值。
|
||||
- staticFeatures / simulatedFeatures:盘面完成后采集,当前为空。
|
||||
- humanDifficulty:真人数据校准后填写,当前为空。
|
||||
|
||||
报告权重0.25B+0.25C+0.20R+0.15S+0.10U+0.05V是候选,不直接作为排序真值;本轮不实现未经校准的综合评分器。所有指标保存规则/模型版本。不同机制的搜索节点数不可未经校准直接比较。
|
||||
|
||||
## 2. 指标的操作定义
|
||||
|
||||
|指标|测量办法|限制|
|
||||
|---|---|---|
|
||||
|有效决策数B|在固定策略机器人遇到至少两种未被其已掌握规则排除的移动时,记录一次决策|不是原始邻接度>=3的节点数量;不能用完整求解器提前认出唯一解再计数|
|
||||
|强制比例F|固定策略机器人独立通过局部移动、固定步号及已掌握规则确定的追加数/总追加数|不能把唯一解中的所有步当成强制步;不能将度2比例视为F|
|
||||
|封闭风险C|每个诱惑移动是否会切断剩余潜在图;记录局部可见或需跨区推断|门的潜在连通图保留未来可开的边,双色和永久墙按各自静态限制处理|
|
||||
|错误发现延迟R|按约定诱惑策略,从首次偏离到出现可解释矛盾之间的追加数|分别记录自动冲突、局部死路、区域矛盾;不是撤销次数|
|
||||
|数字跨度S|固定数字按步号排序的相邻差和最后尾段;同时保存最长未确定段|不使用空间距离;奇偶不等同固定数字|
|
||||
|推理依赖U|人工说明中为确认关键选择需要连续使用的前提层数|先由策划标注,真人口述核对,不由机制数量替代|
|
||||
|视觉操作V|路径转向、标记密度、边界歧义、触点与跨块连线可读性|与逻辑难度分开,手机优化留到玩法验证后|
|
||||
|
||||
## 3. 机器人方案(待实施)
|
||||
|
||||
A局部策略:固定数字与基本操作约束优先,倾向较近线索、少出口及边缘;不访问完整答案,记录诱惑选择与回退。策略、候选排序和随机种子固定,便于复现。
|
||||
|
||||
B规则策略:在A基础上使用端点/剩余区域连通/通道配对/拼块计步/奇偶/颜色/门位推理;逐项记录所用规则与推理次数。只评估定义范围内的推理,不能宣称等价人类。
|
||||
|
||||
C完整搜索:确认完整有序解唯一,解除约束生成反例,记录搜索规模与耗时。C的节点数只作计算诊断,不等于真人难度。
|
||||
|
||||
## 4. 盘面发布门槛
|
||||
|
||||
每关结构合法、完整解唯一;无1时搜所有起点;每条奇偶、每个方向通道、每堵墙、门、全局交替要求逐项解除后至少两解;辅助数字逐项删减,教学保留需写理由。约束预算是候选目标,不能为了凑墙数或标记数保留冗余。
|
||||
|
||||
主线支持features显式启用,必须由规则、操作、求解、提示共用判定。禁止把当前mode名称判双色的逻辑直接复制到组合主线。奇偶原始格不与数字同格;不可依靠天然方格或双色奇偶做无效装饰。方向只适用单位方格整盘;大格和六边不继承lr/du等端口判断。
|
||||
|
||||
步进门最多一道,空盘关,起点也切换;出发前判位、落格后切换;回退和重开恢复。单位方格固定起点的天然奇偶不因绕路改变,门题不写成任意绕一圈就能补拍;需要可变到达步号关系时用大格或三角邻接六边盘。
|
||||
|
||||
组合必须有明确的跨机制推理,并记录解除每一项后的完整反例;唯一解通过但主要靠枚举、长段机械填满的题仍须重做。
|
||||
|
||||
## 5. 玩家测试(待实施)
|
||||
|
||||
先找3–5名新玩家定性测试规则解释与明显枯燥点,再组织更大样本进行50关分会话测试。每关20–30人可暴露明显问题,不用于精确估计低频退出或A/B显著性;A/B需要根据实际方差和所需效应另算样本量。
|
||||
|
||||
记录实际开始、首次落格、首次偏离、冲突被发现、回退、重开、提示、完成、离开、下一关启动和下一会话返回。仅本地导出记录,不在本轮加入自动网络上传。
|
||||
|
||||
第一次尝试:从首次起手到首次重开、提示或结束;分别记录是否含回退。首次无提示且无回退完成、允许回退的无提示完成、最终完成分开统计,避免成功率口径混乱。
|
||||
|
||||
思考时间:从盘面可读到首次落格,加上绘制途中思考停顿的候选口径,后台时间剔除;另存开始到完成总耗时。暂停阈值需在原型事件采集前固定,当前设计时间目标不与总耗时混用。
|
||||
|
||||
单关统计P50/P75/P90时间、错误发现延迟、回退、提示、开始后退出、完成后下一关启动。退出分为卡关、无聊、正常结束会话、操作/显示问题,结合短口述或选择项;不能把退出全部解释成难度。
|
||||
|
||||
先以实际测量修正排序,不用本方案的秒数直接判定成败。教学关目标是理解规则;挑战关目标是可解释推理;释放关目标是减少负担并保持兴趣。重点检查8/18/28/38/48峰值,以及其后两关是否让玩家愿意继续。
|
||||
|
||||
A/B关序保持完全相同题库:A第8峰值、9/10释放;B把峰值移至章末。用户首次参与时固定分组,不在同一玩家每章切换,避免学习效应。比较完成后下一关启动和后续会话返回,同时检查新规则理解、提示与卡关退出;未达样本前只作定性观察,不宣布最优。
|
||||
|
||||
## 6. 数据契约(规划,不是运行关卡)
|
||||
|
||||
设计任务记录levelId、designKey、教学任务、候选几何/机制、目标分/目标带、目标关键选择与依赖、制作状态。具体cells/walls/doors及作者解只有制作完成才填写到独立关卡包。
|
||||
|
||||
关序manifest维护ID数组,A/B互为同集合排列。已发题重排不清空已通关进度;实质规则改变有revision;替换为新谜题分配新ID。
|
||||
|
||||
当前交付不承诺平台、网络、广告或周期上线日期。先做玩法曲线验证,再安排手机体验和release内容生产。
|
||||
@@ -0,0 +1,100 @@
|
||||
from pathlib import Path
|
||||
import json,csv,hashlib,uuid,html,statistics
|
||||
root=Path(r'G:\项目\NumberSwipe-Variants');out=root/'design/demo-50'
|
||||
# number/title/geometry/features/N/constraints/layout/goal/wrong-route/reason
|
||||
rows=[
|
||||
(1,'第一笔','square',[],5,'数字1、5','紧凑小盘;一个浅分叉,终点清晰','理解全格覆盖与固定步号','直接滑向终点,留下一个未走格','终点到达时仍有剩余格,必须先覆盖'),
|
||||
(2,'先收短支路','square',[],8,'数字1+一个中段数字','主区旁有短支路;支路不是视觉隐藏格','根据端点与剩余区域判断访问顺序','先进入主区,支路失去可续接入口','完整覆盖要求保留支路访问机会'),
|
||||
(3,'大块一步','blocks',['big'],8,'一个2×2大格;数字1+中段数字','两条候选路线视觉长度相近,经过拼块数不同','按拼块而非面积计步','把大格误当多步,选择面积更短的一侧','实际步号对不上中段数字'),
|
||||
(4,'枢纽留后','blocks',['big'],10,'一个多出口大格;少量数字','两片区域通过两个通口连接,大格位于路线中段','决定何时使用大格枢纽','过早进入大格并从近出口离开','剩余区域无法接续或不能按时到数字'),
|
||||
(5,'认清异形共边','blocks',['big'],11,'一个L形格+早期引导数字;不加奇偶','凹口接触邻格;只新增异形读盘,不同时增加未知起点','异形整块一步,辨认哪些边实际共边','按包围盒把凹口当成块内,错误认定邻接','以真实占地共边判邻接,不能跨空洞'),
|
||||
(6,'边上的墙','square',['walls'],9,'一堵必要墙;数字1','墙封住明显直达边;绕行仍有两种选择','认识永久封边,靠数字选绕行方向','把墙当作一个格,或尝试穿过','墙只封边,另一条真实共边才可通行'),
|
||||
(7,'近路要绕','square',['walls'],11,'一至两堵必要墙;一个中段数字','空间近而路径远,墙后保留区域出口','先观察墙改变了哪些邻接','先绕进近侧,过早占用唯一续接节点','后段覆盖或步号不成立'),
|
||||
(8,'第一座桥','blocks',['big','walls'],13,'一个大格;两堵必要墙','两片区域有两个通口,墙与大格共同限制跨区顺序','大格必须留到完成一侧之后','先走枢纽,再试图回补区域','大格只能一次,剩余区域被切断'),
|
||||
(9,'绕过去就好','square',['walls'],9,'一堵必要墙;起点给定','小盘面,墙排除一个清楚的诱惑方向','以一次短推理完成释放关','忽略墙尝试直达','正确绕行只需一个局部判断'),
|
||||
(10,'对称小花园','blocks',['big','walls'],12,'一个大格;一堵必要墙','近似对称外形,内部线索清楚打破对称','迁移已学规则并顺畅结束章节','按外形镜像照走','线索和墙形成可见的不对称依据'),
|
||||
(11,'左右通道','square',['direction'],9,'一个lr通道;起点给定','通道还有上下几何邻格','认识左右两边连接、可反向通过','从上或下进入通道','图示只连接左右边'),
|
||||
(12,'上下通道','square',['direction'],10,'一个du通道','把横向题的结构改为纵向应用,增加一处分叉','独立区分横线和竖线','从左侧切入纵向通道','进出边必须是上与下'),
|
||||
(13,'认清拐角','square',['direction'],11,'一个明确拐角;中段数字','拐角格至少有三个邻格,图形指向两边','辨认拐角连接边,不把它理解成单向右转','使用另一种转弯方向','图形未连接的边不能成为进出边'),
|
||||
(14,'两角相接','square',['direction','walls'],13,'两个不同拐角;一堵必要墙','前后通道共享一片区域的入口出口选择','用后段出口反推前段入口','先满足第一个通道,却留错第二个入口','两个通道要求必须同时成立'),
|
||||
(15,'直线与拐角','square',['direction','walls'],14,'一横或竖通道+一拐角;一堵墙','旧结构换成新方向布局,保持两三个有效分叉','巩固明确边配对与区域收尾','通道局部满足但走过区域出口','剩余区域无法完整覆盖'),
|
||||
(16,'蓝橙第一步','blocks',['big','alternation'],9,'一个大格;两色全盘;起点给定','至少一处同色共边,色彩鲜明','认识每步换颜色,大格仍一步','走向共享边的同色邻格','下一步必须另一种颜色'),
|
||||
(17,'留下另一种颜色','blocks',['big','alternation'],12,'大格双色;一个必要中段数字','大格有多个异色出口,只有一个能续接全盘','不能仅以颜色合法判断下一步','走向合法异色近出口','后段区域缺少异色续接机会'),
|
||||
(18,'双色跨区','blocks',['big','alternation','walls'],15,'两个多单位块;两堵必要墙','两个区域的跨区出口同时受颜色和墙影响','先定访问顺序,再选异色出口','选当前合法的异色出口,提前跨区','另一区域无法按交替顺序收尾'),
|
||||
(19,'短短的接力','blocks',['big','alternation'],10,'一个大格;少量数字','小盘面,一个明确的同色诱惑与一个收尾判断','以已掌握规则降低认知负担','误走同色共边或留错最后异色格','颜色与覆盖条件给出直接排除'),
|
||||
(20,'双色回环','blocks',['big','alternation'],13,'一个长条或大格;起点给定','视觉呈回环,但路径不闭合;出口清楚','稳定应用双色和一步大格,顺畅收束','为追求形状闭合而提前封住尾段','完成要求是覆盖路径,不是闭环'),
|
||||
(21,'偶数落脚','blocks',['big','parity'],10,'一个必要偶标记;一个大格;数字1','两种区域顺序使标记落在不同奇偶步','认识访问步号的偶数要求','按面积或颜色想象奇偶','整块一步,实际访问步号必须为偶'),
|
||||
(22,'奇数绕行','blocks',['big','parity'],12,'一个必要奇标记;长条','换一类结构,保留两个访问顺序','独立应用奇数要求','选择空间较短但步号为偶的路线','拼块步数决定奇偶,距离不决定'),
|
||||
(23,'凹口的步号','blocks',['big','parity'],13,'L形或T形;一至两个必要奇偶','凹口新增真实邻接,但不新增块内步数','迁移奇偶到异形区域','把凹口内单位方格拆开数步','异形整块只访问一次'),
|
||||
(24,'墙后先收尾','blocks',['big','parity','walls'],15,'两个必要奇偶;一至两堵墙','区域有两个通口,墙限制一侧,奇偶限制次序','让墙影响区域顺序,再由奇偶筛掉另一选择','先满足一个奇偶却过早离开区域','另一条件或剩余覆盖不成立'),
|
||||
(25,'少量线索也够','blocks',['big','parity'],12,'一个必要奇偶;一个中段数字','比24关更短但保留一个可解释分叉','巩固奇偶,避免连续多条件压力','机械沿边走,忽略到达步号','奇偶直接排除这一条完整路线'),
|
||||
(26,'门随脚步开关','square',['rhythm-door'],9,'一道门;空盘关;数字1','门在前段;能看到另一侧入口选择','起步也切换,移动前看门位','把门当静态墙或等待自动打开','只有落格才切换,等待无效'),
|
||||
(27,'从另一侧通过','square',['rhythm-door'],12,'一道门;一个中段数字','普通方格中从正确一侧接近门','用步号判断通过方向,不假设绕路能改目标奇偶','从当前关闭的一侧接近,试图靠等待或同侧绕圈补拍','正交单位格固定起点的格奇偶不随绕路改变'),
|
||||
(28,'大块改变节拍','blocks',['big','rhythm-door'],15,'一道门;一至两个大格','经过不同拼块的区域顺序影响到门时的步号','在大格图中规划真实到达状态','选择视觉近但落格次数不合适的接近路线','门在出发前状态关闭'),
|
||||
(29,'墙和门分开看','blocks',['big','rhythm-door','walls'],12,'一道门+一堵墙;短盘面','永久墙只阻一条边,门保留清楚的跨区判断','以短组合应用释放认知负担','把黑黄墙也当作会切换的门','永久墙始终不可跨越'),
|
||||
(30,'顺着节拍收尾','blocks',['big','rhythm-door'],14,'一道门;起点给定','近似对称两区,关键经过时机清楚','巩固大格计步与门位,完成顺畅章节收束','门开就立刻跨区,留下本侧格','需要先完成本侧再合法跨门'),
|
||||
(31,'六向邻接','hex',['walls'],10,'一堵墙;数字1','紧凑六边盘,保留三角邻接','只新增六向几何,复用熟悉墙规则','漏看斜向共边,或认为碰角也能走','以实际六边共边判断邻接'),
|
||||
(32,'六边留出口','hex',['walls'],13,'两堵必要墙;一个中段数字','更多六向出口中保留后续区域连接','识别多出口枢纽,规划区域收尾','先走看似安全的近出口','覆盖余区所需通口被用掉'),
|
||||
(33,'六边换颜色','hex',['alternation'],13,'蓝橙全盘;起点给定','三角邻接有同色边,两个异色候选都可起手','把交替迁移到六向盘面','以六向相邻为由走同色格','仍必须每步换色'),
|
||||
(34,'颜色之外还有墙','hex',['alternation','walls'],15,'两堵必要墙,均在异色共边上','颜色先筛候选,墙再影响区域出口','分清颜色阻挡与墙阻挡,两者联动','选异色格却忽略边墙','异色仍可能被永久墙封边'),
|
||||
(35,'六边小花园','hex',['alternation','walls'],12,'一堵必要墙;起点给定','比34更短,几何主题清楚,不重教规则','巩固六边迁移,以一次区域判断完成','追随主题外形,留错末端','末端颜色与区域覆盖共同排除'),
|
||||
(36,'六边也有奇偶','hex',['parity'],14,'一至两个必要奇偶;无双色','保留三角邻接,可改变路线步号关系','把奇偶迁移到非天然黑白图','照搬单位方格天然奇偶规律','三角邻接允许不同访问奇偶,须按路线计步'),
|
||||
(37,'起点没有写出','hex',['parity'],12,'一个必要奇偶;不给1;其他条件减少','有可辨认的端点候选,盘面缩小','首次只增加起点未知的信息负担','任意格起手再穷举','端点结构与奇偶可排除起点候选'),
|
||||
(38,'找起点再跨区','hex',['parity','walls'],17,'两个必要奇偶;两堵墙;不给1','区域连接清楚,但两端和方向需要联合判断','先定端点,再定访问方向与区域次序','选对几何端点却朝错误方向走','奇偶与墙共同排除反向完整路线'),
|
||||
(39,'给回起点的短题','hex',['parity','walls'],12,'一个必要奇偶;一堵墙;恢复1','短盘面,只保留一个区域收尾问题','移除起点负担,形成明确释放','提前经过跨区口','区域覆盖与奇偶给出短排除'),
|
||||
(40,'六边收束','hex',['parity','walls'],15,'一至两个必要奇偶;一堵墙','对称主题外形,线索给出清楚解题入口','熟练应用已学条件,顺畅结束章节','照镜像选择次序','明确线索打破对称'),
|
||||
(41,'通道再接力','square',['direction','walls'],15,'两个必要通道;一至两堵墙','横竖与拐角配合,两片区域相互制约','用熟悉机制开始综合阶段','只满足近侧通道,留错远侧入口','后段方向要求反推前段入口'),
|
||||
(42,'两个双色枢纽','blocks',['big','alternation','walls'],16,'两个大格或异形;两堵墙','两个枢纽连接区域,颜色限制各自出口','两个局部选择不能独立处理','先使用更近枢纽的异色出口','远侧区域失去可交替续接通路'),
|
||||
(43,'奇偶分配区域','blocks',['big','parity','walls'],17,'两个必要奇偶;两堵墙','两片区域的访问先后影响两个标记步号','协调两处步数条件,不能各自贪心满足','满足第一个条件后直接跨区','第二个奇偶或完整覆盖冲突'),
|
||||
(44,'六边出口互锁','hex',['alternation','walls'],18,'三堵必要墙;少量数字','三片逻辑区域由至少两类可选通口衔接,避免三枝单枢纽无解','一个区域选择影响另一个区域的出口','抢先用掉当前合法异色出口','后续区域无法持续交替覆盖'),
|
||||
(45,'方向决定门路','square',['direction','rhythm-door'],16,'两个必要通道+一道门','方向配对迫使从特定一侧接近门','后段通道反推穿门方向','通道局部满足,但从关闭侧到门','门与通道联合排除路线'),
|
||||
(46,'先定奇偶,再定节拍','blocks',['big','parity','rhythm-door'],17,'两个必要奇偶+一道门','奇偶格远离门口,避免直接重复门条件','前段奇偶选择影响后段门位','把两处条件分别满足,却忽略次序依赖','路线必须同时满足远处标记与跨门状态'),
|
||||
(47,'墙通道门三者联动','square',['direction','walls','rhythm-door'],18,'三个必要通道;两堵墙;一道门','多步入口出口依赖,起点仍给定','从后段限制逐步反推,而非起手试画','走到中段才发现后段通道进不去','需要提前保留满足通道与门的接近路线'),
|
||||
(48,'六边综合峰值','hex',['parity','walls','rhythm-door'],19,'两个必要奇偶;两堵墙;一道门','保留三角邻接,跨区时机与前段次序联动;不给额外新规则','端点、区域、步号和门状态构成可解释依赖链','局部条件都似乎满足,最后跨门状态不对','前段次序必须为后段合法穿门服务'),
|
||||
(49,'回到双色小题','blocks',['big','alternation','walls'],12,'一个大格;一堵墙;恢复清楚起点','一个异色出口保留判断,明显短于峰值','在挑战后用已掌握能力快速完成','随便选合法颜色的出口','后续收尾给出一个短排除'),
|
||||
(50,'继续还有新花园','hex',['alternation','walls'],16,'一至两堵墙;起点给定','新的主题布局,包含两个短推理,但不做终极考卷','展示机制的可持续变化,顺畅完成DEMO','照搬44关的访问次序','新布局的墙与颜色要求有不同收尾顺序')
|
||||
]
|
||||
scores=[12,16,20,22,26,30,35,40,24,28,24,28,32,35,38,26,32,46,32,36,30,34,39,43,36,32,38,50,40,42,34,38,43,47,40,44,49,58,42,46,44,48,52,56,58,60,65,72,48,54]
|
||||
chapters=[{'id':1,'title':'覆盖、大格与墙','introduced':['big','walls'],'focus':'结束操作教学,建立计步与区域收尾','peak':8}, {'id':2,'title':'方向与双色','introduced':['direction','alternation'],'focus':'明确进出边,再规划异色续接','peak':18}, {'id':3,'title':'奇偶与步进门','introduced':['parity','rhythm-door'],'focus':'真实步号与到达状态,五关单元引入','peak':28}, {'id':4,'title':'六边迁移与起点推理','introduced':['hex','unknown-start'],'focus':'旧规则迁移到六向几何,适度减少起点信息','peak':38}, {'id':5,'title':'组合应用与收束','introduced':[],'focus':'增加推理依赖,不继续增加规则','peak':48}]
|
||||
names={'big':'大格/异形','walls':'永久墙','direction':'方向通道','alternation':'双色交替','parity':'奇偶','rhythm-door':'步进门'}
|
||||
roles=['演示/热身','练习','变化','组合','巩固','演示/迁移','练习/挑战','章节峰值','释放','收束']
|
||||
intro={1:'操作',3:'大格一步',5:'异形共边',6:'永久墙',11:'横向通道',12:'纵向通道',13:'明确拐角',16:'双色交替',21:'奇偶',26:'步进门',31:'六边邻接',37:'起点未知'}
|
||||
unknown={37,38};levels=[]
|
||||
for row,score in zip(rows,scores):
|
||||
n,title,geo,features,count,qty,layout,goal,wrong,reason=row;ch=(n-1)//10+1;slot=(n-1)%10+1
|
||||
role=roles[slot-1];target_range=[max(5,score-4),min(100,score+4)]
|
||||
# Targets refer to active planning time, not measured performance or visible game timer.
|
||||
time_range=([8,18] if n<=2 else [12,30] if n<=10 else [15,40] if n<=20 else [20,55] if n<=40 else [25,65])
|
||||
if slot==8:time_range=[20,45] if n<=20 else [30,75] if n<=40 else [45,100]
|
||||
if slot in (9,10):time_range=[12,28] if n<=20 else [18,40] if n<=40 else [20,45]
|
||||
if n in intro and n>2:time_range=[12,35]
|
||||
dependencies=1 if score<28 else 2 if score<45 else 3 if score<60 else 4
|
||||
decision_range=[1,2] if score<28 else [2,3] if score<45 else [3,4] if score<60 else [4,5]
|
||||
evidence='先说明诱惑方向,再用'+reason+'排除;最后检查数字、覆盖和全部机制。'
|
||||
runtime='已有单机制可参考,组合需独立主线支持'
|
||||
if 'parity' in features:runtime='待实现:Variants奇偶判定、提示与校验;不读取原项目运行代码'
|
||||
reference=[]
|
||||
if 'direction' in features:reference=['direction/01','direction/02','direction/04']
|
||||
elif geo=='hex' and 'alternation' in features and 'walls' in features:reference=['hex-alternation/04','hex-alternation/07']
|
||||
elif 'rhythm-door' in features:reference=['rhythm-door/01','rhythm-door/05']
|
||||
elif 'alternation' in features:reference=['block-alternation/03','block-alternation/05']
|
||||
elif 'walls' in features:reference=['walls/02','walls/05']
|
||||
level={'levelId':str(uuid.uuid5(uuid.NAMESPACE_URL,'numberswipe/demo-design-v1/'+str(n))), 'designKey':'demo-'+str(n).zfill(3),'displayOrder':n,'title':title,'chapter':ch,'chapterSlot':slot,'role':role,'geometry':geo,'features':features,'nodeCountTarget':count,'constraintsBudget':qty,'unknownStart':n in unknown,'introduces':intro.get(n,''),'layoutIntent':layout,'teachingGoal':goal,'temptingRouteIntent':wrong,'rejectionReason':reason,'reasoningOutline':evidence,'targetDifficulty':score,'targetDifficultyBand':target_range,'targetDecisionCount':decision_range,'targetDependencyDepth':dependencies,'thinkingSecondsP50Target':time_range,'sourceCandidates':reference,'reusePolicy':'仅参考构造,未确认可直接复用','implementationNote':runtime,'status':'design-only','geometryValidated':False,'uniqueSolutionValidated':False,'humanDifficultyCalibrated':False,'measuredFeatures':None}
|
||||
levels.append(level)
|
||||
orderA=[l['levelId'] for l in levels];orderB=[]
|
||||
# Within each chapter, take the same peak puzzle and move it from slot8 to slot10.
|
||||
for c in range(5):chunk=orderA[c*10:(c+1)*10];orderB+=chunk[:7]+chunk[8:]+[chunk[7]]
|
||||
source=Path(r'G:\下载\NumberSwipe_Research_H5.html');digest=hashlib.sha256(source.read_bytes()).hexdigest()
|
||||
plan={'schemaVersion':1,'designVersion':'demo50-design-2026-10-14-v1','scope':'50关设计与目标曲线;不含可玩盘面或真人实测','researchSource':{'path':str(source),'sha256':digest,'usedAs':'用户提供研究;未复核外部500关统计'},'projectSource':str(root),'curvePolicy':'外层缓慢提高,章内第8关峰值、9释放、10收束;为待测假设','difficultyModelVersion':'target-rubric-v1','scoreSemantics':'0–100策划目标,不是算法测得难度、概率或真人时间','chapterSize':10,'chapters':chapters,'levels':levels,'orders':{'A':{'title':'第8关峰值,末两关释放','levelIds':orderA},'B':{'title':'章末峰值对照','levelIds':orderB}},'hardConstraints':['每格一次、共边移动、固定数字为绝对访问步号','完整有序解唯一;解除任意新约束后至少两解','原始同格数字与奇偶互斥','不给固定起点的双色+奇偶组合','方向通道仅用于单位方格整盘','每关最多一道步进门;起点也切换、移动前判门位、撤销恢复','N最多20,按拼块数量而非面积','不上新传送、限时、体力、分数或已放弃机制']}
|
||||
extraPaths=[root.parent/'NumberSwipe/docs/一笔画竞品调研与关卡编排方案.md',root.parent/'NumberSwipe/docs/一笔画深度调研-制作与难度证据.md',root.parent/'NumberSwipe/docs/research/level-structure-audit.json']
|
||||
plan['additionalResearchSources']=[{'path':str(p),'sha256':hashlib.sha256(p.read_bytes()).hexdigest(),'scope':'原项目45关研究,不等于Variants40关验收'} for p in extraPaths]
|
||||
plan['pilotDesignKeys']=['demo-005','demo-013','demo-018','demo-021','demo-024','demo-028']
|
||||
for l in levels:
|
||||
l['pilotPriority']=l['designKey'] in plan['pilotDesignKeys']
|
||||
introFeature={'大格一步':'big','永久墙':'walls','横向通道':'direction','纵向通道':'direction','明确拐角':'direction','双色交替':'alternation','奇偶':'parity','步进门':'rhythm-door'};l['prerequisiteSkills']=([] if l['displayOrder']==1 else ['共边移动','每格一次','精确步号'])+[names[f] for f in l['features'] if f!=introFeature.get(l['introduces'])];l['prerequisiteSkills']+=['端点推理'] if l['unknownStart'] else []
|
||||
plan['skillDependencies']={'big':'共边/覆盖/步号→大格一步→大格出口→异形共边','direction':'共边/覆盖→横竖端口→明确拐角→方向联合','alternation':'覆盖/大格一步→双色交替→异色出口保留','parity':'精确步号/实际拼块邻接→单奇偶→双奇偶协作','rhythm-door':'步号/撤销→起步切换→穿门方向→大格到达状态','hex':'共边/墙→六向邻接→旧规则迁移','unknown-start':'覆盖/端点/步号推理→小盘起点未知→组合反推'}
|
||||
(out/'demo-design.json').write_text(json.dumps(plan,ensure_ascii=False,indent=2),encoding='utf-8')
|
||||
with (out/'difficulty-curve.csv').open('w',encoding='utf-8-sig',newline='') as f:
|
||||
writer=csv.DictWriter(f,fieldnames=['design_key','level_id','position_a','position_b','chapter','role','title','geometry','features','node_target','target_difficulty','target_low','target_high','thinking_p50_low','thinking_p50_high','measured_difficulty']);writer.writeheader()
|
||||
for l in levels:writer.writerow(dict(design_key=l['designKey'],level_id=l['levelId'],position_a=l['displayOrder'],position_b=orderB.index(l['levelId'])+1,chapter=l['chapter'],role=l['role'],title=l['title'],geometry=l['geometry'],features='+'.join(l['features']) or '数字',node_target=l['nodeCountTarget'],target_difficulty=l['targetDifficulty'],target_low=l['targetDifficultyBand'][0],target_high=l['targetDifficultyBand'][1],thinking_p50_low=l['thinkingSecondsP50Target'][0],thinking_p50_high=l['thinkingSecondsP50Target'][1],measured_difficulty=''))
|
||||
print(json.dumps({'levels':len(levels),'chapterPeaks':[max(scores[i:i+10]) for i in range(0,50,10)],'mechanismCoverage':{k:sum(k in l['features'] for l in levels) for k in names},'sourceHash':digest},ensure_ascii=False))
|
||||
@@ -0,0 +1,160 @@
|
||||
from pathlib import Path
|
||||
import json,html,csv,hashlib
|
||||
root=Path(r'G:\项目\NumberSwipe-Variants');out=root/'design/demo-50';plan=json.loads((out/'demo-design.json').read_text(encoding='utf-8'));levels=plan['levels'];names={'big':'大格/异形','walls':'墙','direction':'方向','alternation':'双色','parity':'奇偶','rhythm-door':'步进门'}
|
||||
def mech(l):return '+'.join(names[f] for f in l['features']) or '数字基础'
|
||||
intro='''# NumberSwipe 50关DEMO设计与难度曲线
|
||||
|
||||
版本:2026-10-14 v1。面向首次接触的新玩家,目标是验证趣味性、规则理解与章节节奏。当前交付是关卡制作任务与目标曲线,没有具体坐标、作者解或50关可玩包。
|
||||
|
||||
## 研究如何适配本项目
|
||||
|
||||
研究正文来源:G:/下载/NumberSwipe_Research_H5.html。源文件SHA-256记录在demo-design.json;报告中的外部Zip统计未在本项目复算。采用有效分叉、区域风险、错误发现延迟、目标跨度、逻辑依赖和视觉操作负担的分层思路。公式权重、章节8/9/10节拍及报告首通指标均是待测假设。
|
||||
|
||||
本项目数字表示绝对访问步号,不能将Zip的编号升序直接迁移。每个拼块一步、每格恰好一次、共边移动、完整有序解唯一。按节点数量使用5–19格,不迁移研究报告6×6/7×7的面积规模。普通方格固定起点下目标格奇偶由天然二分图固定,奇偶优先放在大格或无双色的六边盘。双色严格交替时不叠加奇偶。方向通道仅用于单位方格整盘。步进门空盘关、起点也切换,出发前判门位、撤销恢复。单位方格门题主要判断通过方向;通过大格或含三角邻接的六边图才强调不同路线的到达状态。
|
||||
|
||||
保留当前五个原型及已认可的40关作为参考,不恢复相对步差、先后链、窗口或开关格。当前Variants没有奇偶判定,双色启用仍依赖mode名称:组合主线落地需独立增加features开关、奇偶判定/提示/求解器/必要性检查,并限制图示与实际规则一致。本轮不修改这些运行代码,不调整手机体验。
|
||||
|
||||
## 节拍选择
|
||||
|
||||
默认A:每10关第8关峰值、第9关释放、第10关收束。新机制采用演示→练习→变化→组合→巩固的五关单元;不要求每个10关章都新增规则。
|
||||
|
||||
B为对照:同一套题,把各章第8关移到第10关,9/10关前移为8/9。A/B拥有完全相同关卡ID和内容,只改变顺序。首次制作先校验A,再与B比较。不是随机动态调难。
|
||||
|
||||
前两关完成操作教学;大格与墙在1–10关;方向与双色在11–20关;奇偶与门在21–30关;六边迁移在31–40关;最后10关只深化组合。保留两次起点未知(37、38),不把起点未知作为所有关卡的固定难度旋钮。
|
||||
|
||||
目标分0–100是策划标尺,不是搜索节点数、通过概率或玩家实测难度。各章目标峰值40/46/50/58/72,最后一关54分收束,不在50关耗尽难度上限。释放题也必须有可解释的选择,避免机械蛇形或连续闭眼画。
|
||||
|
||||
## 五章目标
|
||||
|
||||
| 关卡 | 阶段 | 新内容 | 峰值关/目标分 |
|
||||
|---|---|---|---|
|
||||
| 1–10 | 覆盖、大格与墙 | 大格一步、永久墙 | 8/40 |
|
||||
| 11–20 | 方向与双色 | 六种明确通道、换颜色 | 18/46 |
|
||||
| 21–30 | 奇偶与步进门 | 步号奇偶、每步切换门 | 28/50 |
|
||||
| 31–40 | 六边迁移与起点推理 | 六向邻接、未知起点 | 38/58 |
|
||||
| 41–50 | 组合应用与收束 | 不新增规则 | 48/72 |
|
||||
|
||||
## 最新项目研究补充与桥接验证
|
||||
|
||||
已纳入原项目docs/一笔画竞品调研与关卡编排方案.md、2026-10-14补充的《一笔画深度调研-制作与难度证据.md》及45关结构审计JSON。该审计针对原项目26数字关+19六边关;本次另行读取Variants的40关,二者不能混为同一题库的验收。
|
||||
|
||||
技能依赖:覆盖/纠错→大格计步→枢纽出口→异形共边;基本共边→横竖端口→明确拐角→方向联合;精确步号与实际拼块图→单奇偶→双奇偶;步号与撤销→起步切换→通过方向→大格到达状态;熟悉墙→六向共边→旧规则迁移。未知起点依赖端点和步号推理,先小盘专项。
|
||||
|
||||
先制作并测试6道桥接样题,均计入50关:
|
||||
|
||||
|设计号|验证任务|控制变量|
|
||||
|---|---|---|
|
||||
|05|异形共边|只增加L形读盘,不叠奇偶或未知起点|
|
||||
|13|拐角端口|只增加一种明确拐角,能解释反向通过|
|
||||
|18|双色与墙联合|先掌握16/17,再测试异色出口保留|
|
||||
|21|单奇偶|按节点计步,条件必要,不靠天然属性|
|
||||
|24|双奇偶与区域|先掌握21–23,每条条件各自有效|
|
||||
|28|大格与门位|先掌握26/27,检查实际步数关系|
|
||||
|
||||
教学测试按课程顺序。难度校准先让玩家学会对应规则,再交错代表题,避免把学习熟练或记忆同盘答案误判为题更容易。四层去重分别检查外观几何、真实邻接、约束配置、关键解法;几何相同且推理不同可以少量保留,四层等价仅限明确强化用途。
|
||||
|
||||
## 逐关制作任务
|
||||
|
||||
表中格数、约束预算与曲线为候选制作目标;盘面通过验证与试玩之前都不能标记为完成。格式是设计任务数据,不是游戏可直接读取的关卡JSON。
|
||||
'''
|
||||
md=intro
|
||||
for ch in plan['chapters']:
|
||||
md+=f"\n### 第{ch['id']}章 · {ch['title']}\n\n{ch['focus']}。\n\n|关|标题/功能|格数|机制|目标分|核心任务|\n|---:|---|---:|---|---:|---|\n"
|
||||
for l in levels[(ch['id']-1)*10:ch['id']*10]:md+=f"|{l['displayOrder']}|{l['title']} · {l['role']}|{l['nodeCountTarget']}|{mech(l)}|{l['targetDifficulty']}|{l['teachingGoal']}|\n"
|
||||
for l in levels[(ch['id']-1)*10:ch['id']*10]:
|
||||
md+=f"\n#### {l['displayOrder']:02d} · {l['title']}\n\n- 盘面:{l['layoutIntent']}。\n- 条件预算:{l['constraintsBudget']}。\n- 顿悟:{l['teachingGoal']}。\n- 诱惑路线:{l['temptingRouteIntent']}。\n- 排除依据:{l['rejectionReason']}。\n- 目标:分值{l['targetDifficultyBand'][0]}–{l['targetDifficultyBand'][1]};有效关键选择{l['targetDecisionCount'][0]}–{l['targetDecisionCount'][1]}处;最长依赖约{l['targetDependencyDepth']}层;思考时间P50候选目标{l['thinkingSecondsP50Target'][0]}–{l['thinkingSecondsP50Target'][1]}秒。\n"
|
||||
if l['sourceCandidates']:md+='- 原型参考:'+', '.join(l['sourceCandidates'])+';仅作构造参考,不能视为可直接复用。\n'
|
||||
md+='''
|
||||
## 51–100关及正式版衔接
|
||||
|
||||
50关验证后,先依据真人数据修改题与关序,再扩展51–100。优先用区域拓扑、空洞、对称/破对称、枢纽先后和线索位置开发新题,不要求增加规则或继续扩大盘面。每个新章先安排熟悉规则的热身,再形成局部峰谷;不规定第51关必须难于第50关。
|
||||
|
||||
优质DEMO题作为内容资产复用,正式首发前统一筛选重排。过难题可移入挑战包。上线后新增章节与主题包,旧内容只进行有依据的局部修正。levelId首次分配后保留;显示顺序由章节manifest决定。规则实质变化增加contentRevision,完全替换题目分配新ID。保存通关进度和分析记录时绑定ID与修订,不能只绑定第几关。
|
||||
|
||||
## 交付与状态
|
||||
|
||||
- index.html:离线规划页,筛选逐关任务、切换A/B曲线、查看详细设计。
|
||||
- demo-design.json:50关任务、稳定ID、章节与A/B关序,所有任务标记design-only。
|
||||
- difficulty-curve.csv:目标曲线与A/B位置;实测难度列留空。
|
||||
- VALIDATION_PLAN.md:难度定义、机器人策略、机制必要性与真人测试标准。
|
||||
- project-snapshot.json:现有40关的结构快照,只是几何指标,不是人类难度。
|
||||
- plan-check.json:设计表一致性检查,不是50关唯一解验收。
|
||||
|
||||
本轮没有制作50个坐标盘面,没有给出真实作者解,没有完成真人难度或手机测试。
|
||||
'''
|
||||
(out/'DEMO_DESIGN.md').write_text(md,encoding='utf-8')
|
||||
(out/'VALIDATION_PLAN.md').write_text('''# 制作与难度验证规划
|
||||
|
||||
## 1. 三类难度分开保存
|
||||
|
||||
- targetDifficulty:策划目标分,当前有值。
|
||||
- staticFeatures / simulatedFeatures:盘面完成后采集,当前为空。
|
||||
- humanDifficulty:真人数据校准后填写,当前为空。
|
||||
|
||||
报告权重0.25B+0.25C+0.20R+0.15S+0.10U+0.05V是候选,不直接作为排序真值;本轮不实现未经校准的综合评分器。所有指标保存规则/模型版本。不同机制的搜索节点数不可未经校准直接比较。
|
||||
|
||||
## 2. 指标的操作定义
|
||||
|
||||
|指标|测量办法|限制|
|
||||
|---|---|---|
|
||||
|有效决策数B|在固定策略机器人遇到至少两种未被其已掌握规则排除的移动时,记录一次决策|不是原始邻接度>=3的节点数量;不能用完整求解器提前认出唯一解再计数|
|
||||
|强制比例F|固定策略机器人独立通过局部移动、固定步号及已掌握规则确定的追加数/总追加数|不能把唯一解中的所有步当成强制步;不能将度2比例视为F|
|
||||
|封闭风险C|每个诱惑移动是否会切断剩余潜在图;记录局部可见或需跨区推断|门的潜在连通图保留未来可开的边,双色和永久墙按各自静态限制处理|
|
||||
|错误发现延迟R|按约定诱惑策略,从首次偏离到出现可解释矛盾之间的追加数|分别记录自动冲突、局部死路、区域矛盾;不是撤销次数|
|
||||
|数字跨度S|固定数字按步号排序的相邻差和最后尾段;同时保存最长未确定段|不使用空间距离;奇偶不等同固定数字|
|
||||
|推理依赖U|人工说明中为确认关键选择需要连续使用的前提层数|先由策划标注,真人口述核对,不由机制数量替代|
|
||||
|视觉操作V|路径转向、标记密度、边界歧义、触点与跨块连线可读性|与逻辑难度分开,手机优化留到玩法验证后|
|
||||
|
||||
## 3. 机器人方案(待实施)
|
||||
|
||||
A局部策略:固定数字与基本操作约束优先,倾向较近线索、少出口及边缘;不访问完整答案,记录诱惑选择与回退。策略、候选排序和随机种子固定,便于复现。
|
||||
|
||||
B规则策略:在A基础上使用端点/剩余区域连通/通道配对/拼块计步/奇偶/颜色/门位推理;逐项记录所用规则与推理次数。只评估定义范围内的推理,不能宣称等价人类。
|
||||
|
||||
C完整搜索:确认完整有序解唯一,解除约束生成反例,记录搜索规模与耗时。C的节点数只作计算诊断,不等于真人难度。
|
||||
|
||||
## 4. 盘面发布门槛
|
||||
|
||||
每关结构合法、完整解唯一;无1时搜所有起点;每条奇偶、每个方向通道、每堵墙、门、全局交替要求逐项解除后至少两解;辅助数字逐项删减,教学保留需写理由。约束预算是候选目标,不能为了凑墙数或标记数保留冗余。
|
||||
|
||||
主线支持features显式启用,必须由规则、操作、求解、提示共用判定。禁止把当前mode名称判双色的逻辑直接复制到组合主线。奇偶原始格不与数字同格;不可依靠天然方格或双色奇偶做无效装饰。方向只适用单位方格整盘;大格和六边不继承lr/du等端口判断。
|
||||
|
||||
步进门最多一道,空盘关,起点也切换;出发前判位、落格后切换;回退和重开恢复。单位方格固定起点的天然奇偶不因绕路改变,门题不写成任意绕一圈就能补拍;需要可变到达步号关系时用大格或三角邻接六边盘。
|
||||
|
||||
组合必须有明确的跨机制推理,并记录解除每一项后的完整反例;唯一解通过但主要靠枚举、长段机械填满的题仍须重做。
|
||||
|
||||
## 5. 玩家测试(待实施)
|
||||
|
||||
先找3–5名新玩家定性测试规则解释与明显枯燥点,再组织更大样本进行50关分会话测试。每关20–30人可暴露明显问题,不用于精确估计低频退出或A/B显著性;A/B需要根据实际方差和所需效应另算样本量。
|
||||
|
||||
记录实际开始、首次落格、首次偏离、冲突被发现、回退、重开、提示、完成、离开、下一关启动和下一会话返回。仅本地导出记录,不在本轮加入自动网络上传。
|
||||
|
||||
第一次尝试:从首次起手到首次重开、提示或结束;分别记录是否含回退。首次无提示且无回退完成、允许回退的无提示完成、最终完成分开统计,避免成功率口径混乱。
|
||||
|
||||
思考时间:从盘面可读到首次落格,加上绘制途中思考停顿的候选口径,后台时间剔除;另存开始到完成总耗时。暂停阈值需在原型事件采集前固定,当前设计时间目标不与总耗时混用。
|
||||
|
||||
单关统计P50/P75/P90时间、错误发现延迟、回退、提示、开始后退出、完成后下一关启动。退出分为卡关、无聊、正常结束会话、操作/显示问题,结合短口述或选择项;不能把退出全部解释成难度。
|
||||
|
||||
先以实际测量修正排序,不用本方案的秒数直接判定成败。教学关目标是理解规则;挑战关目标是可解释推理;释放关目标是减少负担并保持兴趣。重点检查8/18/28/38/48峰值,以及其后两关是否让玩家愿意继续。
|
||||
|
||||
A/B关序保持完全相同题库:A第8峰值、9/10释放;B把峰值移至章末。用户首次参与时固定分组,不在同一玩家每章切换,避免学习效应。比较完成后下一关启动和后续会话返回,同时检查新规则理解、提示与卡关退出;未达样本前只作定性观察,不宣布最优。
|
||||
|
||||
## 6. 数据契约(规划,不是运行关卡)
|
||||
|
||||
设计任务记录levelId、designKey、教学任务、候选几何/机制、目标分/目标带、目标关键选择与依赖、制作状态。具体cells/walls/doors及作者解只有制作完成才填写到独立关卡包。
|
||||
|
||||
关序manifest维护ID数组,A/B互为同集合排列。已发题重排不清空已通关进度;实质规则改变有revision;替换为新谜题分配新ID。
|
||||
|
||||
当前交付不承诺平台、网络、广告或周期上线日期。先做玩法曲线验证,再安排手机体验和release内容生产。
|
||||
''',encoding='utf-8')
|
||||
# Minimal static SVG: target scores only, no inference that it is a measured curve.
|
||||
def curve(ids):
|
||||
lookup={l['levelId']:l for l in levels};seq=[lookup[i]['targetDifficulty'] for i in ids];W,H=1060,320;L,T=50,20;pw,ph=990,245
|
||||
parts=[f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 {W} {H}" role="img" aria-label="50关策划目标难度曲线,非实测"><rect width="1060" height="320" fill="#101e33"/>']
|
||||
for v in (0,20,40,60,80,100):y=T+ph*(1-v/100);parts+=[f'<line x1="{L}" y1="{y}" x2="1040" y2="{y}" stroke="#30435d"/><text x="40" y="{y+4}" fill="#becddd" font-size="12" text-anchor="end">{v}</text>']
|
||||
for pos in (1,10,20,30,40,50):x=L+pw*(pos-1)/49;parts+=[f'<text x="{x}" y="290" fill="#becddd" font-size="13" text-anchor="middle">{pos}</text>']
|
||||
for c in range(5):x=L+pw*(c*10)/49;parts+=[f'<line x1="{x}" y1="20" x2="{x}" y2="265" stroke="#37516f" stroke-dasharray="4 5"/>']
|
||||
points=' '.join(f'{L+pw*i/49:.2f},{T+ph*(1-v/100):.2f}' for i,v in enumerate(seq));parts+=[f'<polyline points="{points}" fill="none" stroke="#73d6c3" stroke-width="3"/>']
|
||||
parts+=['<text x="1040" y="310" fill="#becddd" font-size="12" text-anchor="end">目标分 · 非实测 · 关序位置</text></svg>'];return ''.join(parts)
|
||||
(out/'curve-a.svg').write_text(curve(plan['orders']['A']['levelIds']),encoding='utf-8');(out/'curve-b.svg').write_text(curve(plan['orders']['B']['levelIds']),encoding='utf-8')
|
||||
print('Markdown specification, validation plan and A/B SVG curves written.')
|
||||
@@ -0,0 +1,16 @@
|
||||
from pathlib import Path
|
||||
import json,html
|
||||
out=Path(r'G:\项目\NumberSwipe-Variants\design\demo-50');plan=json.loads((out/'demo-design.json').read_text(encoding='utf-8'));a=(out/'curve-a.svg').read_text(encoding='utf-8');b=(out/'curve-b.svg').read_text(encoding='utf-8');payload=json.dumps(plan,ensure_ascii=False).replace('<','\\u003c')
|
||||
page=r'''<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>NumberSwipe · 50关DEMO设计与难度曲线</title><style>
|
||||
:root{--bg:#0d1727;--panel:#15253c;--ink:#eaf0f7;--soft:#adc0d6;--line:#30455e;--mint:#76d6c3;--orange:#ffc781}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.7 system-ui,'Microsoft YaHei',sans-serif}main{max-width:1160px;margin:auto;padding:40px 24px 70px}header{padding:20px 0 24px}h1{font-size:clamp(28px,4vw,44px);line-height:1.3;margin:12px 0}h2{font-size:24px;margin:0 0 14px}h3{font-size:18px;margin:0 0 10px}p{color:var(--soft)}a{color:#9ec6ff}.eyebrow{color:var(--mint);font-size:12px;letter-spacing:.12em}.banner{border-left:4px solid var(--orange);padding:12px 16px;background:#332c32;margin:18px 0}.card{padding:20px;border:1px solid var(--line);background:var(--panel);border-radius:14px;margin:16px 0}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.grid .card{margin:0}.number{font-size:32px;color:var(--mint);font-weight:750}.muted{font-size:12px;color:var(--soft)}section{margin:34px 0}button,select{font:inherit;color:var(--ink);background:#203752;border:1px solid #49617c;border-radius:8px;padding:8px 12px;min-height:42px}button{cursor:pointer}button.active{background:#2d635f;border-color:var(--mint)}button:focus-visible,select:focus-visible,a:focus-visible{outline:3px solid #f0d183}.controls{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin:14px 0}.chart svg{width:100%;height:auto;display:block}.table-wrap{overflow:auto;border:1px solid var(--line);border-radius:12px}table{width:100%;border-collapse:collapse;min-width:850px;font-size:13px}th{background:#223650;text-align:left;white-space:nowrap}td,th{padding:11px 12px;border-bottom:1px solid var(--line);vertical-align:top}tr:nth-child(even){background:#15253c}tr.peak{background:#293f4c}td.score{font-weight:750;color:var(--mint)}.pill{display:inline-block;background:#274459;color:#bbdbe7;border-radius:20px;padding:2px 8px;font-size:12px;margin:2px}details{margin:15px 0;padding:18px;border:1px solid var(--line);border-radius:12px;background:var(--panel)}summary{cursor:pointer;font-weight:700}dl{display:grid;grid-template-columns:100px 1fr;gap:10px}dt{color:var(--mint)}dd{margin:0;color:var(--soft)}ul{color:var(--soft);padding-left:24px}li{margin:6px 0}.links{display:flex;gap:18px;flex-wrap:wrap}.callout{padding:14px;background:#173536;border-radius:10px}.two{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media(max-width:740px){main{padding:20px 14px}.grid,.two{grid-template-columns:1fr}dl{grid-template-columns:1fr}dt{font-weight:700}}@media print{body{background:white;color:#111}p,dd,li{color:#333}.card,details{background:white}.controls,button{display:none}summary{font-size:16px}details{break-inside:avoid}table{min-width:0;font-size:10px}.chart svg{max-height:220px}}
|
||||
</style></head><body><main><header><div class="eyebrow">NUMBERSWIPE · DEMO DESIGN · 2026-10-14</div><h1>50关DEMO<br>关卡设计与难度曲线</h1><p>外层缓慢成长,章内形成峰谷。前两关完成操作教学;以五关单元引入新机制,再通过结构与组合形成变化。</p><p class="callout"><strong>50关可玩版已制作:</strong><a href="../../campaign-50/index.html">打开50关DEMO →</a> 本页保留原始设计目标,制作验收见试玩目录报告。</p><div class="banner"><strong>制作任务规划 · 尚非可玩关卡包</strong><br>目标分、时间和推理层数是待测试假设。未生成50个具体盘面、未验证50关唯一解,也没有真人难度数据。</div><div class="links"><a href="DEMO_DESIGN.md">完整设计说明</a><a href="difficulty-curve.csv" download>下载曲线CSV</a><a href="VALIDATION_PLAN.md">制作与测试标准</a><a href="demo-design.json" download>设计任务JSON</a><a href="../../index.html">现有40关原型</a></div></header>
|
||||
<div class="grid"><div class="card"><div class="number">50</div><strong>设计任务</strong><p class="muted">5章×10关;每关有推理意图和诱惑路线</p></div><div class="card"><div class="number">40 → 72</div><strong>阶段目标峰值</strong><p class="muted">策划标尺0–100,给长期扩展留出空间</p></div><div class="card"><div class="number">A / B</div><strong>同题库两种关序</strong><p class="muted">章节第8关峰值/章末峰值对照</p></div></div>
|
||||
<section class="card"><h2>项目适配与边界</h2><div class="two"><div><h3>采用研究中的方法</h3><ul><li>难度看有效分叉、区域风险、错误发现延迟和推理依赖。</li><li>新技巧单独引入,再练习、变化、组合、巩固。</li><li>目标分、算法指标和真人表现分别保存。</li><li>章节峰谷与参数需测试,不能视为竞品内部标准。</li></ul></div><div><h3>坚持项目实际规则</h3><ul><li>数字是绝对访问步号;拼块整块一步,格数不等于面积。</li><li>方向通道只用于单位方格整盘;不继承到六边或大格。</li><li>奇偶优先用于大格/非双色六边,避免冗余。</li><li>门按落格切换,起点计入;单位方格不能靠随意绕圈补奇偶。</li></ul></div></div><p class="callout">现有Variants尚无奇偶判定,双色启用依赖玩法名称。组合主线需新增独立的features开关及奇偶支持;本次没有改动运行代码或手机体验。</p></section>
|
||||
<section class="card"><h2>先验证六道桥接样题</h2><p>05异形共边、13拐角端口、18双色与墙、21单奇偶、24双奇偶协作、28大格与门位。均计入50关,不额外增加关数;对应规则先教会,再测试组合。</p><p>教学按课程顺序;难度校准先掌握规则,再交错代表题并隔开同盘形题。补充依据为原项目10月14日深度调研与45关结构审计,该审计不等于Variants的40关验证。</p></section><section><h2>目标难度曲线</h2><p>默认A的峰值在8、18、28、38、48关;末两关释放并顺畅收束。B使用同样50道题,把各章峰值移到章末。曲线不是通过概率。</p><div class="controls"><button id="a" class="active">A · 第8关峰值</button><button id="b">B · 章末峰值</button><button id="csv">导出当前关序CSV</button><span id="orderLabel" class="muted"></span></div><div class="chart" id="chartA">__SVG_A__</div><div class="chart" id="chartB" hidden>__SVG_B__</div></section>
|
||||
<section><h2>五章节奏</h2><div class="table-wrap"><table><thead><tr><th>关卡</th><th>章节</th><th>新内容</th><th>主要任务</th><th>峰值</th></tr></thead><tbody id="chapters"></tbody></table></div></section>
|
||||
<section><h2>50关逐关任务</h2><div class="controls"><label>章节 <select id="chapter"><option value="">全部</option></select></label><label>机制 <select id="feature"><option value="">全部</option></select></label><label>功能 <select id="role"><option value="">全部</option><option>章节峰值</option><option>释放</option><option>收束</option></select></label><span id="count" class="muted"></span></div><p class="muted">列表按当前A/B位置排列。点击“详细设计”查看布局、关键推理与排除依据;切换曲线不会更改关卡身份。</p><div class="table-wrap"><table><thead><tr><th>位置/设计号</th><th>标题/功能</th><th>几何/机制</th><th>节点目标</th><th>目标分</th><th>核心任务</th><th>思考P50目标</th></tr></thead><tbody id="tasks"></tbody></table></div><div id="details"></div></section>
|
||||
<section class="card"><h2>制作与测试验收</h2><ul><li>每关先写推理,再做盘面:唯一解且所有新机制逐项必要,组合需有跨机制依赖。</li><li>几何邻接度、搜索节点数不能冒充有效分叉或真人难度;原型结构快照只作诊断。</li><li>先少量新玩家定性测试,再以足够样本比较A/B;分组固定,不在同一玩家中随机换曲线。</li><li>记录错误发现延迟、回退、提示、完成后下一关启动和后续返回;区分卡关、无聊和正常会话结束。</li><li>先验证关卡趣味和节奏,之后再调整手机触点、字号、反馈和动效。</li></ul></section>
|
||||
<section class="card"><h2>51–100关与正式版</h2><p>优先用区域拓扑、对称破局、空洞、枢纽先后和线索位置开发变化,不要求第51关更难,也不要求新增机制。DEMO题目作为内容资产保留,正式首发前按测试筛选重排;上线后按章节与主题包扩展。</p><p>关卡ID、内容修订和显示顺序分开。重排不清空通关记录;实质重做的题有修订或新ID。过难好题可以进入挑战包。</p></section><footer class="muted">来源:用户提供的NumberSwipe_Research_H5.html+当前原型代码与40关数据只读核对。报告外部竞品统计未独立复算。详细一致性检查见plan-check.json。</footer></main>
|
||||
<script>const PLAN=__PLAN__;const names={big:'大格/异形',walls:'墙',direction:'方向',alternation:'双色',parity:'奇偶','rhythm-door':'步进门'};const geo={square:'单位方格',blocks:'拼块',hex:'六边'};const $=id=>document.getElementById(id);let order='A';const lookup=new Map(PLAN.levels.map(l=>[l.levelId,l]));const esc=s=>String(s).replaceAll('&','&').replaceAll('<','<').replaceAll('>','>').replaceAll('"','"');function mechanism(l){return l.features.map(f=>names[f]).join('+')||'数字基础';}function option(el,v,text){const o=document.createElement('option');o.value=v;o.textContent=text;el.appendChild(o);}for(const c of PLAN.chapters)option($('chapter'),c.id,'第'+c.id+'章 · '+c.title);for(const [id,name]of Object.entries(names))option($('feature'),id,name);$('chapters').innerHTML=PLAN.chapters.map(c=>{const ls=PLAN.levels.filter(l=>l.chapter===c.id);return `<tr><td>${(c.id-1)*10+1}–${c.id*10}</td><td>${esc(c.title)}</td><td>${esc(c.introduced.map(k=>names[k]||({hex:'六边几何','unknown-start':'未知起点'})[k]).join('、')||'不新增规则')}</td><td>${esc(c.focus)}</td><td>${Math.max(...ls.map(l=>l.targetDifficulty))}</td></tr>`;}).join('');function render(){const ids=PLAN.orders[order].levelIds;const items=ids.map((id,i)=>({l:lookup.get(id),position:i+1})).filter(({l})=>(!$('chapter').value||l.chapter==$('chapter').value)&&(!$('feature').value||l.features.includes($('feature').value))&&(!$('role').value||l.role===$('role').value));$('count').textContent=`显示 ${items.length}/50关`;$('orderLabel').textContent=PLAN.orders[order].title;$('chartA').hidden=order!=='A';$('chartB').hidden=order!=='B';$('a').className=order==='A'?'active':'';$('b').className=order==='B'?'active':'';$('tasks').innerHTML=items.map(({l,position})=>`<tr class="${l.role==='章节峰值'?'peak':''}"><td>${position}<br><span class="muted">${esc(l.designKey)}</span></td><td><strong>${esc(l.title)}</strong><br>${esc(l.role)}${l.introduces?'<br><span class="pill">引入 '+esc(l.introduces)+'</span>':''}</td><td>${geo[l.geometry]}<br>${mechanism(l)}</td><td>${l.nodeCountTarget}</td><td class="score">${l.targetDifficulty}<br><span class="muted">${l.targetDifficultyBand.join('–')}</span></td><td>${esc(l.teachingGoal)}<br><a href="#detail-${l.designKey}">详细设计 ↓</a></td><td>${l.thinkingSecondsP50Target.join('–')}秒<br><span class="muted">待测目标</span></td></tr>`).join('');$('details').innerHTML=items.map(({l,position})=>`<details id="detail-${l.designKey}"><summary>${position} · ${esc(l.title)} · ${mechanism(l)} · 目标${l.targetDifficulty}</summary><dl><dt>盘面构造</dt><dd>${esc(l.layoutIntent)}</dd><dt>条件预算</dt><dd>${esc(l.constraintsBudget)}</dd><dt>关键顿悟</dt><dd>${esc(l.teachingGoal)}</dd><dt>诱惑路线</dt><dd>${esc(l.temptingRouteIntent)}</dd><dt>排除依据</dt><dd>${esc(l.rejectionReason)}</dd><dt>前置技能</dt><dd>${esc(l.prerequisiteSkills.join("、")||"无需前置")}</dd><dt>推理目标</dt><dd>有效选择${l.targetDecisionCount.join('–')}处;最长依赖约${l.targetDependencyDepth}层;${l.unknownStart?'起点未知':'给定起点'}。</dd><dt>项目落地</dt><dd>${esc(l.implementationNote)}</dd><dt>原型参考</dt><dd>${esc(l.sourceCandidates.join('、')||'新做基础题')};仅作构造参考。</dd><dt>当前状态</dt><dd>设计任务,尚无具体坐标/作者解/唯一性结果/真人测量。</dd></dl></details>`).join('');}for(const id of ['chapter','feature','role'])$(id).addEventListener('change',render);$('a').onclick=()=>{order='A';render();};$('b').onclick=()=>{order='B';render();};$('csv').onclick=()=>{const rows=PLAN.orders[order].levelIds.map((id,i)=>{const l=lookup.get(id);return [i+1,l.levelId,l.designKey,l.title,l.targetDifficulty,l.role];});const quote=x=>'"'+String(x).replaceAll('"','""')+'"';const text='\ufeffposition,level_id,design_key,title,target_difficulty,role\r\n'+rows.map(r=>r.map(quote).join(',')).join('\r\n');const u=URL.createObjectURL(new Blob([text],{type:'text/csv;charset=utf-8'}));const a=document.createElement('a');a.href=u;a.download='NumberSwipe_DEMO50_Order_'+order+'.csv';a.click();setTimeout(()=>URL.revokeObjectURL(u),1000);};render();</script></body></html>'''
|
||||
page=page.replace('__SVG_A__',a).replace('__SVG_B__',b).replace('__PLAN__',payload);(out/'index.html').write_text(page,encoding='utf-8');print('Offline planning H5 written:',len(page),'characters')
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
from pathlib import Path
|
||||
import json,csv
|
||||
out=Path(r'G:\项目\NumberSwipe-Variants\design\demo-50');plan=json.loads((out/'demo-design.json').read_text(encoding='utf-8'))
|
||||
columns=['participant','order_group','session','level_id','content_revision','display_position_a','teaching_or_calibration','started_at','first_draw_at','thinking_seconds','drawing_seconds','total_seconds','first_wrong_step','error_detection_delay_steps','backtracks','restarts','hint_count','completed','exit_reason','next_level_started','next_session_returned','subjective_difficulty_1_5','rule_understood','key_reasoning','feedback']
|
||||
with (out/'playtest-template.csv').open('w',encoding='utf-8-sig',newline='') as f:
|
||||
writer=csv.DictWriter(f,fieldnames=columns);writer.writeheader()
|
||||
for l in plan['levels']:writer.writerow({'level_id':l['levelId'],'display_position_a':l['displayOrder']})
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1060 320" role="img" aria-label="50关策划目标难度曲线,非实测"><rect width="1060" height="320" fill="#101e33"/><line x1="50" y1="265.0" x2="1040" y2="265.0" stroke="#30435d"/><text x="40" y="269.0" fill="#becddd" font-size="12" text-anchor="end">0</text><line x1="50" y1="216.0" x2="1040" y2="216.0" stroke="#30435d"/><text x="40" y="220.0" fill="#becddd" font-size="12" text-anchor="end">20</text><line x1="50" y1="167.0" x2="1040" y2="167.0" stroke="#30435d"/><text x="40" y="171.0" fill="#becddd" font-size="12" text-anchor="end">40</text><line x1="50" y1="118.0" x2="1040" y2="118.0" stroke="#30435d"/><text x="40" y="122.0" fill="#becddd" font-size="12" text-anchor="end">60</text><line x1="50" y1="68.99999999999999" x2="1040" y2="68.99999999999999" stroke="#30435d"/><text x="40" y="72.99999999999999" fill="#becddd" font-size="12" text-anchor="end">80</text><line x1="50" y1="20.0" x2="1040" y2="20.0" stroke="#30435d"/><text x="40" y="24.0" fill="#becddd" font-size="12" text-anchor="end">100</text><text x="50.0" y="290" fill="#becddd" font-size="13" text-anchor="middle">1</text><text x="231.83673469387756" y="290" fill="#becddd" font-size="13" text-anchor="middle">10</text><text x="433.8775510204082" y="290" fill="#becddd" font-size="13" text-anchor="middle">20</text><text x="635.9183673469388" y="290" fill="#becddd" font-size="13" text-anchor="middle">30</text><text x="837.9591836734694" y="290" fill="#becddd" font-size="13" text-anchor="middle">40</text><text x="1040.0" y="290" fill="#becddd" font-size="13" text-anchor="middle">50</text><line x1="50.0" y1="20" x2="50.0" y2="265" stroke="#37516f" stroke-dasharray="4 5"/><line x1="252.0408163265306" y1="20" x2="252.0408163265306" y2="265" stroke="#37516f" stroke-dasharray="4 5"/><line x1="454.0816326530612" y1="20" x2="454.0816326530612" y2="265" stroke="#37516f" stroke-dasharray="4 5"/><line x1="656.1224489795918" y1="20" x2="656.1224489795918" y2="265" stroke="#37516f" stroke-dasharray="4 5"/><line x1="858.1632653061224" y1="20" x2="858.1632653061224" y2="265" stroke="#37516f" stroke-dasharray="4 5"/><polyline points="50.00,235.60 70.20,225.80 90.41,216.00 110.61,211.10 130.82,201.30 151.02,191.50 171.22,179.25 191.43,167.00 211.63,206.20 231.84,196.40 252.04,206.20 272.24,196.40 292.45,186.60 312.65,179.25 332.86,171.90 353.06,201.30 373.27,186.60 393.47,152.30 413.67,186.60 433.88,176.80 454.08,191.50 474.29,181.70 494.49,169.45 514.69,159.65 534.90,176.80 555.10,186.60 575.31,171.90 595.51,142.50 615.71,167.00 635.92,162.10 656.12,181.70 676.33,171.90 696.53,159.65 716.73,149.85 736.94,167.00 757.14,157.20 777.35,144.95 797.55,122.90 817.76,162.10 837.96,152.30 858.16,157.20 878.37,147.40 898.57,137.60 918.78,127.80 938.98,122.90 959.18,118.00 979.39,105.75 999.59,88.60 1019.80,147.40 1040.00,132.70" fill="none" stroke="#73d6c3" stroke-width="3"/><text x="1040" y="310" fill="#becddd" font-size="12" text-anchor="end">目标分 · 非实测 · 关序位置</text></svg>
|
||||
|
After Width: | Height: | Size: 3.0 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1060 320" role="img" aria-label="50关策划目标难度曲线,非实测"><rect width="1060" height="320" fill="#101e33"/><line x1="50" y1="265.0" x2="1040" y2="265.0" stroke="#30435d"/><text x="40" y="269.0" fill="#becddd" font-size="12" text-anchor="end">0</text><line x1="50" y1="216.0" x2="1040" y2="216.0" stroke="#30435d"/><text x="40" y="220.0" fill="#becddd" font-size="12" text-anchor="end">20</text><line x1="50" y1="167.0" x2="1040" y2="167.0" stroke="#30435d"/><text x="40" y="171.0" fill="#becddd" font-size="12" text-anchor="end">40</text><line x1="50" y1="118.0" x2="1040" y2="118.0" stroke="#30435d"/><text x="40" y="122.0" fill="#becddd" font-size="12" text-anchor="end">60</text><line x1="50" y1="68.99999999999999" x2="1040" y2="68.99999999999999" stroke="#30435d"/><text x="40" y="72.99999999999999" fill="#becddd" font-size="12" text-anchor="end">80</text><line x1="50" y1="20.0" x2="1040" y2="20.0" stroke="#30435d"/><text x="40" y="24.0" fill="#becddd" font-size="12" text-anchor="end">100</text><text x="50.0" y="290" fill="#becddd" font-size="13" text-anchor="middle">1</text><text x="231.83673469387756" y="290" fill="#becddd" font-size="13" text-anchor="middle">10</text><text x="433.8775510204082" y="290" fill="#becddd" font-size="13" text-anchor="middle">20</text><text x="635.9183673469388" y="290" fill="#becddd" font-size="13" text-anchor="middle">30</text><text x="837.9591836734694" y="290" fill="#becddd" font-size="13" text-anchor="middle">40</text><text x="1040.0" y="290" fill="#becddd" font-size="13" text-anchor="middle">50</text><line x1="50.0" y1="20" x2="50.0" y2="265" stroke="#37516f" stroke-dasharray="4 5"/><line x1="252.0408163265306" y1="20" x2="252.0408163265306" y2="265" stroke="#37516f" stroke-dasharray="4 5"/><line x1="454.0816326530612" y1="20" x2="454.0816326530612" y2="265" stroke="#37516f" stroke-dasharray="4 5"/><line x1="656.1224489795918" y1="20" x2="656.1224489795918" y2="265" stroke="#37516f" stroke-dasharray="4 5"/><line x1="858.1632653061224" y1="20" x2="858.1632653061224" y2="265" stroke="#37516f" stroke-dasharray="4 5"/><polyline points="50.00,235.60 70.20,225.80 90.41,216.00 110.61,211.10 130.82,201.30 151.02,191.50 171.22,179.25 191.43,206.20 211.63,196.40 231.84,167.00 252.04,206.20 272.24,196.40 292.45,186.60 312.65,179.25 332.86,171.90 353.06,201.30 373.27,186.60 393.47,186.60 413.67,176.80 433.88,152.30 454.08,191.50 474.29,181.70 494.49,169.45 514.69,159.65 534.90,176.80 555.10,186.60 575.31,171.90 595.51,167.00 615.71,162.10 635.92,142.50 656.12,181.70 676.33,171.90 696.53,159.65 716.73,149.85 736.94,167.00 757.14,157.20 777.35,144.95 797.55,162.10 817.76,152.30 837.96,122.90 858.16,157.20 878.37,147.40 898.57,137.60 918.78,127.80 938.98,122.90 959.18,118.00 979.39,105.75 999.59,147.40 1019.80,132.70 1040.00,88.60" fill="none" stroke="#73d6c3" stroke-width="3"/><text x="1040" y="310" fill="#becddd" font-size="12" text-anchor="end">目标分 · 非实测 · 关序位置</text></svg>
|
||||
|
After Width: | Height: | Size: 3.0 KiB |
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,51 @@
|
||||
design_key,level_id,position_a,position_b,chapter,role,title,geometry,features,node_target,target_difficulty,target_low,target_high,thinking_p50_low,thinking_p50_high,measured_difficulty
|
||||
demo-001,21ceadc1-cd0e-511b-b7d3-d227e01de8a1,1,1,1,演示/热身,第一笔,square,数字,5,12,8,16,8,18,
|
||||
demo-002,de71e06d-ed2b-5371-a3dd-7089ccff10b3,2,2,1,练习,先收短支路,square,数字,8,16,12,20,8,18,
|
||||
demo-003,f521de33-0d27-54c1-9c04-8fe43955132c,3,3,1,变化,大块一步,blocks,big,8,20,16,24,12,35,
|
||||
demo-004,07323e0e-de6c-5d71-8876-e3d88d008b60,4,4,1,组合,枢纽留后,blocks,big,10,22,18,26,12,30,
|
||||
demo-005,0b255856-d185-5314-85e3-4a95eb233b04,5,5,1,巩固,认清异形共边,blocks,big,11,26,22,30,12,35,
|
||||
demo-006,23914286-0aa4-5d7a-afd1-b5a31c0c1a6e,6,6,1,演示/迁移,边上的墙,square,walls,9,30,26,34,12,35,
|
||||
demo-007,e85cd2f3-94af-5b5e-bfd5-d513e6a5ba2c,7,7,1,练习/挑战,近路要绕,square,walls,11,35,31,39,12,30,
|
||||
demo-008,a2cbcb61-034a-5215-9a31-035c1c0b96f5,8,10,1,章节峰值,第一座桥,blocks,big+walls,13,40,36,44,20,45,
|
||||
demo-009,c27d6782-9897-56e4-9024-27a725af609a,9,8,1,释放,绕过去就好,square,walls,9,24,20,28,12,28,
|
||||
demo-010,2a913cf0-2d97-512f-b8d8-bf4b859ac675,10,9,1,收束,对称小花园,blocks,big+walls,12,28,24,32,12,28,
|
||||
demo-011,9edd9ff2-ed54-5fd8-a0e5-8c477b3100bc,11,11,2,演示/热身,左右通道,square,direction,9,24,20,28,12,35,
|
||||
demo-012,852f0119-285e-5ec3-9569-8e34485bcf74,12,12,2,练习,上下通道,square,direction,10,28,24,32,12,35,
|
||||
demo-013,f509046b-a9b3-5f56-9aeb-e5b772115dfe,13,13,2,变化,认清拐角,square,direction,11,32,28,36,12,35,
|
||||
demo-014,44f6955d-e999-5c24-8d71-14dc2d16f8f1,14,14,2,组合,两角相接,square,direction+walls,13,35,31,39,15,40,
|
||||
demo-015,8f11cd51-0d6d-584a-9d00-babd8e381410,15,15,2,巩固,直线与拐角,square,direction+walls,14,38,34,42,15,40,
|
||||
demo-016,a9749d13-9881-5ed8-9fcd-d06589e4e7df,16,16,2,演示/迁移,蓝橙第一步,blocks,big+alternation,9,26,22,30,12,35,
|
||||
demo-017,a9742951-1d48-538e-8d10-f37c3492ed6f,17,17,2,练习/挑战,留下另一种颜色,blocks,big+alternation,12,32,28,36,15,40,
|
||||
demo-018,7261dec3-e994-5326-8755-2e60168b909c,18,20,2,章节峰值,双色跨区,blocks,big+alternation+walls,15,46,42,50,20,45,
|
||||
demo-019,21ae0172-eeda-51ab-a66c-2de946d2541b,19,18,2,释放,短短的接力,blocks,big+alternation,10,32,28,36,12,28,
|
||||
demo-020,cc92cc4f-1336-544e-81b4-bd6731ed60d3,20,19,2,收束,双色回环,blocks,big+alternation,13,36,32,40,12,28,
|
||||
demo-021,9b9c1633-aedf-51f2-a04b-3818a2c6b7db,21,21,3,演示/热身,偶数落脚,blocks,big+parity,10,30,26,34,12,35,
|
||||
demo-022,2174f62c-3d56-575a-8210-b1535710e9b0,22,22,3,练习,奇数绕行,blocks,big+parity,12,34,30,38,20,55,
|
||||
demo-023,82766c6c-a705-5340-acf7-d4d46dc113c1,23,23,3,变化,凹口的步号,blocks,big+parity,13,39,35,43,20,55,
|
||||
demo-024,f872f251-f6cd-5cf4-a8fa-c3619f948f22,24,24,3,组合,墙后先收尾,blocks,big+parity+walls,15,43,39,47,20,55,
|
||||
demo-025,1bcbf26f-650f-5791-b227-dd5e8f0d2dd0,25,25,3,巩固,少量线索也够,blocks,big+parity,12,36,32,40,20,55,
|
||||
demo-026,da394472-bef6-53dd-abb2-bc4e7a60f07e,26,26,3,演示/迁移,门随脚步开关,square,rhythm-door,9,32,28,36,12,35,
|
||||
demo-027,d1d36cdb-8e4f-57b9-b53a-754da1264744,27,27,3,练习/挑战,从另一侧通过,square,rhythm-door,12,38,34,42,20,55,
|
||||
demo-028,a3f362fb-e070-5340-804a-14cb90fef2d4,28,30,3,章节峰值,大块改变节拍,blocks,big+rhythm-door,15,50,46,54,30,75,
|
||||
demo-029,d09f715e-948a-5ddc-ac89-1e2fa8e917f3,29,28,3,释放,墙和门分开看,blocks,big+rhythm-door+walls,12,40,36,44,18,40,
|
||||
demo-030,ea61da6f-0488-59bd-b1f5-5e4f4efa4bbd,30,29,3,收束,顺着节拍收尾,blocks,big+rhythm-door,14,42,38,46,18,40,
|
||||
demo-031,d61b202d-a661-5a76-8b40-0cef0a79480d,31,31,4,演示/热身,六向邻接,hex,walls,10,34,30,38,12,35,
|
||||
demo-032,2c745dac-0edc-5d14-acda-be7bd80331f9,32,32,4,练习,六边留出口,hex,walls,13,38,34,42,20,55,
|
||||
demo-033,36adc671-1d28-5c05-96c1-c7f84dff757a,33,33,4,变化,六边换颜色,hex,alternation,13,43,39,47,20,55,
|
||||
demo-034,a0bd742b-73c2-5dd6-9df9-a69580e5becd,34,34,4,组合,颜色之外还有墙,hex,alternation+walls,15,47,43,51,20,55,
|
||||
demo-035,03398b88-7ed6-5bc3-b001-7bbcb825d963,35,35,4,巩固,六边小花园,hex,alternation+walls,12,40,36,44,20,55,
|
||||
demo-036,1a91cff3-d0ef-5abc-b4a1-adbc4d70a208,36,36,4,演示/迁移,六边也有奇偶,hex,parity,14,44,40,48,20,55,
|
||||
demo-037,2e11044e-f88b-5152-bda8-b1eed66a3888,37,37,4,练习/挑战,起点没有写出,hex,parity,12,49,45,53,12,35,
|
||||
demo-038,349e4537-d0e7-545d-be9b-feb7ff23fa2f,38,40,4,章节峰值,找起点再跨区,hex,parity+walls,17,58,54,62,30,75,
|
||||
demo-039,7f895016-a15f-5d1a-b89b-dce54f3f0986,39,38,4,释放,给回起点的短题,hex,parity+walls,12,42,38,46,18,40,
|
||||
demo-040,15549f52-37a6-5149-b564-8caf096022fe,40,39,4,收束,六边收束,hex,parity+walls,15,46,42,50,18,40,
|
||||
demo-041,034f2c11-d092-5280-b22d-dbe2b8ca26c2,41,41,5,演示/热身,通道再接力,square,direction+walls,15,44,40,48,25,65,
|
||||
demo-042,758c22d7-8b75-5110-befe-9b4b71a749b0,42,42,5,练习,两个双色枢纽,blocks,big+alternation+walls,16,48,44,52,25,65,
|
||||
demo-043,d430c0b6-4d1c-50f0-9365-82f40d6bdcdb,43,43,5,变化,奇偶分配区域,blocks,big+parity+walls,17,52,48,56,25,65,
|
||||
demo-044,09653cbe-4ca9-571d-b976-853ac0ecb886,44,44,5,组合,六边出口互锁,hex,alternation+walls,18,56,52,60,25,65,
|
||||
demo-045,ba80bb56-a59e-55aa-b586-46d245984ccb,45,45,5,巩固,方向决定门路,square,direction+rhythm-door,16,58,54,62,25,65,
|
||||
demo-046,9ceed4f0-5c12-5251-9cc9-11aafba3e8c3,46,46,5,演示/迁移,先定奇偶,再定节拍,blocks,big+parity+rhythm-door,17,60,56,64,25,65,
|
||||
demo-047,71a70b69-ff59-51a3-a149-1dd88868c0f3,47,47,5,练习/挑战,墙通道门三者联动,square,direction+walls+rhythm-door,18,65,61,69,25,65,
|
||||
demo-048,e96c918b-2f4c-5a18-b443-8ac574f77ad6,48,50,5,章节峰值,六边综合峰值,hex,parity+walls+rhythm-door,19,72,68,76,45,100,
|
||||
demo-049,a25a4829-f77f-5b4a-9163-4eef9cd3856e,49,48,5,释放,回到双色小题,blocks,big+alternation+walls,12,48,44,52,20,45,
|
||||
demo-050,f79bf403-764d-57e7-a37f-e85dce3b4505,50,49,5,收束,继续还有新花园,hex,alternation+walls,16,54,50,58,20,45,
|
||||
|
@@ -0,0 +1,5 @@
|
||||
from pathlib import Path
|
||||
p=Path(r'G:\项目\NumberSwipe-Variants\design\demo-50\build-h5.py');s=p.read_text(encoding='utf-8-sig')
|
||||
s=s.replace('<section><h2>目标难度曲线</h2>', '<section class="card"><h2>先验证六道桥接样题</h2><p>05异形共边、13拐角端口、18双色与墙、21单奇偶、24双奇偶协作、28大格与门位。均计入50关,不额外增加关数;对应规则先教会,再测试组合。</p><p>教学按课程顺序;难度校准先掌握规则,再交错代表题并隔开同盘形题。补充依据为原项目10月14日深度调研与45关结构审计,该审计不等于Variants的40关验证。</p></section><section><h2>目标难度曲线</h2>')
|
||||
s=s.replace('<dt>推理目标</dt>', '<dt>前置技能</dt><dd>${esc(l.prerequisiteSkills.join("、")||"无需前置")}</dd><dt>推理目标</dt>')
|
||||
p.write_text(s,encoding='utf-8')
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"passed": true,
|
||||
"checks": [
|
||||
"默认50条任务和5章",
|
||||
"A/B峰值位置",
|
||||
"章节筛选",
|
||||
"奇偶筛选",
|
||||
"释放功能筛选",
|
||||
"单文件规划页与状态说明",
|
||||
"CSV数据与设计任务一致"
|
||||
],
|
||||
"scope": "离线规划页脚本和数据一致性检查;不代表实际浏览器像素、手机测试或可玩关卡验收"
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
from pathlib import Path
|
||||
import json,hashlib
|
||||
out=Path(r'G:\项目\NumberSwipe-Variants\design\demo-50')
|
||||
p=out/'build-design.py';s=p.read_text(encoding='utf-8-sig')
|
||||
s=s.replace("(5,'长条的两端','blocks',['big'],11,'一个横长条+一个大格','长边接触多个邻格,不能靠面积判断路径长度','选择长条的前后邻格','沿最近接触边进入,再离开到错误区域','整块不可重访,另一侧失去访问机会'),", "(5,'认清异形共边','blocks',['big'],11,'一个L形格+早期引导数字;不加奇偶','凹口接触邻格;只新增异形读盘,不同时增加未知起点','异形整块一步,辨认哪些边实际共边','按包围盒把凹口当成块内,错误认定邻接','以真实占地共边判邻接,不能跨空洞'),")
|
||||
s=s.replace("3:'大格一步',6:","3:'大格一步',5:'异形共边',6:")
|
||||
s=s.replace("(out/'demo-design.json').write_text", "extraPaths=[root.parent/'NumberSwipe/docs/一笔画竞品调研与关卡编排方案.md',root.parent/'NumberSwipe/docs/一笔画深度调研-制作与难度证据.md',root.parent/'NumberSwipe/docs/research/level-structure-audit.json']\nplan['additionalResearchSources']=[{'path':str(p),'sha256':hashlib.sha256(p.read_bytes()).hexdigest(),'scope':'原项目45关研究,不等于Variants40关验收'} for p in extraPaths]\nplan['pilotDesignKeys']=['demo-005','demo-013','demo-018','demo-021','demo-024','demo-028']\nfor l in levels:\n l['pilotPriority']=l['designKey'] in plan['pilotDesignKeys']\n l['prerequisiteSkills']=['共边移动','每格一次','精确步号']+[names[f] for f in l['features'] if f not in ('big',) and l['introduces'] not in {'永久墙':'walls','双色交替':'alternation','奇偶':'parity','步进门':'rhythm-door'}.keys()]\nplan['skillDependencies']={'big':'共边/覆盖/步号→大格一步→大格出口→异形共边','direction':'共边/覆盖→横竖端口→明确拐角→方向联合','alternation':'覆盖/大格一步→双色交替→异色出口保留','parity':'精确步号/实际拼块邻接→单奇偶→双奇偶协作','rhythm-door':'步号/撤销→起步切换→穿门方向→大格到达状态','hex':'共边/墙→六向邻接→旧规则迁移','unknown-start':'覆盖/端点/步号推理→小盘起点未知→组合反推'}\n(out/'demo-design.json').write_text")
|
||||
# Replace overly broad inferred prerequisites with introduction-aware names in the resulting schema.
|
||||
s=s.replace("l['prerequisiteSkills']=['共边移动','每格一次','精确步号']+[names[f] for f in l['features'] if f not in ('big',) and l['introduces'] not in {'永久墙':'walls','双色交替':'alternation','奇偶':'parity','步进门':'rhythm-door'}.keys()]", "introFeature={'大格一步':'big','永久墙':'walls','横向通道':'direction','纵向通道':'direction','明确拐角':'direction','双色交替':'alternation','奇偶':'parity','步进门':'rhythm-door'};l['prerequisiteSkills']=([] if l['displayOrder']==1 else ['共边移动','每格一次','精确步号'])+[names[f] for f in l['features'] if f!=introFeature.get(l['introduces'])];l['prerequisiteSkills']+=['端点推理'] if l['unknownStart'] else []")
|
||||
p.write_text(s,encoding='utf-8')
|
||||
p=out/'build-docs.py';s=p.read_text(encoding='utf-8-sig');s=s.replace('## 逐关制作任务', '''## 最新项目研究补充与桥接验证
|
||||
|
||||
已纳入原项目docs/一笔画竞品调研与关卡编排方案.md、2026-10-14补充的《一笔画深度调研-制作与难度证据.md》及45关结构审计JSON。该审计针对原项目26数字关+19六边关;本次另行读取Variants的40关,二者不能混为同一题库的验收。
|
||||
|
||||
技能依赖:覆盖/纠错→大格计步→枢纽出口→异形共边;基本共边→横竖端口→明确拐角→方向联合;精确步号与实际拼块图→单奇偶→双奇偶;步号与撤销→起步切换→通过方向→大格到达状态;熟悉墙→六向共边→旧规则迁移。未知起点依赖端点和步号推理,先小盘专项。
|
||||
|
||||
先制作并测试6道桥接样题,均计入50关:
|
||||
|
||||
|设计号|验证任务|控制变量|
|
||||
|---|---|---|
|
||||
|05|异形共边|只增加L形读盘,不叠奇偶或未知起点|
|
||||
|13|拐角端口|只增加一种明确拐角,能解释反向通过|
|
||||
|18|双色与墙联合|先掌握16/17,再测试异色出口保留|
|
||||
|21|单奇偶|按节点计步,条件必要,不靠天然属性|
|
||||
|24|双奇偶与区域|先掌握21–23,每条条件各自有效|
|
||||
|28|大格与门位|先掌握26/27,检查实际步数关系|
|
||||
|
||||
教学测试按课程顺序。难度校准先让玩家学会对应规则,再交错代表题,避免把学习熟练或记忆同盘答案误判为题更容易。四层去重分别检查外观几何、真实邻接、约束配置、关键解法;几何相同且推理不同可以少量保留,四层等价仅限明确强化用途。
|
||||
|
||||
## 逐关制作任务''')
|
||||
p.write_text(s,encoding='utf-8')
|
||||
p=out/'VALIDATION_PLAN.md';s=p.read_text(encoding='utf-8');s+='''
|
||||
## 7. 最新项目研究补充
|
||||
|
||||
先从50关内制作05/13/18/21/24/28六道桥接样题,不额外扩关。训练与教学用正式关序;难度校准让玩家掌握规则后,交错24–30道代表题,尽量隔开同盘形题,控制学习与记忆效应。主观难度统一1–5分,另存思考/画线时间与规则误读,未通关者也保留记录。
|
||||
|
||||
原项目的45关审计“无即时冲突选择点”只沿正确前缀计数,既不是真人有效决策数,也不覆盖未知起点负担。Variants快照中的原始几何度数更不能替代它。两套审计都作为结构线索,不直接排50关难度。
|
||||
|
||||
几何/邻接/约束/解法四层查重。数学、机制有效、推理可解释、课程与触摸分别验收;手机版触摸验收延后,课程与规则理解不能延后。
|
||||
''';p.write_text(s,encoding='utf-8')
|
||||
p=out/'verify-design.mjs';s=p.read_text(encoding='utf-8-sig');s=s.replace("check('原项目文件内容与清单保持一致',changed.length===0&&added.length===0);", "const knownResearchAdditions=['docs/一笔画竞品调研与关卡编排方案.md','docs/一笔画深度调研-制作与难度证据.md','docs/research/audit-level-structure.mjs','docs/research/level-structure-audit.json'].map(p=>path.join('G:\\\\项目\\\\NumberSwipe',p));check('历史原项目91文件内容不变;新增仅既有研究文件',changed.length===0&&added.every(p=>knownResearchAdditions.includes(p)));check('六道桥接样题计入50关',plan.pilotDesignKeys.length===6&&plan.pilotDesignKeys.every(k=>plan.levels.some(l=>l.designKey===k)));for(const r of plan.additionalResearchSources)check('补充研究版本一致 '+path.basename(r.path),crypto.createHash('sha256').update(fs.readFileSync(r.path)).digest('hex')===r.sha256);")
|
||||
s=s.replace('originalProjectAdded:added,assertions', "originalProjectAddedSinceHistoricalBaseline:added,originalProjectWritesByThisPlanningTask:0,isolationNote:'相较旧清单已有4份研究文件新增;本任务只读原项目,写入design/demo-50。',assertions")
|
||||
p.write_text(s,encoding='utf-8')
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,394 @@
|
||||
{
|
||||
"checkedAt": "2026-10-14T07:42:02.900Z",
|
||||
"passed": true,
|
||||
"designTasks": 50,
|
||||
"existingLevelsInspected": 40,
|
||||
"checkedAssertions": 374,
|
||||
"originalProjectFilesChecked": 91,
|
||||
"originalProjectChanged": [],
|
||||
"originalProjectAddedSinceHistoricalBaseline": [
|
||||
"G:\\项目\\NumberSwipe\\docs\\research\\audit-level-structure.mjs",
|
||||
"G:\\项目\\NumberSwipe\\docs\\research\\level-structure-audit.json",
|
||||
"G:\\项目\\NumberSwipe\\docs\\一笔画深度调研-制作与难度证据.md",
|
||||
"G:\\项目\\NumberSwipe\\docs\\一笔画竞品调研与关卡编排方案.md"
|
||||
],
|
||||
"originalProjectWritesByThisPlanningTask": 0,
|
||||
"isolationNote": "相较旧清单已有4份研究文件新增;本任务只读原项目,写入design/demo-50。",
|
||||
"assertions": [
|
||||
"50条设计任务",
|
||||
"ID不重复",
|
||||
"关号连续",
|
||||
"五章,每章十关",
|
||||
"关序A为同题库排列",
|
||||
"关序B为同题库排列",
|
||||
"demo-001候选状态准确",
|
||||
"demo-001项目规模",
|
||||
"demo-001目标带",
|
||||
"demo-001不叠双色奇偶",
|
||||
"demo-001通道仅单位方格",
|
||||
"demo-001奇偶避免天然方格",
|
||||
"demo-001教学与排除依据",
|
||||
"demo-002候选状态准确",
|
||||
"demo-002项目规模",
|
||||
"demo-002目标带",
|
||||
"demo-002不叠双色奇偶",
|
||||
"demo-002通道仅单位方格",
|
||||
"demo-002奇偶避免天然方格",
|
||||
"demo-002教学与排除依据",
|
||||
"demo-003候选状态准确",
|
||||
"demo-003项目规模",
|
||||
"demo-003目标带",
|
||||
"demo-003不叠双色奇偶",
|
||||
"demo-003通道仅单位方格",
|
||||
"demo-003奇偶避免天然方格",
|
||||
"demo-003教学与排除依据",
|
||||
"demo-004候选状态准确",
|
||||
"demo-004项目规模",
|
||||
"demo-004目标带",
|
||||
"demo-004不叠双色奇偶",
|
||||
"demo-004通道仅单位方格",
|
||||
"demo-004奇偶避免天然方格",
|
||||
"demo-004教学与排除依据",
|
||||
"demo-005候选状态准确",
|
||||
"demo-005项目规模",
|
||||
"demo-005目标带",
|
||||
"demo-005不叠双色奇偶",
|
||||
"demo-005通道仅单位方格",
|
||||
"demo-005奇偶避免天然方格",
|
||||
"demo-005教学与排除依据",
|
||||
"demo-006候选状态准确",
|
||||
"demo-006项目规模",
|
||||
"demo-006目标带",
|
||||
"demo-006不叠双色奇偶",
|
||||
"demo-006通道仅单位方格",
|
||||
"demo-006奇偶避免天然方格",
|
||||
"demo-006教学与排除依据",
|
||||
"demo-007候选状态准确",
|
||||
"demo-007项目规模",
|
||||
"demo-007目标带",
|
||||
"demo-007不叠双色奇偶",
|
||||
"demo-007通道仅单位方格",
|
||||
"demo-007奇偶避免天然方格",
|
||||
"demo-007教学与排除依据",
|
||||
"demo-008候选状态准确",
|
||||
"demo-008项目规模",
|
||||
"demo-008目标带",
|
||||
"demo-008不叠双色奇偶",
|
||||
"demo-008通道仅单位方格",
|
||||
"demo-008奇偶避免天然方格",
|
||||
"demo-008教学与排除依据",
|
||||
"demo-009候选状态准确",
|
||||
"demo-009项目规模",
|
||||
"demo-009目标带",
|
||||
"demo-009不叠双色奇偶",
|
||||
"demo-009通道仅单位方格",
|
||||
"demo-009奇偶避免天然方格",
|
||||
"demo-009教学与排除依据",
|
||||
"demo-010候选状态准确",
|
||||
"demo-010项目规模",
|
||||
"demo-010目标带",
|
||||
"demo-010不叠双色奇偶",
|
||||
"demo-010通道仅单位方格",
|
||||
"demo-010奇偶避免天然方格",
|
||||
"demo-010教学与排除依据",
|
||||
"demo-011候选状态准确",
|
||||
"demo-011项目规模",
|
||||
"demo-011目标带",
|
||||
"demo-011不叠双色奇偶",
|
||||
"demo-011通道仅单位方格",
|
||||
"demo-011奇偶避免天然方格",
|
||||
"demo-011教学与排除依据",
|
||||
"demo-012候选状态准确",
|
||||
"demo-012项目规模",
|
||||
"demo-012目标带",
|
||||
"demo-012不叠双色奇偶",
|
||||
"demo-012通道仅单位方格",
|
||||
"demo-012奇偶避免天然方格",
|
||||
"demo-012教学与排除依据",
|
||||
"demo-013候选状态准确",
|
||||
"demo-013项目规模",
|
||||
"demo-013目标带",
|
||||
"demo-013不叠双色奇偶",
|
||||
"demo-013通道仅单位方格",
|
||||
"demo-013奇偶避免天然方格",
|
||||
"demo-013教学与排除依据",
|
||||
"demo-014候选状态准确",
|
||||
"demo-014项目规模",
|
||||
"demo-014目标带",
|
||||
"demo-014不叠双色奇偶",
|
||||
"demo-014通道仅单位方格",
|
||||
"demo-014奇偶避免天然方格",
|
||||
"demo-014教学与排除依据",
|
||||
"demo-015候选状态准确",
|
||||
"demo-015项目规模",
|
||||
"demo-015目标带",
|
||||
"demo-015不叠双色奇偶",
|
||||
"demo-015通道仅单位方格",
|
||||
"demo-015奇偶避免天然方格",
|
||||
"demo-015教学与排除依据",
|
||||
"demo-016候选状态准确",
|
||||
"demo-016项目规模",
|
||||
"demo-016目标带",
|
||||
"demo-016不叠双色奇偶",
|
||||
"demo-016通道仅单位方格",
|
||||
"demo-016奇偶避免天然方格",
|
||||
"demo-016教学与排除依据",
|
||||
"demo-017候选状态准确",
|
||||
"demo-017项目规模",
|
||||
"demo-017目标带",
|
||||
"demo-017不叠双色奇偶",
|
||||
"demo-017通道仅单位方格",
|
||||
"demo-017奇偶避免天然方格",
|
||||
"demo-017教学与排除依据",
|
||||
"demo-018候选状态准确",
|
||||
"demo-018项目规模",
|
||||
"demo-018目标带",
|
||||
"demo-018不叠双色奇偶",
|
||||
"demo-018通道仅单位方格",
|
||||
"demo-018奇偶避免天然方格",
|
||||
"demo-018教学与排除依据",
|
||||
"demo-019候选状态准确",
|
||||
"demo-019项目规模",
|
||||
"demo-019目标带",
|
||||
"demo-019不叠双色奇偶",
|
||||
"demo-019通道仅单位方格",
|
||||
"demo-019奇偶避免天然方格",
|
||||
"demo-019教学与排除依据",
|
||||
"demo-020候选状态准确",
|
||||
"demo-020项目规模",
|
||||
"demo-020目标带",
|
||||
"demo-020不叠双色奇偶",
|
||||
"demo-020通道仅单位方格",
|
||||
"demo-020奇偶避免天然方格",
|
||||
"demo-020教学与排除依据",
|
||||
"demo-021候选状态准确",
|
||||
"demo-021项目规模",
|
||||
"demo-021目标带",
|
||||
"demo-021不叠双色奇偶",
|
||||
"demo-021通道仅单位方格",
|
||||
"demo-021奇偶避免天然方格",
|
||||
"demo-021教学与排除依据",
|
||||
"demo-022候选状态准确",
|
||||
"demo-022项目规模",
|
||||
"demo-022目标带",
|
||||
"demo-022不叠双色奇偶",
|
||||
"demo-022通道仅单位方格",
|
||||
"demo-022奇偶避免天然方格",
|
||||
"demo-022教学与排除依据",
|
||||
"demo-023候选状态准确",
|
||||
"demo-023项目规模",
|
||||
"demo-023目标带",
|
||||
"demo-023不叠双色奇偶",
|
||||
"demo-023通道仅单位方格",
|
||||
"demo-023奇偶避免天然方格",
|
||||
"demo-023教学与排除依据",
|
||||
"demo-024候选状态准确",
|
||||
"demo-024项目规模",
|
||||
"demo-024目标带",
|
||||
"demo-024不叠双色奇偶",
|
||||
"demo-024通道仅单位方格",
|
||||
"demo-024奇偶避免天然方格",
|
||||
"demo-024教学与排除依据",
|
||||
"demo-025候选状态准确",
|
||||
"demo-025项目规模",
|
||||
"demo-025目标带",
|
||||
"demo-025不叠双色奇偶",
|
||||
"demo-025通道仅单位方格",
|
||||
"demo-025奇偶避免天然方格",
|
||||
"demo-025教学与排除依据",
|
||||
"demo-026候选状态准确",
|
||||
"demo-026项目规模",
|
||||
"demo-026目标带",
|
||||
"demo-026不叠双色奇偶",
|
||||
"demo-026通道仅单位方格",
|
||||
"demo-026奇偶避免天然方格",
|
||||
"demo-026教学与排除依据",
|
||||
"demo-027候选状态准确",
|
||||
"demo-027项目规模",
|
||||
"demo-027目标带",
|
||||
"demo-027不叠双色奇偶",
|
||||
"demo-027通道仅单位方格",
|
||||
"demo-027奇偶避免天然方格",
|
||||
"demo-027教学与排除依据",
|
||||
"demo-028候选状态准确",
|
||||
"demo-028项目规模",
|
||||
"demo-028目标带",
|
||||
"demo-028不叠双色奇偶",
|
||||
"demo-028通道仅单位方格",
|
||||
"demo-028奇偶避免天然方格",
|
||||
"demo-028教学与排除依据",
|
||||
"demo-029候选状态准确",
|
||||
"demo-029项目规模",
|
||||
"demo-029目标带",
|
||||
"demo-029不叠双色奇偶",
|
||||
"demo-029通道仅单位方格",
|
||||
"demo-029奇偶避免天然方格",
|
||||
"demo-029教学与排除依据",
|
||||
"demo-030候选状态准确",
|
||||
"demo-030项目规模",
|
||||
"demo-030目标带",
|
||||
"demo-030不叠双色奇偶",
|
||||
"demo-030通道仅单位方格",
|
||||
"demo-030奇偶避免天然方格",
|
||||
"demo-030教学与排除依据",
|
||||
"demo-031候选状态准确",
|
||||
"demo-031项目规模",
|
||||
"demo-031目标带",
|
||||
"demo-031不叠双色奇偶",
|
||||
"demo-031通道仅单位方格",
|
||||
"demo-031奇偶避免天然方格",
|
||||
"demo-031教学与排除依据",
|
||||
"demo-032候选状态准确",
|
||||
"demo-032项目规模",
|
||||
"demo-032目标带",
|
||||
"demo-032不叠双色奇偶",
|
||||
"demo-032通道仅单位方格",
|
||||
"demo-032奇偶避免天然方格",
|
||||
"demo-032教学与排除依据",
|
||||
"demo-033候选状态准确",
|
||||
"demo-033项目规模",
|
||||
"demo-033目标带",
|
||||
"demo-033不叠双色奇偶",
|
||||
"demo-033通道仅单位方格",
|
||||
"demo-033奇偶避免天然方格",
|
||||
"demo-033教学与排除依据",
|
||||
"demo-034候选状态准确",
|
||||
"demo-034项目规模",
|
||||
"demo-034目标带",
|
||||
"demo-034不叠双色奇偶",
|
||||
"demo-034通道仅单位方格",
|
||||
"demo-034奇偶避免天然方格",
|
||||
"demo-034教学与排除依据",
|
||||
"demo-035候选状态准确",
|
||||
"demo-035项目规模",
|
||||
"demo-035目标带",
|
||||
"demo-035不叠双色奇偶",
|
||||
"demo-035通道仅单位方格",
|
||||
"demo-035奇偶避免天然方格",
|
||||
"demo-035教学与排除依据",
|
||||
"demo-036候选状态准确",
|
||||
"demo-036项目规模",
|
||||
"demo-036目标带",
|
||||
"demo-036不叠双色奇偶",
|
||||
"demo-036通道仅单位方格",
|
||||
"demo-036奇偶避免天然方格",
|
||||
"demo-036教学与排除依据",
|
||||
"demo-037候选状态准确",
|
||||
"demo-037项目规模",
|
||||
"demo-037目标带",
|
||||
"demo-037不叠双色奇偶",
|
||||
"demo-037通道仅单位方格",
|
||||
"demo-037奇偶避免天然方格",
|
||||
"demo-037教学与排除依据",
|
||||
"demo-038候选状态准确",
|
||||
"demo-038项目规模",
|
||||
"demo-038目标带",
|
||||
"demo-038不叠双色奇偶",
|
||||
"demo-038通道仅单位方格",
|
||||
"demo-038奇偶避免天然方格",
|
||||
"demo-038教学与排除依据",
|
||||
"demo-039候选状态准确",
|
||||
"demo-039项目规模",
|
||||
"demo-039目标带",
|
||||
"demo-039不叠双色奇偶",
|
||||
"demo-039通道仅单位方格",
|
||||
"demo-039奇偶避免天然方格",
|
||||
"demo-039教学与排除依据",
|
||||
"demo-040候选状态准确",
|
||||
"demo-040项目规模",
|
||||
"demo-040目标带",
|
||||
"demo-040不叠双色奇偶",
|
||||
"demo-040通道仅单位方格",
|
||||
"demo-040奇偶避免天然方格",
|
||||
"demo-040教学与排除依据",
|
||||
"demo-041候选状态准确",
|
||||
"demo-041项目规模",
|
||||
"demo-041目标带",
|
||||
"demo-041不叠双色奇偶",
|
||||
"demo-041通道仅单位方格",
|
||||
"demo-041奇偶避免天然方格",
|
||||
"demo-041教学与排除依据",
|
||||
"demo-042候选状态准确",
|
||||
"demo-042项目规模",
|
||||
"demo-042目标带",
|
||||
"demo-042不叠双色奇偶",
|
||||
"demo-042通道仅单位方格",
|
||||
"demo-042奇偶避免天然方格",
|
||||
"demo-042教学与排除依据",
|
||||
"demo-043候选状态准确",
|
||||
"demo-043项目规模",
|
||||
"demo-043目标带",
|
||||
"demo-043不叠双色奇偶",
|
||||
"demo-043通道仅单位方格",
|
||||
"demo-043奇偶避免天然方格",
|
||||
"demo-043教学与排除依据",
|
||||
"demo-044候选状态准确",
|
||||
"demo-044项目规模",
|
||||
"demo-044目标带",
|
||||
"demo-044不叠双色奇偶",
|
||||
"demo-044通道仅单位方格",
|
||||
"demo-044奇偶避免天然方格",
|
||||
"demo-044教学与排除依据",
|
||||
"demo-045候选状态准确",
|
||||
"demo-045项目规模",
|
||||
"demo-045目标带",
|
||||
"demo-045不叠双色奇偶",
|
||||
"demo-045通道仅单位方格",
|
||||
"demo-045奇偶避免天然方格",
|
||||
"demo-045教学与排除依据",
|
||||
"demo-046候选状态准确",
|
||||
"demo-046项目规模",
|
||||
"demo-046目标带",
|
||||
"demo-046不叠双色奇偶",
|
||||
"demo-046通道仅单位方格",
|
||||
"demo-046奇偶避免天然方格",
|
||||
"demo-046教学与排除依据",
|
||||
"demo-047候选状态准确",
|
||||
"demo-047项目规模",
|
||||
"demo-047目标带",
|
||||
"demo-047不叠双色奇偶",
|
||||
"demo-047通道仅单位方格",
|
||||
"demo-047奇偶避免天然方格",
|
||||
"demo-047教学与排除依据",
|
||||
"demo-048候选状态准确",
|
||||
"demo-048项目规模",
|
||||
"demo-048目标带",
|
||||
"demo-048不叠双色奇偶",
|
||||
"demo-048通道仅单位方格",
|
||||
"demo-048奇偶避免天然方格",
|
||||
"demo-048教学与排除依据",
|
||||
"demo-049候选状态准确",
|
||||
"demo-049项目规模",
|
||||
"demo-049目标带",
|
||||
"demo-049不叠双色奇偶",
|
||||
"demo-049通道仅单位方格",
|
||||
"demo-049奇偶避免天然方格",
|
||||
"demo-049教学与排除依据",
|
||||
"demo-050候选状态准确",
|
||||
"demo-050项目规模",
|
||||
"demo-050目标带",
|
||||
"demo-050不叠双色奇偶",
|
||||
"demo-050通道仅单位方格",
|
||||
"demo-050奇偶避免天然方格",
|
||||
"demo-050教学与排除依据",
|
||||
"第1章第8关峰值",
|
||||
"第1章末两关回落",
|
||||
"第2章第8关峰值",
|
||||
"第2章末两关回落",
|
||||
"第3章第8关峰值",
|
||||
"第3章末两关回落",
|
||||
"第4章第8关峰值",
|
||||
"第4章末两关回落",
|
||||
"第5章第8关峰值",
|
||||
"第5章末两关回落",
|
||||
"不给前50关用尽分值",
|
||||
"所有原型参考存在",
|
||||
"报告版本一致",
|
||||
"历史原项目91文件内容不变;新增仅既有研究文件",
|
||||
"六道桥接样题计入50关",
|
||||
"补充研究版本一致 一笔画竞品调研与关卡编排方案.md",
|
||||
"补充研究版本一致 一笔画深度调研-制作与难度证据.md",
|
||||
"补充研究版本一致 level-structure-audit.json"
|
||||
],
|
||||
"scope": "仅设计表、曲线、规则组合与来源一致性检查;不代表50关可玩、唯一解或真人难度验收"
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
participant,order_group,session,level_id,content_revision,display_position_a,teaching_or_calibration,started_at,first_draw_at,thinking_seconds,drawing_seconds,total_seconds,first_wrong_step,error_detection_delay_steps,backtracks,restarts,hint_count,completed,exit_reason,next_level_started,next_session_returned,subjective_difficulty_1_5,rule_understood,key_reasoning,feedback
|
||||
,,,21ceadc1-cd0e-511b-b7d3-d227e01de8a1,,1,,,,,,,,,,,,,,,,,,,
|
||||
,,,de71e06d-ed2b-5371-a3dd-7089ccff10b3,,2,,,,,,,,,,,,,,,,,,,
|
||||
,,,f521de33-0d27-54c1-9c04-8fe43955132c,,3,,,,,,,,,,,,,,,,,,,
|
||||
,,,07323e0e-de6c-5d71-8876-e3d88d008b60,,4,,,,,,,,,,,,,,,,,,,
|
||||
,,,0b255856-d185-5314-85e3-4a95eb233b04,,5,,,,,,,,,,,,,,,,,,,
|
||||
,,,23914286-0aa4-5d7a-afd1-b5a31c0c1a6e,,6,,,,,,,,,,,,,,,,,,,
|
||||
,,,e85cd2f3-94af-5b5e-bfd5-d513e6a5ba2c,,7,,,,,,,,,,,,,,,,,,,
|
||||
,,,a2cbcb61-034a-5215-9a31-035c1c0b96f5,,8,,,,,,,,,,,,,,,,,,,
|
||||
,,,c27d6782-9897-56e4-9024-27a725af609a,,9,,,,,,,,,,,,,,,,,,,
|
||||
,,,2a913cf0-2d97-512f-b8d8-bf4b859ac675,,10,,,,,,,,,,,,,,,,,,,
|
||||
,,,9edd9ff2-ed54-5fd8-a0e5-8c477b3100bc,,11,,,,,,,,,,,,,,,,,,,
|
||||
,,,852f0119-285e-5ec3-9569-8e34485bcf74,,12,,,,,,,,,,,,,,,,,,,
|
||||
,,,f509046b-a9b3-5f56-9aeb-e5b772115dfe,,13,,,,,,,,,,,,,,,,,,,
|
||||
,,,44f6955d-e999-5c24-8d71-14dc2d16f8f1,,14,,,,,,,,,,,,,,,,,,,
|
||||
,,,8f11cd51-0d6d-584a-9d00-babd8e381410,,15,,,,,,,,,,,,,,,,,,,
|
||||
,,,a9749d13-9881-5ed8-9fcd-d06589e4e7df,,16,,,,,,,,,,,,,,,,,,,
|
||||
,,,a9742951-1d48-538e-8d10-f37c3492ed6f,,17,,,,,,,,,,,,,,,,,,,
|
||||
,,,7261dec3-e994-5326-8755-2e60168b909c,,18,,,,,,,,,,,,,,,,,,,
|
||||
,,,21ae0172-eeda-51ab-a66c-2de946d2541b,,19,,,,,,,,,,,,,,,,,,,
|
||||
,,,cc92cc4f-1336-544e-81b4-bd6731ed60d3,,20,,,,,,,,,,,,,,,,,,,
|
||||
,,,9b9c1633-aedf-51f2-a04b-3818a2c6b7db,,21,,,,,,,,,,,,,,,,,,,
|
||||
,,,2174f62c-3d56-575a-8210-b1535710e9b0,,22,,,,,,,,,,,,,,,,,,,
|
||||
,,,82766c6c-a705-5340-acf7-d4d46dc113c1,,23,,,,,,,,,,,,,,,,,,,
|
||||
,,,f872f251-f6cd-5cf4-a8fa-c3619f948f22,,24,,,,,,,,,,,,,,,,,,,
|
||||
,,,1bcbf26f-650f-5791-b227-dd5e8f0d2dd0,,25,,,,,,,,,,,,,,,,,,,
|
||||
,,,da394472-bef6-53dd-abb2-bc4e7a60f07e,,26,,,,,,,,,,,,,,,,,,,
|
||||
,,,d1d36cdb-8e4f-57b9-b53a-754da1264744,,27,,,,,,,,,,,,,,,,,,,
|
||||
,,,a3f362fb-e070-5340-804a-14cb90fef2d4,,28,,,,,,,,,,,,,,,,,,,
|
||||
,,,d09f715e-948a-5ddc-ac89-1e2fa8e917f3,,29,,,,,,,,,,,,,,,,,,,
|
||||
,,,ea61da6f-0488-59bd-b1f5-5e4f4efa4bbd,,30,,,,,,,,,,,,,,,,,,,
|
||||
,,,d61b202d-a661-5a76-8b40-0cef0a79480d,,31,,,,,,,,,,,,,,,,,,,
|
||||
,,,2c745dac-0edc-5d14-acda-be7bd80331f9,,32,,,,,,,,,,,,,,,,,,,
|
||||
,,,36adc671-1d28-5c05-96c1-c7f84dff757a,,33,,,,,,,,,,,,,,,,,,,
|
||||
,,,a0bd742b-73c2-5dd6-9df9-a69580e5becd,,34,,,,,,,,,,,,,,,,,,,
|
||||
,,,03398b88-7ed6-5bc3-b001-7bbcb825d963,,35,,,,,,,,,,,,,,,,,,,
|
||||
,,,1a91cff3-d0ef-5abc-b4a1-adbc4d70a208,,36,,,,,,,,,,,,,,,,,,,
|
||||
,,,2e11044e-f88b-5152-bda8-b1eed66a3888,,37,,,,,,,,,,,,,,,,,,,
|
||||
,,,349e4537-d0e7-545d-be9b-feb7ff23fa2f,,38,,,,,,,,,,,,,,,,,,,
|
||||
,,,7f895016-a15f-5d1a-b89b-dce54f3f0986,,39,,,,,,,,,,,,,,,,,,,
|
||||
,,,15549f52-37a6-5149-b564-8caf096022fe,,40,,,,,,,,,,,,,,,,,,,
|
||||
,,,034f2c11-d092-5280-b22d-dbe2b8ca26c2,,41,,,,,,,,,,,,,,,,,,,
|
||||
,,,758c22d7-8b75-5110-befe-9b4b71a749b0,,42,,,,,,,,,,,,,,,,,,,
|
||||
,,,d430c0b6-4d1c-50f0-9365-82f40d6bdcdb,,43,,,,,,,,,,,,,,,,,,,
|
||||
,,,09653cbe-4ca9-571d-b976-853ac0ecb886,,44,,,,,,,,,,,,,,,,,,,
|
||||
,,,ba80bb56-a59e-55aa-b586-46d245984ccb,,45,,,,,,,,,,,,,,,,,,,
|
||||
,,,9ceed4f0-5c12-5251-9cc9-11aafba3e8c3,,46,,,,,,,,,,,,,,,,,,,
|
||||
,,,71a70b69-ff59-51a3-a149-1dd88868c0f3,,47,,,,,,,,,,,,,,,,,,,
|
||||
,,,e96c918b-2f4c-5a18-b443-8ac574f77ad6,,48,,,,,,,,,,,,,,,,,,,
|
||||
,,,a25a4829-f77f-5b4a-9163-4eef9cd3856e,,49,,,,,,,,,,,,,,,,,,,
|
||||
,,,f79bf403-764d-57e7-a37f-e85dce3b4505,,50,,,,,,,,,,,,,,,,,,,
|
||||
|
@@ -0,0 +1,486 @@
|
||||
{
|
||||
"existingLevels": 40,
|
||||
"status": "只读结构快照,未重跑关卡发布校验",
|
||||
"metrics": [
|
||||
{
|
||||
"reference": "direction/01",
|
||||
"n": 6,
|
||||
"geometry": "square",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 7,
|
||||
"rawDegreeThreePlusNodes": 2,
|
||||
"rawDegreeTwoRatio": 0.6666666666666666,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 16,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "direction/02",
|
||||
"n": 8,
|
||||
"geometry": "square",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 10,
|
||||
"rawDegreeThreePlusNodes": 3,
|
||||
"rawDegreeTwoRatio": 0.625,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 24,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "direction/03",
|
||||
"n": 10,
|
||||
"geometry": "square",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 13,
|
||||
"rawDegreeThreePlusNodes": 4,
|
||||
"rawDegreeTwoRatio": 0.6,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 34,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "direction/04",
|
||||
"n": 12,
|
||||
"geometry": "square",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 17,
|
||||
"rawDegreeThreePlusNodes": 8,
|
||||
"rawDegreeTwoRatio": 0.3333333333333333,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 124,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "direction/05",
|
||||
"n": 14,
|
||||
"geometry": "square",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 20,
|
||||
"rawDegreeThreePlusNodes": 8,
|
||||
"rawDegreeTwoRatio": 0.42857142857142855,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 100,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "direction/06",
|
||||
"n": 16,
|
||||
"geometry": "square",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 24,
|
||||
"rawDegreeThreePlusNodes": 12,
|
||||
"rawDegreeTwoRatio": 0.25,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 552,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "direction/07",
|
||||
"n": 18,
|
||||
"geometry": "square",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 27,
|
||||
"rawDegreeThreePlusNodes": 12,
|
||||
"rawDegreeTwoRatio": 0.3333333333333333,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 464,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "direction/08",
|
||||
"n": 19,
|
||||
"geometry": "square",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 29,
|
||||
"rawDegreeThreePlusNodes": 14,
|
||||
"rawDegreeTwoRatio": 0.2631578947368421,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 544,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "block-alternation/01",
|
||||
"n": 7,
|
||||
"geometry": "blocks",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 9,
|
||||
"rawDegreeThreePlusNodes": 3,
|
||||
"rawDegreeTwoRatio": 0.5714285714285714,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 24,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "block-alternation/02",
|
||||
"n": 9,
|
||||
"geometry": "blocks",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 12,
|
||||
"rawDegreeThreePlusNodes": 4,
|
||||
"rawDegreeTwoRatio": 0.5555555555555556,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 32,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "block-alternation/03",
|
||||
"n": 11,
|
||||
"geometry": "blocks",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 16,
|
||||
"rawDegreeThreePlusNodes": 8,
|
||||
"rawDegreeTwoRatio": 0.2727272727272727,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 138,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "block-alternation/04",
|
||||
"n": 13,
|
||||
"geometry": "blocks",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 19,
|
||||
"rawDegreeThreePlusNodes": 8,
|
||||
"rawDegreeTwoRatio": 0.38461538461538464,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 116,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "block-alternation/05",
|
||||
"n": 13,
|
||||
"geometry": "blocks",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 20,
|
||||
"rawDegreeThreePlusNodes": 10,
|
||||
"rawDegreeTwoRatio": 0.23076923076923078,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 224,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "block-alternation/06",
|
||||
"n": 15,
|
||||
"geometry": "blocks",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 23,
|
||||
"rawDegreeThreePlusNodes": 10,
|
||||
"rawDegreeTwoRatio": 0.3333333333333333,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 206,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "block-alternation/07",
|
||||
"n": 16,
|
||||
"geometry": "blocks",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 25,
|
||||
"rawDegreeThreePlusNodes": 12,
|
||||
"rawDegreeTwoRatio": 0.25,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 196,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "block-alternation/08",
|
||||
"n": 17,
|
||||
"geometry": "blocks",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 27,
|
||||
"rawDegreeThreePlusNodes": 14,
|
||||
"rawDegreeTwoRatio": 0.17647058823529413,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 760,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "walls/01",
|
||||
"n": 6,
|
||||
"geometry": "square",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 7,
|
||||
"rawDegreeThreePlusNodes": 2,
|
||||
"rawDegreeTwoRatio": 0.6666666666666666,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 16,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "walls/02",
|
||||
"n": 8,
|
||||
"geometry": "square",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 10,
|
||||
"rawDegreeThreePlusNodes": 3,
|
||||
"rawDegreeTwoRatio": 0.625,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 24,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "walls/03",
|
||||
"n": 10,
|
||||
"geometry": "square",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 13,
|
||||
"rawDegreeThreePlusNodes": 4,
|
||||
"rawDegreeTwoRatio": 0.6,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 34,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "walls/04",
|
||||
"n": 12,
|
||||
"geometry": "square",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 17,
|
||||
"rawDegreeThreePlusNodes": 8,
|
||||
"rawDegreeTwoRatio": 0.3333333333333333,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 124,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "walls/05",
|
||||
"n": 14,
|
||||
"geometry": "square",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 20,
|
||||
"rawDegreeThreePlusNodes": 8,
|
||||
"rawDegreeTwoRatio": 0.42857142857142855,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 100,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "walls/06",
|
||||
"n": 16,
|
||||
"geometry": "square",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 24,
|
||||
"rawDegreeThreePlusNodes": 12,
|
||||
"rawDegreeTwoRatio": 0.25,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 552,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "walls/07",
|
||||
"n": 18,
|
||||
"geometry": "square",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 27,
|
||||
"rawDegreeThreePlusNodes": 12,
|
||||
"rawDegreeTwoRatio": 0.3333333333333333,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 464,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "walls/08",
|
||||
"n": 19,
|
||||
"geometry": "square",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 29,
|
||||
"rawDegreeThreePlusNodes": 14,
|
||||
"rawDegreeTwoRatio": 0.2631578947368421,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 544,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "rhythm-door/01",
|
||||
"n": 6,
|
||||
"geometry": "square",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 7,
|
||||
"rawDegreeThreePlusNodes": 2,
|
||||
"rawDegreeTwoRatio": 0.6666666666666666,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 16,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "rhythm-door/02",
|
||||
"n": 8,
|
||||
"geometry": "square",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 10,
|
||||
"rawDegreeThreePlusNodes": 3,
|
||||
"rawDegreeTwoRatio": 0.625,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 24,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "rhythm-door/03",
|
||||
"n": 10,
|
||||
"geometry": "square",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 13,
|
||||
"rawDegreeThreePlusNodes": 4,
|
||||
"rawDegreeTwoRatio": 0.6,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 34,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "rhythm-door/04",
|
||||
"n": 12,
|
||||
"geometry": "square",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 17,
|
||||
"rawDegreeThreePlusNodes": 8,
|
||||
"rawDegreeTwoRatio": 0.3333333333333333,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 124,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "rhythm-door/05",
|
||||
"n": 14,
|
||||
"geometry": "square",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 20,
|
||||
"rawDegreeThreePlusNodes": 8,
|
||||
"rawDegreeTwoRatio": 0.42857142857142855,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 100,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "rhythm-door/06",
|
||||
"n": 16,
|
||||
"geometry": "square",
|
||||
"numericClues": 3,
|
||||
"rawEdgeCount": 24,
|
||||
"rawDegreeThreePlusNodes": 12,
|
||||
"rawDegreeTwoRatio": 0.25,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 552,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "rhythm-door/07",
|
||||
"n": 18,
|
||||
"geometry": "square",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 27,
|
||||
"rawDegreeThreePlusNodes": 12,
|
||||
"rawDegreeTwoRatio": 0.3333333333333333,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 464,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "rhythm-door/08",
|
||||
"n": 19,
|
||||
"geometry": "square",
|
||||
"numericClues": 3,
|
||||
"rawEdgeCount": 29,
|
||||
"rawDegreeThreePlusNodes": 14,
|
||||
"rawDegreeTwoRatio": 0.2631578947368421,
|
||||
"rawGeometryBipartite": true,
|
||||
"basePathCount": 544,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "hex-alternation/01",
|
||||
"n": 6,
|
||||
"geometry": "hex",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 9,
|
||||
"rawDegreeThreePlusNodes": 4,
|
||||
"rawDegreeTwoRatio": 0.3333333333333333,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 34,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "hex-alternation/02",
|
||||
"n": 8,
|
||||
"geometry": "hex",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 13,
|
||||
"rawDegreeThreePlusNodes": 6,
|
||||
"rawDegreeTwoRatio": 0.25,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 88,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "hex-alternation/03",
|
||||
"n": 11,
|
||||
"geometry": "hex",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 19,
|
||||
"rawDegreeThreePlusNodes": 9,
|
||||
"rawDegreeTwoRatio": 0.18181818181818182,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 314,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "hex-alternation/04",
|
||||
"n": 12,
|
||||
"geometry": "hex",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 18,
|
||||
"rawDegreeThreePlusNodes": 9,
|
||||
"rawDegreeTwoRatio": 0.16666666666666666,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 18,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "hex-alternation/05",
|
||||
"n": 14,
|
||||
"geometry": "hex",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 28,
|
||||
"rawDegreeThreePlusNodes": 13,
|
||||
"rawDegreeTwoRatio": 0.07142857142857142,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 4772,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "hex-alternation/06",
|
||||
"n": 16,
|
||||
"geometry": "hex",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 32,
|
||||
"rawDegreeThreePlusNodes": 13,
|
||||
"rawDegreeTwoRatio": 0.1875,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 4688,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "hex-alternation/07",
|
||||
"n": 18,
|
||||
"geometry": "hex",
|
||||
"numericClues": 1,
|
||||
"rawEdgeCount": 37,
|
||||
"rawDegreeThreePlusNodes": 16,
|
||||
"rawDegreeTwoRatio": 0.1111111111111111,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 23462,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
},
|
||||
{
|
||||
"reference": "hex-alternation/08",
|
||||
"n": 19,
|
||||
"geometry": "hex",
|
||||
"numericClues": 2,
|
||||
"rawEdgeCount": 39,
|
||||
"rawDegreeThreePlusNodes": 16,
|
||||
"rawDegreeTwoRatio": 0.15789473684210525,
|
||||
"rawGeometryBipartite": false,
|
||||
"basePathCount": 21236,
|
||||
"notes": "原始几何指标,不代表有效决策B、强制比例F或真人难度"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import fs from 'node:fs';import path from 'node:path';import crypto from 'node:crypto';import {fileURLToPath} from 'node:url';import {graph} from '../../tools/engine-template.mjs';
|
||||
const here=path.dirname(fileURLToPath(import.meta.url)),root=path.resolve(here,'../..');const plan=JSON.parse(fs.readFileSync(path.join(here,'demo-design.json'),'utf8'));const assertions=[];
|
||||
function check(name,condition){if(!condition)throw Error(name);assertions.push(name);}
|
||||
check('50条设计任务',plan.levels.length===50);check('ID不重复',new Set(plan.levels.map(l=>l.levelId)).size===50);check('关号连续',plan.levels.every((l,i)=>l.displayOrder===i+1));check('五章,每章十关',plan.chapters.length===5&&plan.chapters.every(c=>plan.levels.filter(l=>l.chapter===c.id).length===10));
|
||||
const expectedIds=[...plan.levels.map(l=>l.levelId)].sort().join();for(const [key,order]of Object.entries(plan.orders))check('关序'+key+'为同题库排列',[...order.levelIds].sort().join()===expectedIds);
|
||||
for(const l of plan.levels){check(l.designKey+'候选状态准确',l.status==='design-only'&&!l.geometryValidated&&!l.uniqueSolutionValidated&&!l.humanDifficultyCalibrated&&l.measuredFeatures===null);check(l.designKey+'项目规模',l.nodeCountTarget>=5&&l.nodeCountTarget<=20);check(l.designKey+'目标带',l.targetDifficultyBand[0]<=l.targetDifficulty&&l.targetDifficulty<=l.targetDifficultyBand[1]);check(l.designKey+'不叠双色奇偶',!(l.features.includes('alternation')&&l.features.includes('parity')));check(l.designKey+'通道仅单位方格',!l.features.includes('direction')||l.geometry==='square'&&!l.features.includes('big'));check(l.designKey+'奇偶避免天然方格',!l.features.includes('parity')||l.geometry!=='square');check(l.designKey+'教学与排除依据',Boolean(l.layoutIntent&&l.teachingGoal&&l.temptingRouteIntent&&l.rejectionReason));}
|
||||
for(let c=1;c<=5;c++){const chunk=plan.levels.filter(l=>l.chapter===c),peak=chunk[7].targetDifficulty;check('第'+c+'章第8关峰值',chunk.every(l=>l.targetDifficulty<=peak));check('第'+c+'章末两关回落',chunk[8].targetDifficulty<peak&&chunk[9].targetDifficulty<peak);}
|
||||
check('不给前50关用尽分值',Math.max(...plan.levels.map(l=>l.targetDifficulty))<80);
|
||||
const snapshot=[];for(const mode of ['direction','block-alternation','walls','rhythm-door','hex-alternation']){const pack=JSON.parse(fs.readFileSync(path.join(root,'modes',mode,'levels.json'),'utf8'));const designs=JSON.parse(fs.readFileSync(path.join(root,'modes',mode,'design.json'),'utf8'));for(let k=0;k<pack.levels.length;k++){const l=pack.levels[k],g=graph(l),paint=new Map();let bipartite=true;function bfs(start){const queue=[start];paint.set(start,0);for(let i=0;i<queue.length;i++)for(const j of g.adj[queue[i]]){if(!paint.has(j)){paint.set(j,1-paint.get(queue[i]));queue.push(j);}else if(paint.get(j)===paint.get(queue[i]))bipartite=false;}}for(let i=0;i<l.cells.length;i++)if(!paint.has(i))bfs(i);snapshot.push({reference:mode+'/'+l.id,n:l.cells.length,geometry:l.geometry,numericClues:l.cells.filter(c=>c.clue!==undefined).length,rawEdgeCount:g.adj.reduce((n,a)=>n+a.length,0)/2,rawDegreeThreePlusNodes:g.adj.filter(a=>a.length>=3).length,rawDegreeTwoRatio:g.adj.filter(a=>a.length===2).length/l.cells.length,rawGeometryBipartite:bipartite,basePathCount:designs[k].basePathCount,notes:'原始几何指标,不代表有效决策B、强制比例F或真人难度'});}}
|
||||
fs.writeFileSync(path.join(here,'project-snapshot.json'),JSON.stringify({existingLevels:snapshot.length,status:'只读结构快照,未重跑关卡发布校验',metrics:snapshot},null,2));const references=new Set(snapshot.map(s=>s.reference));check('所有原型参考存在',plan.levels.every(l=>l.sourceCandidates.every(id=>references.has(id))));
|
||||
const bytes=fs.readFileSync(plan.researchSource.path);check('报告版本一致',crypto.createHash('sha256').update(bytes).digest('hex')===plan.researchSource.sha256);
|
||||
const baseline=JSON.parse(fs.readFileSync(path.join(root,'reports','original-before.json'),'utf8').replace(/^\uFEFF/,''));const changed=baseline.filter(item=>!fs.existsSync(item.path)||crypto.createHash('sha256').update(fs.readFileSync(item.path)).digest('hex').toUpperCase()!==item.hash).map(item=>item.path);
|
||||
const directoryFiles=[];function walk(dir){for(const e of fs.readdirSync(dir,{withFileTypes:true})){if(e.isDirectory()&&['.git','node_modules'].includes(e.name))continue;const p=path.join(dir,e.name);if(e.isDirectory())walk(p);else if(e.isFile())directoryFiles.push(p);}}walk('G:\\项目\\NumberSwipe');const originalSet=new Set(baseline.map(x=>x.path)),added=directoryFiles.filter(f=>!originalSet.has(f));const knownResearchAdditions=['docs/一笔画竞品调研与关卡编排方案.md','docs/一笔画深度调研-制作与难度证据.md','docs/research/audit-level-structure.mjs','docs/research/level-structure-audit.json'].map(p=>path.join('G:\\项目\\NumberSwipe',p));check('历史原项目91文件内容不变;新增仅既有研究文件',changed.length===0&&added.every(p=>knownResearchAdditions.includes(p)));check('六道桥接样题计入50关',plan.pilotDesignKeys.length===6&&plan.pilotDesignKeys.every(k=>plan.levels.some(l=>l.designKey===k)));for(const r of plan.additionalResearchSources)check('补充研究版本一致 '+path.basename(r.path),crypto.createHash('sha256').update(fs.readFileSync(r.path)).digest('hex')===r.sha256);
|
||||
const summary={checkedAt:new Date().toISOString(),passed:true,designTasks:50,existingLevelsInspected:snapshot.length,checkedAssertions:assertions.length,originalProjectFilesChecked:baseline.length,originalProjectChanged:changed,originalProjectAddedSinceHistoricalBaseline:added,originalProjectWritesByThisPlanningTask:0,isolationNote:'相较旧清单已有4份研究文件新增;本任务只读原项目,写入design/demo-50。',assertions,scope:'仅设计表、曲线、规则组合与来源一致性检查;不代表50关可玩、唯一解或真人难度验收'};fs.writeFileSync(path.join(here,'plan-check.json'),JSON.stringify(summary,null,2));console.log(JSON.stringify({passed:true,tasks:50,checks:assertions.length,originalFiles:baseline.length,changed:changed.length,added:added.length}));
|
||||
@@ -0,0 +1,11 @@
|
||||
import fs from 'node:fs';import vm from 'node:vm';import assert from 'node:assert/strict';import path from 'node:path';import {fileURLToPath} from 'node:url';
|
||||
const here=path.dirname(fileURLToPath(import.meta.url));const html=fs.readFileSync(path.join(here,'index.html'),'utf8'),plan=JSON.parse(fs.readFileSync(path.join(here,'demo-design.json'),'utf8'));const checks=[];const elements=new Map();class Element{constructor(){this.value='';this.children=[];this.handlers={};this.innerHTML='';this.textContent='';}appendChild(x){this.children.push(x);}addEventListener(k,f){this.handlers[k]=f;}}const get=id=>{if(!elements.has(id))elements.set(id,new Element());return elements.get(id);};const context=vm.createContext({document:{getElementById:get,createElement:()=>new Element()},console,Blob,URL,setTimeout});const script=html.match(/<script>([\s\S]*)<\/script>/)[1];new vm.Script(script).runInContext(context);
|
||||
function check(n,f){f();checks.push(n);}const count=()=>((get('tasks').innerHTML.match(/<tr /g)||[]).length);
|
||||
check('默认50条任务和5章',()=>{assert.equal(count(),50);assert.equal((get('chapters').innerHTML.match(/<tr>/g)||[]).length,5);assert.equal((get('details').innerHTML.match(/<details /g)||[]).length,50);});
|
||||
check('A/B峰值位置',()=>{assert.ok(get('tasks').innerHTML.includes('8<br>'));get('b').onclick();const peakPositions=[...get('tasks').innerHTML.matchAll(/<tr class="peak"><td>(\d+)/g)].map(m=>Number(m[1]));assert.deepEqual(peakPositions,[10,20,30,40,50]);get('a').onclick();const normalPeakPositions=[...get('tasks').innerHTML.matchAll(/<tr class="peak"><td>(\d+)/g)].map(m=>Number(m[1]));assert.deepEqual(normalPeakPositions,[8,18,28,38,48]);});
|
||||
check('章节筛选',()=>{get('chapter').value='3';get('chapter').handlers.change();assert.equal(count(),10);get('chapter').value='';});
|
||||
check('奇偶筛选',()=>{get('feature').value='parity';get('feature').handlers.change();assert.equal(count(),13);get('feature').value='';});
|
||||
check('释放功能筛选',()=>{get('role').value='释放';get('role').handlers.change();assert.equal(count(),5);get('role').value='';get('role').handlers.change();});
|
||||
check('单文件规划页与状态说明',()=>{assert.ok(!/<script[^>]+src=|fetch\(/.test(html));assert.ok(html.includes('尚非可玩关卡包'));assert.ok(html.includes('六道桥接样题'));assert.ok(html.includes('前置技能'));});
|
||||
check('CSV数据与设计任务一致',()=>{const csv=fs.readFileSync(path.join(here,'difficulty-curve.csv'),'utf8').replace(/^\uFEFF/,'').trim().split(/\r?\n/);assert.equal(csv.length,51);for(let i=0;i<50;i++){const row=csv[i+1].split(',');assert.equal(row[0],plan.levels[i].designKey);assert.equal(row[1],plan.levels[i].levelId);assert.equal(Number(row[10]),plan.levels[i].targetDifficulty);}});
|
||||
fs.writeFileSync(path.join(here,'h5-check.json'),JSON.stringify({passed:true,checks,scope:'离线规划页脚本和数据一致性检查;不代表实际浏览器像素、手机测试或可玩关卡验收'},null,2));console.log('PASS '+checks.length+' planning-page checks');
|
||||
Reference in New Issue
Block a user