Files
HexTrails/labs/car-loop/README.md

51 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 环路车场 / Car Loop Lab
运行根目录 `npm run dev`,访问 <http://localhost:4173/labs/car-loop/index.html>。
**研发状态(2026-09-10):转盘发车玩法暂缓。** 保留当前 Demo 和测试。研发演进、试玩反馈、已验证内容及尚未实施的优化方向见 [研发记录与阶段结论](../../docs/car-loop-research.md)。当前阶段判断:通行与表现已改善,但策略乐趣尚未成立。
## 操作
- **点击即刻出发**,不加入发车队列,也不等上一辆离盘。多辆车同时行驶。
- 未点击的车停在原位;已出发车辆会在前车或交叉冲突前刹停,通行空间清空后,从停下的位置自动继续。
- 路线冲突按让路依赖确定通行优先级,保护尚未通过的交叉区域;不允许高速穿车。
- 六角 37 格 / 方格 7×7 切换,各有 10、16、22 辆车样本。方格选图额外筛选实际长绕行,默认 #107 的参考解平均 9.4 弯、最长 20 弯。
- 方格每次旋转 90°,六角 60°。盘内行驶车辆在换路前归位,转好后自动重新出发;已离盘车辆继续在固定环路上行驶。闭环路线提示换路,不自动选方向。
- 环路贴合棋盘轮廓:方形配方形,六角配六角,小圆角平滑过弯。离盘经短引道顺时针汇流,进入右上角终点。
- 盘内速度 480 画布像素/秒,环路及并线 360 像素/秒;碰撞细分最大 1.5 像素,速度提高不减少检测精度。
- 悬停可查看路径;路线提示和自动演示用于验证;车辆列表支持键盘发车。
## 设计
采用只读参考 `../hex-video/designv2.md` 的视觉方向:近白环境、冷灰底板及 HUD、七色车辆和白箭头、红橙旋转器、蓝色提示器、绿色主操作。到达后切换蓝青奖励背景、金黄完成标记和再玩按钮。
车辆绘制使用 `theme.js` 的独立色族 face / side / light,保留一条薄侧边,不使用叠片或实体拖尾。道路、车辆、即时交通及终点都是本 Lab 的玩法适配,并非参考视频的原始规则。
## 结构与验证
- `model.js`:网格、配对轨道、连续曲线、静态碰撞、关卡生成与求解。
- `motion.js`:轨迹采样、实时碰撞停车、交叉通行优先级。
- `perimeter.js`:顺时针方形/六边形环路、距离采样及出盘射线交点。
- `app.js`:并行车辆运行、并线、操作与 Canvas 表现。
测试:`node --test tests/car-loop.test.js`,完整回归:`npm test`。`npm run build` 会打包本实验及设计参考 HTML。
车辆采用半径 0.36 格的统一净空,未模拟不同车长与真实转弯半径。路口保护采用保守的路线通行权,允许车辆提前停在交叉冲突区外;不将路线交叉画成可穿过其他车辆的立交。换路时归位是实验规则,避免在正在变化的路面上保留失效轨迹。
独立实验不修改主游戏规则、主线关卡或存档。
### 超大桌面关卡
打开 `index.html?size=xl&kind=hex`(169 格)或 `index.html?size=xl&kind=square`(15×15 格)。各有 96 辆车,保留即时发车、路口等候和道路旋转。棋盘自动适配窗口剩余空间,顶部状态与底部操作浮于画布角落,页面和棋盘均无滚动条。预生成样本位于 `large-levels.js`,来自 `generate(kind, 107, 96, 7)`;“换个朝向”切换道路的初始方向。静态道路使用离屏缓存。
### 转盘发车 Demo
`index.html?mode=batch&kind=hex` 直接进入新玩法,也可在页面“玩法”中切换回自由点车。
- 底部为左转 / 发车 / 右转。每轮一次安排当前朝向下可放行的全部车辆,互不冲突的车并行出发,有冲突的车在原位倒计时后出发,途中连续通行,系统不会转盘。
- `schedule.js` 为实际盘内曲线、汇入口、外环和车库预订通行时段,通过连续线段的相对运动计算车距。调度包含上一轮仍在外环的车辆;统一模拟时钟保证 1–3× 调速后时段和间隔不变。待发车辆仍计入“待出发”,状态单列待发数量。
- 当前无车可驶出时停下并提示玩家转盘。转盘本身不触发发车;已进入外环的车继续前往终点。
- 采用原来的绿色悬停提示样式统一显示盘内路线,驶出棋盘立即收起,外环不绘制尾迹。状态明确区分可发车、放行中、需转盘和等待到站。
- 每种棋盘有 3 个、各 16 辆的测试关卡。`batch.js` 按“单次左/右转 + 当前朝向放行”做广度优先搜索,得出目标次数。所有关卡的第一次左转与右转的最少总次数不同,第二关需要折返转向。目标只作评价,不限制尝试。
- 真实程序帧循环测试覆盖卡点停止、禁止自动转盘、转后等待再次发车及全部到站。