# 轻量捷径实验

`dinosaur_32_shortcut_experiment.py` 保留原版策略：蛇身短于 512 时取安全区间内最大跨度，达到 512 后沿回路后继移动。经模拟验证后，已按用户要求应用到生产脚本 `dinosaur_32.py`；旧版本保存在 `dinosaur_32_baseline.py`。

优化实现，而不改变早期选路：

- 启动时预计算各格的环编号、物理邻居、跨度和方向。邻居按跨度降序保存，每步找到第一个合法候选即结束搜索。
- 环形队列存储身体格子的环编号，消除 `pop(0)`。每步用本地变量更新读写游标，每到苹果再写回状态。
- 身体在环序上保持有序，蛇尾就是向前遇到的第一个占用点。因此安全区间判断已经涵盖占用检查，可以省掉 `occupied` 字典。
- 长度达到 512 后，原版的最小合法正跨度就是回路后继。此后不再启用捷径，直接批量沿回路移动，并停止软件队列维护，碰撞由游戏 `move()` 阻止。

**这不是死路修复。** 起点 `(0,0)`、下一苹果 `(0,1)`、再下一颗 `(1,0)` 的反例仍会提前结束。后半段若增长阻塞，原版在选路时返回失败，轻量版可能调用一次失败的 `move()`；调用数及失败局最后的计费可相差 1 tick。失败后软件状态不应继续用于下一颗苹果，应收尾结束本局。

## tick 模拟

```bash
python -B -m unittest -v dinosaur_tick_model_test dinosaur_shortcut_experiment_test
python -B dinosaur_tick_model.py --seeds 20 --size 32 --include-light --output dinosaur_shortcut_tick_results.json
```

32×32，20 个种子，三种算法均完成 20/20 局。轻量版与原版每个种子的总移动数、每颗苹果的移动数逐一相同。

| 平均每局 | 原版捷径 | 完整回路 | 轻量捷径 |
| --- | ---: | ---: | ---: |
| 移动步数 | 132,799 | 262,574 | 132,799 |
| 移动 tick | 4,812,292 | 13,839,559 | 4,812,292 |
| 语言及容器基本操作 tick | 25,404,455 | 556,437 | 2,702,674 |
| API 查询 tick | 670,923 | 1,024 | 1,024 |
| 列表删除额外移位 tick | 66,501,547 | 0 | 0 |
| **算法主体预计总 tick** | **97,389,216** | **14,397,020** | **7,515,989** |
| 一次性查表数据构建 tick | — | 1,219 | 227,481 |

轻量捷径算法主体预计比原版少用 **92.3%** tick，比完整回路少用 **47.8%**。把它的整份查表数据构建费用计入单局冷启动后，仍约为 **774 万 tick**。连续多局只需构建一次。

这些仍是按公开规则建立的成本模型结果，尚未经本机游戏引擎计时确认。公共外层循环、清场和换帽等费用未计入；模型细节和来源见 `dinosaur_tick_model.md`。已有原生 `simulate()` driver/worker 目前比较原版与完整回路，尚未包含轻量候选。

结果支持“保留捷径、降低每步开销”，该实现已用于主脚本。已知增长死路保持不变，原生游戏 tick 也仍待复核；后续算法调整继续先在实验中验证。`--include-light` 现在直接模拟生产脚本，`old` 使用归档基线。
