📜  2000pp pp play osu std - C++ (1)

📅  最后修改于: 2023-12-03 14:59:03.730000             🧑  作者: Mango

2000pp pp play osu std - C++

简介

本文将介绍使用 C++ 计算 osu!standard 模式谱面 PP 值的算法以及使用该算法实现的程序。PP 值是 osu! 中用来衡量玩家技能的一个综合指标。本算法可以根据谱面难度、玩家成绩等因素计算 PP 值,并输出相应的结果。

算法

PP 值算法是根据 osu! 官方 PP 值算法进行推演而来的,主要考虑了谱面难度、玩家成绩等因素。本算法使用 C++ 实现,可以较快地计算出 PP 值。

算法输入

此算法需要以下的输入:

  • 谱面难度数据:在 osu! 中,谱面难度包含了多个信息,比如音符种类、连击数、距离、角度等等。本算法需要把这些信息读取出来作为输入。
  • 玩家成绩:包含了玩家在游戏中击打了哪些音符、准确度、连击数等数据。
算法输出

此算法输出一个 PP 值,表示玩家在该谱面中的技能值。算法还可以输出一些其它的参数,比如玩家击打的每个音符的准确度等。

算法步骤

此算法的主要计算步骤如下:

  1. 读取谱面数据,包括音符种类、连击数、距离、角度等等。
  2. 读取玩家成绩,包括准确度、连击数等数据。
  3. 计算难度值,即根据谱面数据计算出该谱面的难度值,包括技术难度和速度难度。
  4. 根据玩家成绩计算 PP 值,主要考虑以下因素:击打准确度、连击数、miss 数量、连击长度、最大连击数等。
  5. 输出结果。
实现

本算法的 C++ 实现包括以下几个部分:

  • 谱面数据读取和处理。
  • 玩家成绩读取和处理。
  • 难度值计算。
  • PP 值计算。
  • 结果输出。

详细的代码实现可以参考我的GitHub 仓库

以下是一段示例代码,用于计算谱面难度值:

double calculateDifficulty(const Beatmap& beatmap, double mods) {
  ...
  // 计算 skillset:
  Skillset skillset = computeSkillset(beatmap, mods);
  ...
  // 计算技术难度和速度难度:
  double aimDifficulty = computeAimDifficulty(skillset, beatmap, mods);
  double speedDifficulty = computeSpeedDifficulty(skillset, beatmap, mods);
  ...
}
结论

本算法可以较快地计算出 osu!standard 模式谱面的 PP 值,可以作为 osu! 玩家自我评估的一个工具。在实际运用中,还可以考虑其它因素,比如多模式加权、谱面随机性等。