4.7 KiB
环路车场 / Car Loop Lab
运行根目录 npm run dev,访问 http://localhost:4173/labs/car-loop/index.html。
研发状态(2026-09-10):转盘发车玩法暂缓。 保留当前 Demo 和测试。研发演进、试玩反馈、已验证内容及尚未实施的优化方向见 研发记录与阶段结论。当前阶段判断:通行与表现已改善,但策略乐趣尚未成立。
操作
- 点击即刻出发,不加入发车队列,也不等上一辆离盘。多辆车同时行驶。
- 未点击的车停在原位;已出发车辆会在前车或交叉冲突前刹停,通行空间清空后,从停下的位置自动继续。
- 路线冲突按让路依赖确定通行优先级,保护尚未通过的交叉区域;不允许高速穿车。
- 六角 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按“单次左/右转 + 当前朝向放行”做广度优先搜索,得出目标次数。所有关卡的第一次左转与右转的最少总次数不同,第二关需要折返转向。目标只作评价,不限制尝试。 - 真实程序帧循环测试覆盖卡点停止、禁止自动转盘、转后等待再次发车及全部到站。