關於Cytus II的計分方式及其它|音樂世界 Cytus II


3樓貓 發佈時間:2021-12-16 18:14:31 作者:Aroma White Language

計分系統分為 :
(記一個譜子總Note數為N)
1.評分(90w基礎分+10w連擊分)
基礎分每權重為90w/N

連擊分每權重為10w/(1+2+...+N-1)
2.TP(Technique Point:技巧點)(也就是準度)
TP每權重為(100%)/N

Note判定分級 :
名稱:基礎分權重, TP權重, 判定區間
彩P:     1      1     0~0.07s
黑P:     1     0.7   0.07~0.2s
Good: 0.3   0.3   0.2~0.4s
Bad:    0.3    0    0.4~0.8s
Miss:   0      0        /

關於連擊分 :
萌娘百科和百度貼吧上某大佬的說法有誤(至少在現版本是這樣), 實際上是:
一段Combo的首個Note被賦予的連擊分權重為0.
相應的, 連擊分被分為(1+2+...+N-1)份, 而不是(1+2+...+N)份, 一份即一個權重.
在一段Combo中, 各Note按0,1,2,3...依次賦予權重.
斷連後, 下一組Combo重新依次被賦予權重.

關於我發現Combo首項被賦予0權重這回事 :
在我試圖用我只掌握皮毛的C語言知識, 寫一個計算只斷一次Combo時漏掉的Note是第幾個的程序時, 經過幾次調試, 卻一直得不出正確的結果. 我開始懷疑萌娘百科的算法, 寫了一個模擬MM時擊打
各Note後, 分數變化的程序進行驗證, 發現與實際情況誤差很大, 我嘗試更改算法, 發現更改後誤差不超過1.
模擬MM計分的程序如下:
#include<stdio.h>
main()
{
int i, N; float a,b,s;
printf("物量:");
scanf_s("%d", &N);
a = 900000.0/ N;
b= 100000.0 / ( N-1.0) / N * 2;
printf("基礎分每權重:%f\n連擊分每權重:%f\n",a,b);
for (s = 0, i= 1; i <= N; i++)
{
s+= a + b * (i-1);
printf("%d %f\n",i,s);
}
}
驗證如下:
比如, 在46Combo時, 的確是270370.關於Cytus II的計分方式及其它|音樂世界 Cytus II - 第1張關於Cytus II的計分方式及其它|音樂世界 Cytus II - 第2張
關於我寫的一個簡單的C語言程序 :
這個程序在輸入TP的值,Perfect,Good,Bad,Miss的個數後, 可以計算彩P黑P的個數, 計算FC時的得分, 判斷評分等級(非FC情況下要另外輸入得分), 計算基礎分連擊分, 在性歌(只斷連一次)的情況下計算是第幾個Note斷了.關於Cytus II的計分方式及其它|音樂世界 Cytus II - 第3張程序如下:

#include<stdio.h>
int s(int p, int g, int b, float N)
{
return (90e4 / N) * (p + (g + b) *0.3);
}
int gr(int s)
{
if (s == 100e4)
printf("評級 :MM");
if (95e4 <= s && s < 100e4)
printf("評級:S");
if (90e4 <= s && s < 95e4)
printf("評級:A");
if (80e4 <= s && s < 90e4)
printf("評級:B");
if (70e4 <= s && s < 80e4)
printf("評級:C");
if (s < 70e4)
printf("評級:Failed");
printf("\n");
return 0;
}
int combo(int c,int N)
{
int i, s;
for (i = 0, s = 0; i <= N - 1; i++)
{
(int)s = 100000.0 / (N - 1.0) / N * ((i - 1.0) * i + (N - i - 2.0) * (N - 1.0 - i));
if (s == c || s == c + 1 || s == c - 1)//存在不超過1的誤差,只能這樣處理了QAQ
break;
}
printf("可能在第%d或%d個note處斷連\n", i+1,N-i);
return 0;
}
int main()
{
float tp, a, N; 
int p, g, b, m, cp, hp;
printf("TP:");
scanf_s("%f", &tp);
printf("Perfect:");
scanf_s("%d", &p);
printf("Good:");
scanf_s("%d", &g);
printf("Bad:");
scanf_s("%d", &b);
printf("Miss:");
scanf_s("%d", &m);
N = p + g + b + m;
a = 100 / N;
hp = -((tp - 1.0*a * g * 0.3) / a - p) / 0.3;
cp = p - hp;
printf("彩Perfect數目:%d\n黑Perfect數目:%d\n", cp, hp);
switch ((g == 0) + (b == 0) * 2 + (m == 0) * 4)
{
case 7 ://MM
printf("得分:1000000\n基礎分:900000\n連擊分:100000\n");
gr(100e4);
if (tp != 100)printf("恭喜達成MM");
else printf("恭喜椰葉殺歌辣!");
break;
case 6://FC
{int s1;
s1 = s(p, g, b, N) + 10e4;
printf("得分:%d\n基礎分:%d\n連擊分:100000\n", s1,s(p, g, b, N));
gr(s1);
printf("恭喜達成FC");
break; }
case 5:
case 4://good?,bad= 0,miss!=0
{int s2,c2;
printf("得分:");
scanf_s("%d", &s2);
c2 = s2 - s(p, g, b, N);
printf("基礎分:%d\n連擊分:%d\n",s(p, g, b, N),c2);
gr(s2);
if (b == 1)
{
printf("恭喜獲得成就:每日一性\n");
combo(c2, N);
}
break;
}
case 3:
case 2://good?,bad!=0,miss==0
{int s3,c3;
printf("得分:");
scanf_s("%d", &s3);
c3 = s3 - s(p, g, b, N);
printf("基礎分:%d\n連擊分:%d\n", s(p, g, b, N),c3);
gr(s3);
if (m == 1)
{
printf("恭喜獲得成就:每日一性\n");
combo(c3, N);
}
break; }
case 1:
case 0://good?,bad!=0,miss!=0
{int s4,c4;
printf("得分:");
scanf_s("%d", &s4);
c4 = s4 - s(p, g, b, N);
printf("基礎分:%d\n連擊分:%d\n", s(p, g, b, N),c4);
gr(s4);
printf("恭喜獲得成就:又菜又愛玩"); }
}
return 0;
}

總結 :
寫這些程序對於C語言新手和Cy2玩家來說, 難度不大也很有意思, 同時能練習一下所學知識, 於是我就這麼做了.
PS: 明天C語言考試, 恐慌...

© 2022 3樓貓 下載APP 站點地圖 廣告合作:asmrly666@gmail.com