先看结论:不是 50% 会死,而是 50% 的台阶没有障碍

当前版本源码里,障碍数组由 createRandomProbability([.5, .2, .2, .1], stairNum) 生成。权重对应四个值:0、1、2、3。换算成概率就是:

每块台阶的障碍值分布
障碍值概率源码中的含义
050%这块台阶没有障碍
120%障碍偏离台阶半个台阶宽,向上错开一格
220%障碍偏离台阶一个台阶宽,向上错开两格
310%障碍偏离台阶一个半台阶宽,向上错开三格

这里的 50% 只描述“有没有障碍”,不描述“这一跳会不会失败”。把两个概率混在一起,很容易得出“游戏有一半时间在故意卡人”的错误印象。

障碍画在哪里:用相对距离,而不是固定坐标

生成障碍后,绘制阶段会以当前台阶的位置为基准,计算障碍的横坐标和纵坐标。源码里的核心算式是:障碍横坐标等于台阶横坐标加“半个台阶宽 × 障碍值”,纵坐标等于台阶纵坐标减“53 像素 × 障碍值”。也就是说,障碍值越大,障碍离当前台阶越远、位置越靠上,而不是简单地在台阶正旁边放一个方块。

这解释了为什么有些障碍看起来离台阶很远,有些则紧贴着路线。它们不是同一张图被随意摆放,而是同一套相对位置规则在不同障碍值下的结果。障碍的图案还会从 5 个裁剪区域里随机取一个,所以同一距离也可能出现不同外观。

失败判定:看的是方向,不是障碍碰撞体积

这是最容易误解的一点。当前版本的主循环里,判断失败的条件是:玩家点击的位置换算成 0 或 1,与下一块台阶的方向比较;不相等就结束这一轮。障碍值在这一刻只被保存下来,用于选择死亡动画——如果障碍方向为 1,播放撞台阶动画;否则播放下落动画。源码中没有看到“障碍矩形与角色矩形相交”这种独立的碰撞检测。

换句话说,障碍首先是画面信息,影响你判断台阶方向时的视线和心理压力;真正决定这一轮是否结束的,仍然是“有没有点对下一块台阶的方向”。这也是为什么有时候看起来“擦着障碍过去了”却没有失败,而方向点错时即使离障碍很远也会结束。

那障碍还有意义吗

有,而且不止一种。第一,它会占据画面空间,让你更难一眼看清下一块台阶;第二,障碍值越大,图形离台阶越远,视觉上更容易把注意力拉走;第三,它参与失败动画的区分,让“撞到障碍”和“踩空下落”在反馈上不完全一样。对玩家来说,最实用的结论不是去背概率表,而是把视线优先放在台阶本身,别被旁边的装饰带跑。

如果你发现自己总是在某类画面里点错,可以回看录屏:是障碍挡住了台阶边缘,还是你把障碍的朝向当成了台阶方向。前者是视线问题,后者是判断问题,练法不一样。

怎么自己核对这组数字

最直接的方式是看当前版本源码中的 js/runtime/floor.js 和 js/utils/utils.js:前者调用概率函数生成障碍数组,后者把 [.5, .2, .2, .1] 展开成 0 到 3 的取值表。再用 js/main.js 的主循环确认失败条件,就能把“障碍绘制”和“方向判定”分开。

不想看代码,也可以用录屏做粗略观察:记录连续几十块台阶中有没有障碍、障碍大约隔多远。样本少的时候,实际比例可能和 50/20/20/10 差很多,这是随机波动的正常现象,不代表概率写错。

本文依据当前版本源码中的障碍生成、绘制和失败判定逻辑整理。概率是单块台阶的独立权重,不等于一局中的实际占比;后续版本如果调整参数或加入新的碰撞规则,以游戏内实际表现为准。