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中生成后门 ...
随机推荐
- 首师大附中互测题:99999999海岛帝国后传:算法大会【D001】
[D001]99999999海岛帝国后传:算法大会[难度:D] ———————————————————————————————————————————————————————————————————— ...
- android--访问网络权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
- BZOJ2454 : TopCoder SRM 463 RabbitPuzzle
每种状态最多只有三种后继状态:中间往左跳,中间往右跳,两边往中间跳. 如果把它们分别看成左儿子.右儿子.父亲的话,那么会得到一些二叉树. 取出起始状态和终止状态往上跳$k$步的所有状态,其他状态我们只 ...
- Node.js的学习路线
http://www.admin10000.com/document/4624.html 顺便关注一下博客:http://blog.fens.me/series-nodejs/ php socket框 ...
- Daily Scrum02 12.07
最近大家都在赶编译的大作业,没日没夜的码代码,调试,大家都很辛苦,但是,我们团队的工作,大家也不能懈怠啊! 大家要顶住压力,加油努力啊! Member 任务进度 下一步工作 吴文会 就总结点进行汇报 ...
- 2016huasacm暑假集训训练四 数论_A
题目链接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/F 题意:狼捉兔子,兔子躲在n个洞中一个,这n个洞围成一个圈,狼会从第0号洞开始,搜 ...
- python实现之决策树
一.Predict survival on the Titanic 使用泰坦尼克号上的乘客数据,对乘客是否存活进行预测 1.观察数据集合 可能遇到的问题 训练集和测试集特征值得属性并不重合.连续属性和 ...
- 《实时控制软件设计》第一周作业 欧梓峰 U201317662 (更新)
CNC 插补计算程序分析 前言:插补(Interpolation),即机床数控系统依照一定方法确定刀具运动轨迹的过程.一般是已知起点坐标.终点坐标和轨迹,由数控插补计算程序实时的算出各个中间的坐标来拟 ...
- uwsgi 安装配置
安装uwsgi# pip install uwsgi 配置uwsgi:首先要明确的是,如果你喜欢用命令行的方式(如shell)敲命令,那可以省去任何配置.但是,绝大多数人,还是不愿意记那么长的命令,反 ...
- SQL UNION 和 UNION ALL 操作符\SQL SELECT INTO 语句\SQL CREATE DATABASE 语句
SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...