44 lines
6.9 KiB
Python
44 lines
6.9 KiB
Python
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')
|