feat(routes): let leftover track pair into a bend instead of straight across
Playing on a phone, the boards read as a grid of long straight lines crossing everywhere — "一看到这个画面,我脑袋就大". The cause is one line in the filler. Each family lays its signature routes over part of the board and leaves the rest to completePorts, which paired every leftover port with the one straight across. On a switchback board that made 76% of all track pairs diameters and left 43 of 61 cells containing nothing but diameters. Two diameters in one cell always cross, so the straightness and the crossings were never two problems. Preferring a bend halves both, in every family: switchback 76% → 40% straight and 2.38 → 0.92 crossings per cell, crossing 86% → 10%, weave 37% → 5%. It was also quietly suppressing 反差, the swing between a piece looking hopeless and becoming trivial, which the design brief calls the point of the game. Straight routes barely change between orientations. With bends, petals goes from 4.2 to 14.0 and crossing from 4.8 to 28.8 — both had been failing the ≥12 gate and were absent from the level pool entirely. Petals is the family the user singles out as the good-looking one. Generation yield rises with it: four seeds now grow 24 playable levels against 3, at greater rotation depth. createRouteBoard keeps 'straight' as its default so nothing already built moves; the sweep opts in. labs/route-gallery draws both, with the real renderer, so the choice is made by looking rather than by reading a number. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,9 @@ const MIN_PIECES = Number(args.minPieces ?? 8);
|
||||
const DEPTHS = String(args.depths ?? '3,4,5,6').split(',').map(Number);
|
||||
const PER_TURN = Number(args.perTurn ?? 2);
|
||||
const SHOWCASE = Number(args.showcase ?? 2);
|
||||
// How leftover ports are paired. 'straight' was the only behaviour and it is
|
||||
// what made boards read as a grid of long lines crossing everywhere.
|
||||
const FILL = String(args.fill ?? 'curve');
|
||||
|
||||
// Random player: taps a random piece; after three blocked taps in a row, turns randomly.
|
||||
function monkeyActionsPerPiece(level, runs = 8) {
|
||||
@@ -44,7 +47,7 @@ for (const { id: family } of ROUTE_FAMILIES) for (const radius of RADII) {
|
||||
const cellKey = `${family}/r${radius}`;
|
||||
yieldTable[cellKey] = { locks: 0, grown: 0, seeds: SEEDS };
|
||||
for (let seed = SEED_FROM; seed < SEED_FROM + SEEDS; seed++) {
|
||||
const base = createRouteBoard(seed, { family, radius });
|
||||
const base = createRouteBoard(seed, { family, radius, fill: FILL });
|
||||
const lock = createDeepLock(base, { seed, maxChecks: 600000 });
|
||||
if (!lock) continue;
|
||||
yieldTable[cellKey].locks++;
|
||||
|
||||
Reference in New Issue
Block a user