关于 Arcaea 控分的延伸思考

(转自个人B站专栏

本文受到了 CV4616548 的启发,将记录一些没什么用的延伸思考。

关于分数的计算问题

av87676244 这个视频里椰叶控 01145140 时,发现要比那篇文章里说的多打一个大P。实际上就是因为他的算法舍入规则与实际游戏不同,导致精度崩了一位。所以这里本着严谨(闲得无聊)的态度,我们对游戏进行逆向工程,拿到游戏里的实际算法。

IDA F5 的伪代码

应该很容易就能看出第 12 行就是分数算法。这里为了规避精度问题用了先乘后除的方法。其算式应该是:

Score = 1,000,000,000 ( 5  Far + 10 * 总Pure )  /  总Note / 1000

而这里面每一次 / 的除法,由于 C 语言的特性,应该都是向下取整的。

编写计算程序

代码在附录

这里我用最顺手的 Python 写了一小段程序。大概意思就是穷举总note数,先用直接除note数的方法估算是否可以达成目标分数,然后再进行精确计算。

计算结果

1145140

1919810

数据分别是 总Note数,直接除Note数得到的分数,精确计算的分数,需要打的总P数,需要打的大P数。

这里可以看到,实际上上面文章是因为用了 Round() 函数四舍五入所以错了,实际上应该用去尾法。

而且对 1145140 列表中的数字搜索,发现不只有 751 的 Dream goes on 可以打出这个恶臭分数,还有腿歌
Your_voice_so..._feat._Such的 FTR 也可以达到。需要打 89个大P,27个小P。

神仙的翻车记录
@EG丶DistantSky 神仙的翻车记录

实际上控分的时候,由于小P其实很难控,所以可以考虑把一个小P等价换成两个FAR。

如果能控 FAR 的话...?

上述计算都是以 Prue 作为单位,但是实际上一个P等于两个Far,我们就可以把最小单位换成FAR。

代码在附录

1145140

这里的数据分别是 总Note数,精确计算的分数,需要的总Far数,需要的大P数。

可以看到多了很多选择。只要保证小P乘2加上Far等于需要的总Far数,再打出需要的大P数就行了。应该比之前更好控分一点emmm....(光速逃

附录

写的很烂的 Python 代码

import math

aimScore = 1145140

for noteNumber in range(1, 1500):
    noteScore = 10000000.0 / noteNumber
    pureNumber = math.floor(aimScore / noteScore)

    rawScore = pureNumber * noteScore
    highestScore = rawScore +  pureNumber
    if highestScore > aimScore:
        realRawScore = math.floor(math.floor(1000000000 * (10 * pureNumber) / noteNumber) / 1000)
        print(noteNumber, '%.2f'%rawScore, realRawScore, pureNumber, aimScore - realRawScore)

print()

for noteNumber in range(1, 1500):
    noteScore = 10000000.0 / noteNumber / 2
    farNumber = math.floor(aimScore / noteScore)

    rawScore = farNumber * noteScore
    highestScore = rawScore +  farNumber / 2
    if highestScore > aimScore:
        realRawScore = math.floor(math.floor(1000000000 * (5 * farNumber) / noteNumber) / 1000)
        minPureNumber = aimScore - realRawScore
        print(noteNumber, realRawScore, farNumber - minPureNumber * 2, minPureNumber)
Last modification:February 16th, 2020 at 01:18 pm

Leave a Comment