名字竞技场v1.2
  • 板块灌水区
  • 楼主zhuguyu
  • 当前回复11
  • 已保存回复11
  • 发布时间2024/8/8 15:16
  • 上次更新2024/8/8 15:55:04
查看原帖
名字竞技场v1.2
550190
zhuguyu楼主2024/8/8 15:16

上个版本:名字竞技场v1.1

更新内容:

  1. 增加闪避,以及暴击率,闪避率
  2. 增加伤害浮动
  3. 修改防御力计算方式
  4. 增加等级机制
  5. 控制台颜色修改,增加快进,慢放
  6. 移除了him

等级计算方式类似于mc 感谢上次几位大佬@CZ_Yang @drink_towind等大佬提供的灵感和升级
新版本可能会有亿点特性bug,希望大家帮忙找一找() 虽然公式是一点也没采用
其实是因为他们写的公式看不懂

#include<bits/stdc++.h>
#include<windows.h> 
#define sleep Sleep
#define int long long
#define homo 114514
#define sf scanf
#define pf printf
#define cs c_str() 
using namespace std;
struct phb{
	int id,val;
}Rank[homo]; 
struct firerecord{
	int time,who;
}hashfire[homo];
vector<int> infire;
vector<int> liv; 
int n,cnt,win,speed=500;
int sh[homo],fy[homo],hp[homo],kill[homo],zmyj[homo],ele[homo],lv[homo],Exp[homo],lvneed[homo],hpmax[homo];
double bjpro[homo],dodgepro[homo];
bool die[homo];
string s[homo];
long long ran(long long l, long long r){
	return ((rand()<<32)+(rand()<<16ll)+rand())%(r-l+1ll)+l;
}
int fyjs(double x,int tfy){
//	int t=tfy;
	double js=0,real;
	while(tfy--){
		js+=(1-js)*0.0015;
	}
	real=1-js;
	js=1-(real*(1+(x/10000)));
//	if(t==1980){
//		printf("%.4lf\n",js);
//	}
	js=max(0.00001*tfy,js);
	double res=x*fmin(js,1);
	return res;
}
void addExp(int who,int add){
	pf(" *%s* 获得%d点经验\n",s[who].cs,add);
	Exp[who]+=add;
	while(lvneed[lv[who]+1]<=Exp[who]){
		int tsh=sh[who],tfy=fy[who],thp=hp[who],thpmax=hpmax[who];
		double tbjpro=bjpro[who],tdodgepro=dodgepro[who];
		lv[who]++;
		sh[who]*=1.02;
		fy[who]*=1.02;
		hpmax[who]*=1.02;
		hp[who]+=hpmax[who]/50;
		bjpro[who]+=(1-bjpro[who])/100;
		dodgepro[who]+=(1-dodgepro[who])/100;
		pf(" *%s*升到**%d**级!属性变化:\n",s[who].cs,lv[who]);
		pf("攻击力   %8d ---> %-8d\n",tsh,sh[who]);
		pf("防御力   %8d ---> %-8d\n",tfy,fy[who]);
		pf("血量     %8d ---> %-8d\n",thp,hp[who]);
		pf("血量上限 %8d ---> %-8d\n",thpmax,hpmax[who]);
		pf("暴击率   %8.3lf ---> %-8.3lf\n",tbjpro,bjpro[who]);
		pf("闪避率   %8.3lf ---> %-8.3lf\n",tdodgepro,dodgepro[who]);
		sleep(speed*2);
	}
}
bool dodge(int x){
	int r=ran(1,10000);
	if(r<=dodgepro[x]*10000) return 1;
	return 0;
} 
int bj(double x,int u,int v){
	int isbj=ran(1,10000);
	int pd=bjpro[u]*10000;
	if(isbj>pd) return x;
	else{
		int r=ran(110,190);
		double add=((double)r)/(double)100;
		double res=x*add;
		pf(" *%s* 对 *%s* 产生了 [暴击] ,暴击倍率为 %.2lf 倍\n",s[u].cs,s[v].cs,add);
		return res;
	}
}
bool cmp(phb x,phb y){
	return x.val>y.val;
}
void isdie(int x,int y){
	bool flag=0;
	if(hp[y]<=0){
		flag=1;
		cnt--;
		auto it=find(liv.begin(),liv.end(),y);
		liv.erase(it);
		zmyj[y]=x;
		die[y]=1;
		kill[x]++;
	}
	if(flag) pf(" *%s* 击杀 *%s* ,目前他已击杀%d人\n",s[x].cs,s[y].cs,kill[x]),addExp(x,1000+Exp[y]/2);
}
void fire(int x,int y){
	int r=rand()%5;
	if(r==0){
		if(hashfire[y].time==0) infire.push_back(y);
		hashfire[y].time=5,hashfire[y].who=x;
		pf(" *%s* 发动 [火元素] 大招,对 *%s* 造成持续五轮的为自身攻击力25%的火焰伤害\n",s[x].cs,s[y].cs);
	}
}
void duel(int x,int y){
	bool flag=0;
	int zssh=sh[x]+ran(sh[x]-sh[x]/10,sh[x]+sh[x]/10),dd,tsh;	
	tsh=zssh=bj((double)zssh,x,y);
	dd=fyjs((double)zssh,fy[y]); 
	zssh-=dd;
	if(ele[x]==2){
		fire(x,y);
	}
	if(dodge(y)){
		pf(" *%s* 对 *%s* 造成了%d点伤害,但是这次伤害被 [闪避] 了\n",s[x].cs,s[y].cs,zssh);
		addExp(y,zssh);
		return ;
	}
	hp[y]-=zssh;
	hp[y]=max(0ll,hp[y]);
	pf(" *%s* 对 *%s* 造成了%d点伤害,被抵挡%d点伤害,实际造成%d点伤害, *%s* 还剩%d点血\n",s[x].cs,s[y].cs,tsh,dd,zssh,s[y].cs,zssh+dd/5,hp[y]);
	addExp(x,zssh+dd/5);
	isdie(x,y);
}
void ice(int x,int y){
	int r=rand()%5;
	if(r==0){
		pf(" *%s* 发动 [冰元素] 大招,冰冻对手使得自己产生二连击\n",s[x].cs);
		duel(x,y);
	}
}
void fireset(){
	for(auto it=infire.begin();it!=infire.end();it++){
		if(die[*it]){
			infire.erase(it);
			it--;
		}
		else{
			int zssh=sh[hashfire[*it].who]*0.25;
			int dd=fyjs((double)zssh,fy[*it]);
			zssh-=dd;
			hp[*it]-=zssh;
			hp[*it]=max(0ll,hp[*it]);
			pf(" *%s* 受到%d点火焰燃烧伤害,还剩%d点血\n",s[*it].cs,zssh,hp[*it]);
			addExp(hashfire[*it].who,zssh+dd/5);
			isdie(hashfire[*it].who,*it);
			hashfire[*it].time--;
			if(hashfire[*it].time==0){
				infire.erase(it);
				it--;
			}
		}
	}
}
signed main(){
	system("color B5");
	srand(time(0));	
	for(int i=1;i<=100000;i++){
		if(i<=16) lvneed[i]=i*i+6*i;
		if(i>=17&&i<=31) lvneed[i]=(double)(2.5*(double)i*(double)i-40.5*(double)i+360);
		if(i>=32) lvneed[i]=(double)(4.5*(double)i*(double)i-162.5*(double)i+2220);
		lvneed[i]*=100;
	}
	pf("注:按M键加速,N键减速\n");
	pf("请输入名字个数:");
	sf("%d",&n);
	cnt=n;
	pf("请输入%d个名字,以及他们的血量,防御力,攻击力(不含空格),元素属性,暴击率,闪避率\n0代表无属性,1代表冰属性,2代表火属性:\n",n);
	liv.push_back(0);
	for(int i=1;i<=n;i++){
		cin>>s[i]>>hp[i]>>fy[i]>>sh[i]>>ele[i]>>bjpro[i]>>dodgepro[i];
		hpmax[i]=hp[i];
		liv.push_back(i);
	}	
	while(cnt>1){
		int x=liv[ran(1,cnt)],y=liv[ran(1,cnt)];
		while(x==y) x=liv[ran(1,cnt)],y=liv[ran(1,cnt)];
		if(ele[x]==1) ice(x,y);
		if(!die[x]&&!die[y]) duel(x,y);
		fireset();
       	if(GetAsyncKeyState(0x4D)) speed=100;
    	if(GetAsyncKeyState(0x4E)) speed=500;
       	sleep(speed);
	}
	for(int i=1;i<=n;i++){
		if(!die[i]){
			win=i;
			break;
		}
	}
	pf("胜者: *%s* \n击杀数排名:\n",s[win].cs);
	for(int i=1;i<=n;i++) Rank[i].id=i,Rank[i].val=kill[i];
	sort(Rank+1,Rank+n+1,cmp);
	for(int i=1;i<=n;i++){
		pf(" *%s* 排名:%d 击杀数:%d 致命一击:",s[Rank[i].id].cs,i,Rank[i].val);
		if(zmyj[Rank[i].id]) pf(" *%s* ",s[zmyj[Rank[i].id]].cs);
		pf("\n");
	}
	system("pause");
}
/*
abc 20000 514 800 2 0.26 0.12
sb 6000 1980 300 2 0.66 0.33
wcnm 40000 100 800 0 0 0
qn 22000 500 800 1 0.34 0.15
*/
2024/8/8 15:16
加载中...