22 lines
1.8 KiB
JavaScript
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'));
|