LL谱面分析和难度标定
LL谱面分析和难度标定
先介绍一下LL谱面的存储方式:TimeLine序列(简称TL序列),TL序列中的每一个元素(即音符)可以由一个C语言中的结构体来表示:
struct note{ int line; //音符位置 double time; //音符按下时间 double elapseTime; //音符从按下到抬起经过的时间,只有L型音符该项不为零 };
用比较数学化的表示方法来表示一下TL序列的各个属性:
音符的索引(下标)集合N;
音符的位置组成的序列pN={pn∣n∈N};
音符的按下或抬起时刻组成的序列tN={tn∣n∈N};
表明该音符应该是按下还是抬起的序列sN={sn∣n∈N},sn=0表示第n个音符应按下,sn=1表示第n个音符应抬起。
我们将pN 分为两部分:左手部分 pI={pi∣i∈I} 和右手部分 pJ={pj∣j∈J} ,其中 I={i∣i∈N∧pi<5} , J={j∣j∈N∧pj≥5} 。 与之对应,将tN 也分为两部分: tI={ti∣i∈I} 和 tJ={tj∣j∈J} 。 不过这样得到的左手部分和右手部分有一定毛病,因为不一定每一个5号位Note都得用右手去打。以后会有更科学的定义(现在还没想好,憋打我!)。
有了pI、pJ、tI和tJ,就可以初步定义一个衡量难度的函数了。
先考虑双指玩家(双指玩家即在游戏过程中仅使用两根手指的玩家,包括拇指党、食指党等等),则在游戏过程中玩家需不断转移手指,游戏的难度即与手指的转移速度、加速度等因素有关。
下图为小编实测的Live界面的各项参数(整数为像素,分数为比例形式),原谅我懒得在图里面打字……
这里我们要推导出的难度公式是与设备无关的,这样才能使每一个谱面的难度值唯一。
设ΔpI和ΔpJ分别为pI和pJ的一阶差分,空闲时序列ΔtI和ΔtJ为tI和tJ的一阶差分,则
于是玩家左手在时刻t的速度可定义为: vl|t={ΔpiΔti,i>1,i∈I0,i=1
我们知道玩家在Live时是先看好未来的几个圈的位置再做出决定的,也就是说,未来的几个圈的分布会对读谱难度产生影响。
定义谱面下落速度vd为一个音符从中心运动到目标位置所需时间td的倒数。
玩家所能看见的未来的几个Note的时刻构成的集合为Ts={tn∣0<tn−t≤td},当然太小的note和离手太近的note玩家会很少注意,所以不同位置note对读谱难度影响不同。定义一个函数dn(t),表示即将到来的序号为n的note对当前读谱难度的加成。则可以定性给出: dn(t)={cd,0≤tn−t<ts2cd,ts≤tn−t<td0,others
可以定义这样的一个瞬时难度函数: D(t)=Dl(t)+Dr(t)+∑tn∈Tsdn(t)
正在更新中
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器