feat(levels): give every level an opening worth watching
The chain locks all four of its pieces at the opening by construction, and the pieces grown around it are mostly locked too, so a level built from it hands a player two rim pieces and a third of a second of animation before any thinking starts. Measured across the 235-level pool: median two tappable pieces at the opening, and the best departure available plays for 0.57s. Growth now reserves a couple of slots for showcase pieces — tappable at the opening, with a route long enough to read as a journey and short enough to stay under the animation ceiling. Median opening choices go 2 to 3 and the best opening show 0.72s to 1.12s, without shortcutting the lock: each candidate is still put through the solver. Rotation quota is gone from the board. Turning is free and it is what the game is about, so depth is grown rather than capped; what is gated is whether each turn pays out, whether pieces swing between hopeless and trivial, and whether there is a show up front. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+32
-25
@@ -98,46 +98,46 @@ footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--rule);color:v
|
||||
<header class="head">
|
||||
<div class="eyebrow">HEX TRAILS · 关卡调优</div>
|
||||
<h1>调出 50 关难度合适、好玩的关卡,交付人工审核</h1>
|
||||
<p class="meta mono">第 0 轮 · 更新于 09-14 16:21 · 本页每 60 秒自动刷新</p>
|
||||
<p class="meta mono">第 0 轮 · 更新于 09-14 16:45 · 本页每 60 秒自动刷新</p>
|
||||
<div class="progress">
|
||||
<div class="bar"><i style="width:18%"></i></div>
|
||||
<div class="lbl"><span>3 / 17 项完成</span><span class="mono">18%</span></div>
|
||||
<div class="bar"><i style="width:43%"></i></div>
|
||||
<div class="lbl"><span>9 / 21 项完成</span><span class="mono">43%</span></div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<h2><span class="num">A</span>现在的状态</h2>
|
||||
<div class="grid">
|
||||
<div class="tile "><div class="k">候选关卡</div><div class="v">17 <span style="font-size:14px;color:var(--ink3)">/ 50</span></div><div class="n">当前关卡集</div></div>
|
||||
<div class="tile "><div class="k">候选关卡</div><div class="v">18 <span style="font-size:14px;color:var(--ink3)">/ 50</span></div><div class="n">当前关卡集</div></div>
|
||||
<div class="tile ok"><div class="k">盲转 / 关</div><div class="v">0.00</div><div class="n">目标 0</div></div>
|
||||
<div class="tile ok"><div class="k">转错方向 / 关</div><div class="v">0.00</div><div class="n">目标 0</div></div>
|
||||
<div class="tile ok"><div class="k">猴子 动作÷棋子</div><div class="v">5.07</div><div class="n">目标 ≥3.0(不无脑)</div></div>
|
||||
<div class="tile ok"><div class="k">猴子 动作÷棋子</div><div class="v">4.96</div><div class="n">目标 ≥3.0(不无脑)</div></div>
|
||||
</div>
|
||||
|
||||
<div class="scroll"><table>
|
||||
<thead><tr><th>旋转数</th><th class="n">目标关数</th><th class="n">现有</th><th>缺口</th></tr></thead>
|
||||
<thead><tr><th>最少旋转数</th><th class="n">候选关数</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>0 转</td><td class="n">5</td><td class="n">0</td><td><span class="tag idle">还差 5</span></td></tr>
|
||||
<tr><td>1 转</td><td class="n">12</td><td class="n">0</td><td><span class="tag idle">还差 12</span></td></tr>
|
||||
<tr><td>2 转</td><td class="n">15</td><td class="n">0</td><td><span class="tag idle">还差 15</span></td></tr>
|
||||
<tr><td>3 转</td><td class="n">18</td><td class="n">17</td><td><span class="tag live">还差 1</span></td></tr>
|
||||
<tr><td>3 转</td><td class="n">18</td><td class="sub">浅</td></tr>
|
||||
<tr><td colspan="3" class="sub">旋转深度没有梯度——生成器把最少旋转写死了,这正是「太简单」的根因</td></tr>
|
||||
</tbody></table></div>
|
||||
<p class="sub">路线家族分布:weave ×4 · switchback ×1 · petals ×4 · orbits ×4 · crossing ×2 · spiral ×2 终局可走朝向分布:{"2":3,"3":13,"4":1}</p>
|
||||
<p class="sub">路线家族分布:switchback ×4 · weave ×4 · petals ×4 · orbits ×4 · crossing ×2 终局可走朝向分布:{"2":7,"3":11}</p>
|
||||
|
||||
<h2><span class="num">B</span>什么叫「难度合适且好玩」</h2>
|
||||
<div class="callout"><p class="sub">评分里只有 difficulty(复测 r=0.93)和 stuck(r=0.85)可信;rotation / clarity / fun 的复测 r 只有 0.32 / 0.19 / 0.56,是模型噪声,不能拿来调参。所以「好玩」必须换成机械代理。</p></div>
|
||||
<div class="callout"><p class="sub">旋转是免费的、是这个游戏的特色,玩家应该频繁做——所以不该限制旋转次数。该限制的是每一次旋转值不值:转了有没有棋子出来、能不能看出来该转哪、以及转完之后有没有「原来这么简单」的反差。评分里只有 difficulty(复测 r=0.93)和 stuck(r=0.85)可信,rotation / clarity / fun 是噪声(0.32 / 0.19 / 0.56),所以「好玩」全部换成机械代理。 另外,演出本身就是奖励——棋子沿弯路走出去的那几秒是减压点,所以开局必须有得看,而不是只有两枚贴边棋子和 0.3 秒。</p></div>
|
||||
<ul class="rules sub">
|
||||
<li><b>难度</b>:agent 的 difficulty 评分沿关号上升,末档逼近 3.0(3 = 刚刚好),全程不超过 3.2<span class="how">(grok 抽样评分)</span></li>
|
||||
<li><b>不挫败</b>:stuck ≤ 2.0,盲转 = 0,转错方向 = 0<span class="how">(规则机器人全量扫,12 秒)</span></li>
|
||||
<li><b>不无脑</b>:猴子玩家 动作÷棋子 ≥ 3.0(v0.5 全库 1.67 = 乱点就能过)<span class="how">(生成时算)</span></li>
|
||||
<li><b>旋转是主线</b>:0 旋转关 ≤ 5 关(10%),且随关号推进旋转数递增<span class="how">(求解器)</span></li>
|
||||
<li><b>不重复</b>:50 关盘面签名互不相同,路线家族分布不偏科<span class="how">(deepLevelKey 去重)</span></li>
|
||||
<li><b>旋转要深</b>:难度来自「需要转很多次」,不是「转错受罚」。旋转数随关号上升,不设上限<span class="how">(求解器最少旋转数)</span></li>
|
||||
<li><b>每转都有回报</b>:每一次旋转至少放出 2 枚棋子;无效转动 = 0<span class="how">(deepLevelStats.releasePerTurn / 规则机器人)</span></li>
|
||||
<li><b>演出是回报</b>:开局就要有得看:可点 ≥3 枚、其中最好的一条离场演出 ≥0.9s;全关长巡游(≥0.9s)≥3 次<span class="how">(showStats,用真实动画计时)</span></li>
|
||||
<li><b>反差感</b>:平均反差 ≥12:棋子在某个朝向看着像噩梦(长路线多弯),转过去就是几步走出(代价 = 格数 + 2×弯数)<span class="how">(六朝向逐棋子代价差)</span></li>
|
||||
<li><b>不无脑</b>:猴子 动作÷棋子 ≥3.0(v0.5 全库 1.67 = 乱点就能过)<span class="how">(生成时算)</span></li>
|
||||
<li><b>不挫败</b>:stuck ≤2.0;终局任一朝向卡住时,左右转都能开<span class="how">(grok 抽样 + 求解器)</span></li>
|
||||
<li><b>不重复</b>:盘面签名互不相同,路线家族分布不偏科<span class="how">(deepLevelKey)</span></li>
|
||||
</ul>
|
||||
<div class="scroll"><table>
|
||||
<thead><tr><th>关号区间</th><th>旋转数</th><th>目标 difficulty 评分</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>L1–L12</td><td>0–1 转</td><td class="mono">1.5 – 2.0</td></tr>
|
||||
<tr><td>L13–L32</td><td>1–2 转</td><td class="mono">2.0 – 2.6</td></tr>
|
||||
<tr><td>L33–L50</td><td>2–3 转</td><td class="mono">2.6 – 3.0</td></tr>
|
||||
<tr><td>L1–L12</td><td>2–3 转</td><td class="mono">1.5 – 2.0</td></tr>
|
||||
<tr><td>L13–L32</td><td>3–5 转</td><td class="mono">2.0 – 2.6</td></tr>
|
||||
<tr><td>L33–L50</td><td>5–8 转</td><td class="mono">2.6 – 3.0</td></tr>
|
||||
</tbody></table></div>
|
||||
|
||||
<h2><span class="num">C</span>任务</h2>
|
||||
@@ -152,12 +152,16 @@ footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--rule);color:v
|
||||
</div>
|
||||
|
||||
<div class="phase">
|
||||
<h3><span class="pid">P1</span>产能:先得有足够多的候选</h3>
|
||||
<h3><span class="pid">P1</span>产能:解除旋转上限,把反差感做进筛选</h3>
|
||||
<ul class="tasks">
|
||||
<li class="todo"><div class="t"><span class="tid">T1.1</span><span class="tt">深锁关(3 转)扩产到 ≥60 个候选</span><span class="tag idle">待办</span></div><div class="note">当前 14 种子出 17 关,需扩大种子与半径扫描</div></li>
|
||||
<li class="todo"><div class="t"><span class="tid">T1.2</span><span class="tt">中档(2 转)生成路径</span><span class="tag idle">待办</span></div><div class="note">deep-lock 固定 3 转,v0.5 最多 2 转 —— 中档要么放宽锁链,要么从 v0.5 筛</div></li>
|
||||
<li class="todo"><div class="t"><span class="tid">T1.3</span><span class="tt">简单档(0–1 转)候选池</span><span class="tag idle">待办</span></div><div class="note">从 v0.5 筛,但必须过猴子 APT 门槛(v0.5 全库中位 1.67,大部分会被刷掉)</div></li>
|
||||
<li class="todo"><div class="t"><span class="tid">T1.4</span><span class="tt">去重与家族均衡</span><span class="tag idle">待办</span></div><div class="note">6 个路线家族不能偏科;v0.5 曾出现 1000 关只有 30 个模板</div></li>
|
||||
<li class="done"><div class="t"><span class="tid">T1.1</span><span class="tt">growDeepLevel 扩展到 6 个朝向</span><span class="tag good">完成</span></div><div class="note">现在只在朝向 0/1/2 插棋子,所以最少旋转恒等于 3 —— 这是「太简单」的根因</div></li>
|
||||
<li class="done"><div class="t"><span class="tid">T1.2</span><span class="tt">解除 rotations===3 的硬限制,允许 4/5/6+</span><span class="tag good">完成</span></div></li>
|
||||
<li class="done"><div class="t"><span class="tid">T1.3</span><span class="tt">反差感指标进 deepLevelStats 并作门槛</span><span class="tag good">完成</span></div><div class="note">contrastStats 已进 deepLevelStats 并作门槛;实测 weave 22–33、switchback 29、spiral 18–24、orbits 12–17,petals 仅 2.0–5.7、crossing 3.8–5.5</div></li>
|
||||
<li class="done"><div class="t"><span class="tid">T1.4</span><span class="tt">每转释放 ≥2 枚的门槛</span><span class="tag good">完成</span></div><div class="note">改为按朝向配额插棋(每个朝向 ≥2 枚在等),取代原来的随机比例——随机比例会留下空转的朝向</div></li>
|
||||
<li class="doing"><div class="t"><span class="tid">T1.5</span><span class="tt">扩产到 ≥120 候选并去重、家族均衡</span><span class="tag live">进行中</span></div><div class="note">候选池已达 235 关(深度 {3:165,4:46,5:22,7:2}),正用含开局展示位的构造重扫</div></li>
|
||||
<li class="blocked"><div class="t"><span class="tid">T1.6</span><span class="tt">终局三枚互锁(hero+gate+tail)</span><span class="tag bad">受阻</span></div><div class="note">深关卡的主要死因:5 转以上有 60% 死在「终局单出口」。实测终局是锁链自己的三枚棋子在 6 个朝向里堵死 5 个。双向释放约束只覆盖了 hero/tail 两枚,三枚组合覆盖不到——这是可达状态的性质,构造时难保证。当前对策是提高扫描量靠筛选拿到,不是修构造</div></li>
|
||||
<li class="done"><div class="t"><span class="tid">T1.7</span><span class="tt">开局展示位(快速爽到)</span><span class="tag good">完成</span></div><div class="note">实测整个构造的开局中位只有 2 枚可点、最佳演出 0.57s——锁链开局全锁死。在构造里预留 2 个开局位(立即可点且路线长到值得看),实测开局可点 2→3 枚、最佳演出 0.72s→1.12s</div></li>
|
||||
<li class="done"><div class="t"><span class="tid">T1.8</span><span class="tt">离场演出封顶</span><span class="tag good">完成</span></div><div class="note">计时原本线性无上限,最长一次 17.4s,正式关 18.8% 超过 2s。拐点 2.4s 以下完全不变,以上加速逼近 3.2s 上限。labs/exit-timing 可同步对比</div></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -210,6 +214,9 @@ footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--rule);color:v
|
||||
|
||||
<h2><span class="num">F</span>日志</h2>
|
||||
<ul class="log">
|
||||
<li><b>演出</b>离场动画封顶定稿(拐点 2.4s / 上限 3.2s),最长 17.4s→3.5s;拐点以下手感不变。同时发现开局演出是结构性缺陷并在构造里修掉</li>
|
||||
<li><b>P1 进展</b>旋转深度打开:生成分布从「全部恒为3」变成 {3,4,5,6,7,8,9}。两次结构性猜测失败并已撤回(插入端多朝向出口过滤实测零效果)。深关卡的瓶颈定位为终局三枚互锁,改用扩大扫描量应对</li>
|
||||
<li><b>方向修正</b>旋转配额的思路被推翻:旋转免费且是核心特色,不该限次数,该限的是每次旋转的回报与可读性。实测发现 17 关最少旋转全部恒为 3(生成器写死),且 petals/crossing 两个家族几乎没有反差感(平均 2.0–5.7 对比 weave 的 22–33)</li>
|
||||
<li><b>起点</b>已完成前置工作:擦碰漏报修复(113/581 例)、终局单出口门槛、锁结构改为双向可开 —— 规则机器人盲转/转错/多转已全部归零</li>
|
||||
</ul>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user