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)
$$
它可以比较科学地确定游戏过程中某个时刻的难度。
正在更新中
LL谱面分析和难度标定的更多相关文章
- 年度游戏圈2018白皮书解析手游折扣app哪个好及靠谱程度分析
2018年,随着全国暂停游戏版本的审核和发布<综合防控儿童青少年近视实施方案>(控制新的在线游戏数量),游戏行业受到的影响不小. 在游戏产业中,游戏行业2018年的收入同比增长5.2%,远 ...
- Linux内核源码分析方法
一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...
- Chrome渲染分析之Timeline工具的使用
原文http://www.th7.cn/web/html-css/201406/42043.shtml Timeline工具栏提供了对于在装载你的Web应用的过程中,时间花费情况的概览,这些应用包括处 ...
- javascript函数式编程一例分析
js像其他动态语言一样是可以写高阶函数的,所谓高阶函数是可以操作函数的函数.因为在js中函数是一个彻彻底底的对象,属于第一类公民,这提供了函数式编程的先决条件. 下面给出一个例子代码,出自一本js教程 ...
- Android版数据结构与算法(四):基于哈希表实现HashMap核心源码彻底分析
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 存储键值对我们首先想到HashMap,它的底层基于哈希表,采用数组存储数据,使用链表来解决哈希碰撞,它是线程不安全的,并且存储的key只能有一个为 ...
- 相机标定问题-Matlab & Py-Opencv
一.相机标定基本理论 1.相机成像系统介绍 图中总共有4个坐标系: 图像坐标系:Op 坐标表示方法(u,v) Unit:Dots(个) 成像坐标系:Oi ...
- 空间谱专题02:波束形成(Beamforming)
作者:桂. 时间:2017-08-22 10:56:45 链接:http://www.cnblogs.com/xingshansi/p/7410846.html 前言 本文主要记录常见的波束形成问题 ...
- Spring IOC 容器源码分析 - 填充属性到 bean 原始对象
1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...
- 20155232《网络对抗》Exp4 恶意代码分析
20155232<网络对抗>Exp4 恶意代码分析 1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门 ...
随机推荐
- TComboBoxEx和 TComboBox
// TComboBoxEx cbbCity: TComboBoxEx; item: TComboExItem; cbbCity.ItemsEx.Clear; //清空 cbbProv.itemInd ...
- 如何使用XShell登录亚马逊EC2云服务器
http://jingyan.baidu.com/article/a3a3f811d5fc338da2eb8a00.html
- 葱类 Allium
韭菜 Allium tuberosum (Chinese chives) 韭黄(韭芽):不见光的特殊培养的软化韭菜品种 藠头(薤) Allium chinense (Chinese onion) 蒜 ...
- KVO 键值观察者
KVO(键值观察者) //监听的创建 -(id)initChildren:(Person *)person { self = [super init]; if (self != nil) { //拥有 ...
- DOM元素的大小和位置
HTML: <div id="parent"> <div id="box"> 测试测试测试测试测试测试测试测试测试测试测试测试测试测试测 ...
- Linux用户密码重置方法
方法一: 启动时,随便按一个键,空格即可(不能是回车),让其停留在如下界面 按e编辑 在UTF-8后面添加init=/bin/sh init=/bin/sh 根据上面提示,按Ctrl+x启动得下图 输 ...
- 第三方登录分享功能-ShareSDK for iOS适配问题记录
最近app里需要添加第三方授权登陆和分享的功能,选择了ShareSDK,参考了ShareSDK文档对该SDK进行了适配,但遇到了一些问题 1.问题:分享功能点击不跳转 原因:适配iOS9添加白名单 ...
- jQuery验证控件jquery.validate.js使用说明+中文API
官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 学习 ...
- bzoj 4445 [SCOI2015] 小凸想跑步
题目大意:一个凸包,随机一个点使得其与前两个点组成的面积比与其他相邻两个点组成的面积小的概率 根据题意列方程,最后求n条直线的交的面积与原凸包面积的比值 #include<bits/stdc++ ...
- SSH框架简化
通过对ssh框架有了基础性的学习,本文主要是使用注解的方式来简化ssh框架的代码编写. 注意事项: 1.运行环境:Windows 8-64位,Eclipse(开发工具),jdk1.8.0_91,Tom ...