22 lines
1.0 KiB
JavaScript
22 lines
1.0 KiB
JavaScript
import { hexagon, solve, trace } from '../../src/core.js';
|
|
// A compact, deterministic visual fixture. Each inserted piece can escape before
|
|
// all earlier pieces, so reverse insertion always yields a complete solution.
|
|
export function makeLabLevel() {
|
|
const level = { version: 1, name: '薄片六边形实验', cells: hexagon(2), tiles: [], moveLimit: 18, rotationEnabled: true };
|
|
const candidates = [
|
|
[0,0,0],[0,-1,0],[0,1,3],[-1,0,5],[1,0,2],[1,-1,0],
|
|
[0,-2,0],[0,2,3],[-2,1,5],[2,-1,1],[-1,-1,4],[1,-2,0],
|
|
[-1,2,3],[1,1,2],[-2,2,4],[2,-2,5],[-2,0,5],[2,0,1]
|
|
];
|
|
for (const [q,r,preferred] of candidates) {
|
|
for (let offset = 0; offset < 6; offset++) {
|
|
const dir = (preferred + offset) % 6;
|
|
const tile = { id: `lab-${level.tiles.length}`, q, r, dir, color: dir };
|
|
if (trace(level, tile, [...level.tiles,tile]).status === 'exit') { level.tiles.push(tile); break; }
|
|
}
|
|
}
|
|
level.moveLimit = level.tiles.length;
|
|
if (!solve(level).solvable) throw new Error('Lab fixture must be solvable');
|
|
return level;
|
|
}
|