Files

22 lines
1.8 KiB
JavaScript

import { generateLevel, analyze, rotateBoard, solveRotations } from '../src/core.js';
import { writeFile } from 'node:fs/promises';
const names=['转一转,路就通了','换个方向','弯道别碰头','给我让条路','粉色回旋','蓝色小径','向左看齐','第一圈冒险','旋转甜甜圈','差一点擦肩','紫色回廊','再转一次','绕开拥挤','转角遇见光','别挤在一起','糖果交响曲','盘旋之间','左右逢源','小心翼翼','寻找缝隙','回转大挑战','紧密相连','终极转盘','六角大满贯'];
const candidates=[];
for(let i=0;i<100;i++){
const radius=i<25?2:3,target=i<25?5+i%10:16+i%18;
const level=rotateBoard(generateLevel(2+i*73,radius,target,.15+(i%10)/12),1+i%3);
const solution=solveRotations({...level,moveLimit:999});
if(!solution.reachable||!solution.rotations)continue;
level.rotationEnabled=true;
level.moveLimit=solution.minimumMoves+Math.max(2,Math.round(target*.2));
level.requiresRotation=true;
const analysis=analyze(level);
if(analysis.solvable)candidates.push({level,analysis});
}
candidates.sort((a,b)=>a.analysis.score-b.analysis.score);
if(candidates.length<24)throw new Error('Not enough verified rotation puzzles');
const levels=names.map((name,i)=>({...candidates[Math.round(i*(candidates.length-1)/23)].level,id:`turn-level-${i+1}`,name}));
await writeFile(new URL('../levels/campaign.json',import.meta.url),JSON.stringify(levels,null,2)+'\n');
await writeFile(new URL('../src/levels.js',import.meta.url),'// Generated by npm run levels. Rotation + swept collision campaign.\nexport const LEVELS = '+JSON.stringify(levels)+';\n');
console.log(levels.map((l,i)=>{const a=analyze(l);return `${i+1}. ${l.name} ${l.tiles.length} tiles ${a.score}/100 min ${a.rotations} turns (${a.minimumMoves} moves)`;}).join('\n'));