【C++】Phigros控分计算

本文介绍了如何使用C++编程计算音乐游戏Phigros的得分和连击数。根据评分规则,满分1000000,判定分为900000,连击分为100000。通过穷举法计算用户输入的分数和完美、良好判定数,得出最高连击数(maxcombo)。代码实现了四舍五入后的区间判断,确保结果符合游戏内的显示。作者提到,虽然部分计算结果得到验证,但由于个人操作限制,某些情况未能实际测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本原则:

①满分1000000,判定分900000,连击分100000

acc=\frac{perfect+0.65 \times good}{notes}\times100\%

score=acc\times 900000+\frac{maxcombo}{notes}\times 100000

notes=perfect+good+miss(bad)

根据以上四条,易得

notes\times score=900000\times perfect+585000\times good+100000\times maxcombo

maxcombo\leq perfect+good\leq notes

(perfect+good-1)(maxcombo+1)< maxcombo\times notes

\frac{notes\times score}{1000000}-0.685\times good\leq perfect\leq notes-good

用户输入分数和物量,由于只有Tap和Hold有good判定,需要输入good判定的最大数目GM(实际上这个不重要,因为good太多实践难度太高,随便输个数就行了)。

穷举法:外层举good,从最大到0;内层举perfect,从最大到最小,然后根据perfect和good数来计算maxcombo(程序里简写成combo)。游戏里显示的分数是经过四舍五入的,整数score代表的是区间[score-0.5,score+0.5),所以计算出的maxcombo应是一个左闭右开的范围,判断该范围内是否存在正整数(程序里用向上取整来判断),若该正整数存在且满足上述不等式②③,则该正整数为maxcombo值,输出这条结果,顺便计算一下acc。

完整代码:

#include <iostream>
#include <cmath> 
#include <iomanip> 
using namespace std;
int main()
{
	int score=-1,notes=-1,GM=-1;//GM是good的最大值 
	int p,g,combo,count=0;//p:perfect,g:good,combo:最大连击数 
	int pmin,pmax,cmin,cmax;
	double acc;
	while(!(score>=0&&score<=1000000)){//范围检测 
		cout <<"输入你想打的分数(0~1000000): ";
		cin >> score;}
	while(notes<=0)//范围检测 
	{cout <<"输入总物量:";
	cin>>notes;}
	while(!(GM>=0&&GM<=notes)){//范围检测 
		cout<<"输入tap+hold物量(good最大值)(0~"<<notes<<"):";
		cin>>GM;
	}
	for(g=GM;g>=0;g--)//遍历good 
	{
		pmin=ceil(notes*score/1000000.0-0.685*g);//向上取整 
		if(pmin<0)pmin=0;
		pmax=notes-g;
		for(p=pmax;p>=pmin;p--)//遍历perfect 
		{
			cmin=ceil(notes*(score-0.5)/100000.0-9*p-5.85*g);
			cmax=ceil(notes*(score+0.5)/100000.0-9*p-5.85*g);//计算maxcombo范围 
			for(combo=cmin;combo<cmax;combo++)
				if(combo>=0 && combo<=(p+g) && (p+g-1)*(combo+1)<(notes*combo)){//筛选符合条件的整数maxcombo 
					acc=(p+0.65*g)/notes*100;
					cout<<"perfect: "<<p<<",good: "<<g<<",bad+miss: "<<notes-p-g<<",maxcombo: "<<combo<<",acc:"<<fixed<<setprecision(2)<<acc<<"%"<<endl;
					count++;}
		}

	}
	if(count>0)
		cout<<"共"<<count<<"种选择,推荐最后一种"<<endl;
	else if(count==0)
		cout<<"无法打出该得分"<<endl;
}

程序结果:(紧跟一下实事)

来自原神玩家沉默微笑,与上图最后一条符合,不知道怎么去水印,,

 其余的结果经计算基本成立,但是个人引诱太菜难以亲自实践

极端情况也可以

当时觉得挺有意思就写了一下,没想到就火了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值