用户输入:“生成一条约12公里、带3个检查点、30人同时出发的山地车越野赛道,关门时间40分钟。”几秒钟后,地图出来了:起点在山谷的停车场,赛道沿着林间小路爬上山脊,经过3个检查点后从另一侧下山回到起点附近。地形、树林和路线都在,看起来已经可以开始比赛。

但在乐鱼体育的生成流程里,这只是第一步的结果。地图交给用户之前,AI要先回答一个更朴素的问题:这场比赛真的能完成吗?选手能不能从起点骑到终点,中间会不会撞上什么,30个人同时出发会不会堵死,大多数人能不能在40分钟内完赛,有没有人可以绕过检查点直接冲线。这些问题都可以自动检查,前提是把它们拆成一项项可以计算的内容。

检查一:可达性,不是人能走到,而是车能骑到

最基础的检查是可达性。系统在地图上构建一张“可通行图”,节点是赛道上的路点,边表示两点之间可以骑行通过。关键在于,这张图必须按照山地车的能力来建,而不是按步行来建:坡度超过车辆可骑上的上限(模拟中约25%)的上坡段不能算作可通行的上行边,落差超过1米的台阶只能下不能上,宽度小于车把宽度的缝隙完全不能通过。

在这张图上用A*寻路,依次检查“起点 → 检查点1 → 检查点2 → 检查点3 → 终点”每一段是否存在路径。以一个模拟场景为例,初版地图中检查点2被放在一处观景台上,步行可以通过台阶到达,但对山地车来说只有一条35%的陡坡,属于不可通行的上行边,检查点2实际上不可达。修正方法是在旁边加一段之字形爬坡,把坡度摊到18%左右。

检查二:碰撞,路线上不能有东西挡着

可达性只说明图上连通,不代表车真的能过去。碰撞检查会把车辆和骑手简化成一个包围体,沿着路线中心线扫掠,检查是否与树干、岩石、低矮树枝或建筑相交。几个常见问题:

  • 生成的树木随机分布,有一棵正好长在赛道中间;
  • 林间小路上方有低垂的树枝,净空只有1.5米,而骑手加车的高度约1.8米;
  • 急弯内侧的岩石侵入了车辆转弯的扫掠范围,只看中心线没问题,车身却会擦上去。

这类问题的修正通常是局部的:移除或移动障碍物,抬高净空,或者把弯道外扩。

检查三:死路和进得去出不来的区域

越野赛道常有岔路,岔路本身不是问题,问题是有些岔路进去以后出不来。系统在有向可通行图上计算强连通分量:如果某个区域只有进入的边,没有离开的边,而终点又不在这个区域里,那么任何误入这里的选手都会被困住。

模拟中,一段从主路分出的下坡小径通向一片洼地,洼地四周都是车辆骑不上去的陡坡,这就是一个典型的“陷阱区域”。处理方式有两种:在入口处加上明确的路线边界,让它不属于赛道;或者给洼地开一条可以骑出来的路。

检查四:宽度瓶颈

30人同时出发,意味着开赛后的几分钟里,大量选手会挤在同一段路上。系统沿路线计算每一处的可用宽度,找出最窄的位置,并结合该位置的预计到达人数判断是否会形成拥堵。模拟中,起点后约800米处有一座只有1.5米宽的小桥,开赛后约2分钟时平均有18人同时到达,排队时间超过1分钟。

修正方法可以是加宽桥面,把出发区后的第一段宽路延长以拉开选手间距,或者改成分批出发。选择哪一种,应该让用户决定,因为分批出发会改变比赛规则。

检查五:完成时间分布

前四项检查都是“能不能”,这一项要回答“要多久”。系统让一组能力不同的虚拟选手,比如200名,在地图上完整骑行,记录每个人的用时。模拟结果显示:中位数用时约43分钟,最快的一成选手约34分钟,最慢的一成超过55分钟。

这和用户设定的“关门时间40分钟”直接冲突:超过一半的选手无法在关门前完赛。系统不应该默默交付,而应该把冲突摆出来,并给出几个选项:把赛道缩短到约10公里;把关门时间延长到55分钟;或者降低某几段爬坡的难度。这是规则与地图之间的冲突,只有在模拟之后才能看见。

检查六:规则,检查点能不能被绕过

最后一项是规则层面的检查。检查点的意义在于强制选手按顺序经过某些位置,系统需要确认这个约束在地图上真的成立:

  • 是否存在一条从检查点1直接到检查点3、却不经过检查点2的路径,而且更快?如果有,规则里必须明确“漏打检查点判定无效”,或者在地图上封掉这条捷径;
  • 检查点的判定区域是否覆盖了整条赛道宽度,选手能不能从旁边的林子里绕过去;
  • 终点线的通过方向是否定义清楚,从反方向穿过终点线是否被判为完赛;
  • 如果是多圈比赛,圈数计数是否和检查点顺序配合。

这项检查在赛车类地图里同样重要,街道赛车赛道里两段相距很近的赛道就可能形成切弯捷径。

一张检查清单,和一个会转圈的流程

把六项检查整理成表,就是体育地图交付前的一张基本清单:

检查项 方法 典型失败 常见修正
可达性 在车辆可通行图上用A*寻路 检查点只能步行到达 加爬坡或移动检查点
碰撞 包围体沿路线扫掠 树干在赛道中间、净空不足 移除障碍、抬高净空
死路 有向图强连通分量分析 进得去出不来的洼地 封闭入口或开出口
宽度瓶颈 宽度剖面结合到达人数 集体出发后小桥拥堵 加宽或分批出发
完成时间 多名虚拟选手模拟 中位用时超过关门时间 缩短赛道或调整关门时间
规则检查点顺序与捷径检测 可绕过检查点 补规则或封堵捷径

这些检查不是做一次就结束。任何一项失败,系统都会做局部修改,然后重新模拟和验证,因为修正一个问题可能带来新的问题:加宽小桥以后,选手到达第一个爬坡的时间更集中,那里可能出现新的拥堵。这就是生成、模拟、验证、修改的循环。循环应该设置上限,比如最多自动修正5轮,仍有无法解决的冲突时,就把问题和可选方案交给用户决定。这个过程本质上是让AI自己生成、自己试玩,再根据结果修改。

在乐鱼体育的地图编辑中,每一轮修改都应该留下版本记录。用户看到V3比V1多了一段之字形爬坡、少了一座窄桥,如果觉得V3失去了原来的味道,可以退回V1,再手动选择只修哪几个问题。一张体育地图能不能完成比赛,靠的不是生成时的感觉,而是这样一轮轮可复查的检查结果。