zoukankan      html  css  js  c++  java
  • 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 ninmathbf{N} brace);
    音符的按下或抬起时刻组成的序列(t_N=lbrace t_{n}mid ninmathbf{N} brace);
    表明该音符应该是按下还是抬起的序列(s_{N}=lbrace s_{n}mid ninmathbf{N} brace),(s_n=0)表示第n个音符应按下,(s_n=1)表示第n个音符应抬起。

    我们将(p_N) 分为两部分:左手部分 (p_I=lbrace p_{i}mid iinmathbf{I} brace) 和右手部分 (p_J=lbrace p_{j}mid jinmathbf{J} brace) ,其中 (mathbf{I}=lbrace i mid i in mathbf{N} land p_i lt 5 brace) , (mathbf{J}=lbrace j mid j in mathbf{N} land p_j ge 5 brace) 。 与之对应,将(t_N) 也分为两部分: (t_I=lbrace t_{i}mid iinmathbf{I} brace) 和 (t_J=lbrace t_{j}mid jinmathbf{J} brace) 。 不过这样得到的左手部分和右手部分有一定毛病,因为不一定每一个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 ight|_t = egin{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 ight|_t = egin{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 ight|_t+c_a left. a _l ight|_t $$ 相似地定义右手难度函数: $$ D_r(t)=c_v left. v_r ight|_t+c_a left. a _r ight|_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 brace),当然太小的note和离手太近的note玩家会很少注意,所以不同位置note对读谱难度影响不同。定义一个函数(d_n(t)),表示即将到来的序号为n的note对当前读谱难度的加成。则可以定性给出: $$ d_n(t)= egin{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) $$ 它可以比较科学地确定游戏过程中某个时刻的难度。


    正在更新中

  • 相关阅读:
    从零开始学 Web 之 DOM(七)事件冒泡
    从零开始学 Web 之 DOM(六)为元素绑定与解绑事件
    从零开始学 Web 之 DOM(五)元素的创建
    从零开始学 Web 之 DOM(四)节点
    从零开始学 Web 之 DOM(三)innerText与innerHTML、自定义属性
    从零开始学 Web 之 DOM(二)对样式的操作,获取元素的方式
    从零开始学 Web 之 DOM(一)DOM的概念,对标签操作
    @RequestParam和@GetMapping
    组件(一)
    Vue(一)
  • 原文地址:https://www.cnblogs.com/Centauria/p/5993069.html
Copyright © 2011-2022 走看看