LL谱面分析和难度标定
LL谱面分析和难度标定
先介绍一下LL谱面的存储方式:TimeLine序列(简称TL序列),TL序列中的每一个元素(即音符)可以由一个C语言中的结构体来表示:
struct note{
int line; //音符位置
double time; //音符按下时间
double elapseTime; //音符从按下到抬起经过的时间,只有L型音符该项不为零
};
用比较数学化的表示方法来表示一下TL序列的各个属性:
音符的索引(下标)集合\(\mathbf{N}\);
音符的位置组成的序列\(p_N=\lbrace p_{n}\mid n\in\mathbf{N}\rbrace\);
音符的按下或抬起时刻组成的序列\(t_N=\lbrace t_{n}\mid n\in\mathbf{N}\rbrace\);
表明该音符应该是按下还是抬起的序列\(s_{N}=\lbrace s_{n}\mid n\in\mathbf{N}\rbrace\),\(s_n=0\)表示第n个音符应按下,\(s_n=1\)表示第n个音符应抬起。
我们将\(p_N\) 分为两部分:左手部分 \(p_I=\lbrace p_{i}\mid i\in\mathbf{I}\rbrace\) 和右手部分 \(p_J=\lbrace p_{j}\mid j\in\mathbf{J}\rbrace\) ,其中 \(\mathbf{I}=\lbrace i \mid i \in \mathbf{N} \land p_i \lt 5 \rbrace\) , \(\mathbf{J}=\lbrace j \mid j \in \mathbf{N} \land p_j \ge 5 \rbrace\) 。 与之对应,将\(t_N\) 也分为两部分: \(t_I=\lbrace t_{i}\mid i\in\mathbf{I}\rbrace\) 和 \(t_J=\lbrace t_{j}\mid j\in\mathbf{J}\rbrace\) 。 不过这样得到的左手部分和右手部分有一定毛病,因为不一定每一个5号位Note都得用右手去打。以后会有更科学的定义(现在还没想好,憋打我!)。
有了\(p_I\)、\(p_J\)、\(t_I\)和\(t_J\),就可以初步定义一个衡量难度的函数了。
先考虑双指玩家(双指玩家即在游戏过程中仅使用两根手指的玩家,包括拇指党、食指党等等),则在游戏过程中玩家需不断转移手指,游戏的难度即与手指的转移速度、加速度等因素有关。
下图为小编实测的Live界面的各项参数(整数为像素,分数为比例形式),原谅我懒得在图里面打字……
这里我们要推导出的难度公式是与设备无关的,这样才能使每一个谱面的难度值唯一。
设\(\Delta p_I\)和\(\Delta p_J\)分别为\(p_I\)和\(p_J\)的一阶差分,空闲时序列\(\Delta t_I\)和\(\Delta t_J\)为\(t_I\)和\(t_J\)的一阶差分,则
于是玩家左手在时刻\(t\)的速度可定义为: $$ \left. v_l \right|_t = \begin{cases} \frac{\Delta p_i}{\Delta t_i}, & i>1,i \in \mathbf{I} \\ 0, & i=1 \end{cases} $$ 其中\(t_i\)为\(t_I\)中的不大于\(t\)的最大值。 加速度近似为: $$ \left. a_l \right|_t = \begin{cases} \frac{\Delta^2 p_i}{\Delta t_i^2}, & i>2,i \in \mathbf{I} \\ 0, &i=1 \mbox{ or } i=2 \end{cases} $$ 其中\(\Delta^2 l_I\)是\(l_I\)的二阶差分。 定义左手难度函数: $$ D_l(t)=c_v \left. v_l \right|_t+c_a \left. a _l\right|_t $$ 相似地定义右手难度函数: $$ D_r(t)=c_v \left. v_r \right|_t+c_a \left. a _r\right|_t $$ 其中\(c_v\)和\(c_a\)分别为两个常数,控制速度和加速度在难度中的权重。
我们知道玩家在Live时是先看好未来的几个圈的位置再做出决定的,也就是说,未来的几个圈的分布会对读谱难度产生影响。
定义谱面下落速度\(v_d\)为一个音符从中心运动到目标位置所需时间\(t_d\)的倒数。
玩家所能看见的未来的几个Note的时刻构成的集合为\(\mathbf{T}_s=\lbrace t_n \mid 0 \lt t_n-t \le t_d \rbrace\),当然太小的note和离手太近的note玩家会很少注意,所以不同位置note对读谱难度影响不同。定义一个函数\(d_n(t)\),表示即将到来的序号为n的note对当前读谱难度的加成。则可以定性给出: $$ d_n(t)= \begin{cases} c_d, & 0 \le t_n-t \lt t_s \\ 2c_d, & t_s \le t_n-t \lt t_d \\ 0, & \mbox{others} \end{cases} $$ 其中\(x=\frac{t-t_n+t_d}{t_d}\),\(c_d\)为常数,\(t_s\)为玩家反应时间,一般可取\(t_s=0.1s\)。
可以定义这样的一个瞬时难度函数: $$ D(t)=D_l(t)+D_r(t)+\sum_{t_n \in \mathbf{T}_s} d_n(t) $$ 它可以比较科学地确定游戏过程中某个时刻的难度。
正在更新中