研究解析 Commodore 64 游戏《Stunt Car Racer》的 AI 驾驶机制
来源标题:Driver AI in Stunt Car Racer, Commodore 64
研究者逐帧记录了 Commodore 64 游戏《Stunt Car Racer》中电脑对手的驾驶逻辑,发现其车辆并非完整物理模拟,而是用赛道进度、横向位置、速度和三个仅上下运动的弹簧轮等少量数值描述。在 Little Ramp 赛道首场比赛中,电脑车由 OPP_CORNERS($E4DA)确定车身角点位置,弹簧参数存于 OPP_WHEELS($21DE),OPP_SPREAD($23A2)则限制后轮高度差在 296 以内。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
你的车被游戏抛来抛去:它四处移动、转向,飞出道路然后损毁。电脑的车则只是几个数字:它在赛道上的位置、在路面上的横向位置、速度,以及三个只在垂直方向上下移动的弹簧车轮。赛道承载着它,无论弹簧把它推到什么位置。
从 Play 标签页的游戏中逐帧记录:一个赛季在 Little Ramp 上的第一场比赛,由 Jumping Jack 驾驶,车辆位置由 OPP_CORNERS($E4DA)设定其四角。图中每个弹簧被压入路面越深就画得越短,推动时显示为橙色;白点是每一帧车辆中心所在的位置。起跳前的助跑段强制要求速度为 70(第 30 到 33 段,$0710,第 09 节);其他助跑段是同一场比赛只改动了这一限制。弹簧是 OPP_WHEELS($21DE,第 04 节):每个弹簧在车轮被压入路面越深、进入速度越快时,就更有力地向上推,对抗 40 的向下拉力(弯道上为 124),每个车轮承受自身推力的四分之三以及其他每个车轮推力的八分之一。随后 OPP_SPREAD($23A2)将后轮之间的高度差限制在 296 以内,前轮与它们之间的高度差限制在 368 以内。高度使用游戏的单位:平地上的路面在 1,280,车辆宽度为 81。
每个后轮读取其自身角落下方的路面,横向位置为车辆中心减去或加上车宽的一半;前轮读取中间位置的路面,向前半个路段。因此在倾斜弯道上车辆会倾斜,越过坡顶时它会离开路面并沿赛道以自身速度飞行。在空中时发动机不产生推力,所以只有阻力使它减速。如果它太慢地起跳,就会落在两个斜坡之间的凹处,着陆坡面会以最大推力撞击其弹簧,将它抛向天空。这就是助跑段强制要求速度的原因。
电脑的车朝路面上一个横向目标点转向,每帧最多转 10。离你较远时,目标就是驾驶员自己的路线。离你较近时,驾驶员的习惯会根据你的位置来选择目标。选择一个驾驶员,然后拖动任意一辆车。
游戏绘制的道路,从你的车后方高处俯视,比赛方向朝页面上方;旁边的数字是领先你和落后你的车长数。每种颜色代表电脑的车在该位置时其中心的行为,由游戏的 OPPONENT_LINE($1D25)移植到 JavaScript 后,基于列表中游戏的内存计算得出。电脑的车横向转向从不超出 $20 或 $E0,因此它永远不会出现在边缘的灰色条带中。浅色车表示它朝向的位置,即其目标;你车辆周围的阴影区域是车辆接触的范围(第 06 节)。拖动任意一辆车,或点击路面将电脑的车放到那里;地图获得焦点后可用方向键移动它。
两车之间的间距沿赛道计算,一个车长约等于 15 个赛道单位。在前后 255 的间距内,驾驶员的习惯决定行为:
超车和绕行只在两车横向距离小于 $38 时才改变目标。距离更远时,你不在它的路线上,它保持自己的路线。它所在或下一个路段上有弯道时,它会转向道路中间 $80,除非它正在从后方超过你或绕行你,这些情况下会继续通过弯道。
弯道后的第一帧,如果它在你前方,电脑的车会随机生成一个 0 到 31 的数字。如果该数字不高于驾驶员自身的数值,它就会在 16 帧内转向,车头偏转着在路面上迂回。Hot Rod 每 32 次迂回 1 次,Road Hog 每 32 次迂回 11 次。
车辆以 60 的速度行驶在直道上,每帧一幅画面,使用 Play 标签页的 Chase 摄像机渲染器绘制,四角位置按 OPP_CORNERS 的方式设定。每一帧游戏的 SWERVE($158E,已移植)读取 $1601 处波形 16 个值中偏移一位的值。该值沿赛道移动车辆四角所构成线段的一端,值大于 0 时移动左端($C30D),小于 0 时移动右端($C30E),使车辆最多转向 16 度;偏移五位的值每帧使其横向移动 10,方向由符号决定($C357)。迂回期间发动机推力减少 25,从 $EC 变为 $D3。Roll 是游戏的骰子,Swerve now 不使用骰子启动。迂回结束后它转回自己的路线。
迂回只能在多个条件同时满足时启动:电脑的车在你前方,其中一个车轮在路面上,它刚刚离开弯道(前一帧路段标志 $B2 的第 7 位为 1,而这一帧不为 1),并且它所在的路段不强制要求特定速度(第 09 节)。波形的哪一半先出现由它离开的弯道决定:同一标志的第 6 位,在路段反向行驶时会翻转,决定它从哪一半开始($C358)。
因此列表中越靠后的驾驶员迂回越频繁,而迂回只会在你前方发生,也就是游戏绘制另一辆车的地方。
电脑的车有三个轮子,后面两个、前面一个,每个都通过弹簧架在路面上。比赛开始时它被放下:每个车轮从路面高度加 104 到 231 之间的随机值开始,三个轮子相同。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。