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)
$$
它可以比较科学地确定游戏过程中某个时刻的难度。


正在更新中

最新文章

  1. HTML3
  2. MySQL的btree索引和hash索引的区别
  3. linux 无法解压过大文件解决
  4. struts2中的addActionError 、addFieldError、addActionMessage的方法
  5. FIleReader无法解决编码问题
  6. 使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录
  7. 解决Cygwin中vim的backspace不能正常使用(转)
  8. 在PC上收发短信--Pidgin短信(Linux Pidgin插件)
  9. [Javascript] Array methods in depth - indexOf
  10. Oracle排序
  11. C++ lamba使用
  12. 关于微信JS SDK接口wx.previewImage预览接口的使用
  13. git学习心得
  14. 关于执行findbugs,checkstyle,jacoco插件检测代码,GitHook的脚本编写
  15. gulp css 压缩 合并
  16. js 中使用 #region #endregion
  17. Mybatis 搭配 阿里druid连接池 连接 oracle 或 mysql
  18. Error: Cannot find module 'gulp-sass'
  19. activemq消息重发机制[转]
  20. 多语言 SEO

热门文章

  1. sublime代码片段
  2. XAMPP PHPSTORM XDEBUG 配合使用
  3. 【听说是线段树】bzoj1012 [JSOI2008]最大数maxnumber
  4. BZOJ 2761: [JLOI2011]不重复数字 水题
  5. Django 基本命令
  6. 四则运算之Right-BICEP测试
  7. 动态生成linearLayout
  8. 【5集iCore3_ADP演示视频】5-4 iCore3与应用开发平台的组装与拆卸
  9. 【PC网站前端架构探讨系列】结合公司网站首页,谈前端模块化开发与网站性能优化实践
  10. DateUtil工具类