事情是这样的,我发现了一个游戏 但是因为不能自定义每个名字的属性,就让我很烦恼,所以我闲着没事就做了个名字竞技场c++版:
#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define cs c_str()
using namespace std;
struct phb{
int id,val;
}x[100001];
vector<int> liv;
int n,cnt;
int sh[100001],fy[100001],hp[100001],kill[100001],zmyj[100001],win;
bool die[100001];
string s[100001];
int fyjs(double x,int tfy){
// int t=tfy;
double js=0,add=0.000501;
while(tfy--){
if(sqrt(1-js)*0.001<add) add-=0.000001;
js+=max(max(sqrt(1-js)*0.001,add),0.00001);
// if(t==1980){
// printf("%.4lf\n",js);
// }
if(js>=1) break;
}
js-=(x/10000);
js=max(0.00001*tfy,js);
double res=x*fmin(js,1);
return res;
}
int bj(double x,int u,int v){
int isbj=rand()%10+1;
if(isbj>3) return x;
else{
int r=rand()%91+110;
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 duel(int x,int y){
bool flag=0;
int zssh=sh[x],dd,tsh;
tsh=zssh=bj((double)zssh,x,y);
dd=fyjs((double)zssh,fy[y]);
zssh-=dd;
hp[y]-=zssh;
if(hp[y]<=0){
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]++;
}
pf(" *%s* 对 *%s* 造成了%d点伤害,被抵挡%d点伤害,实际造成%d点伤害, *%s* 还剩%d点血\n",s[x].cs,s[y].cs,tsh,dd,zssh,s[y].cs,hp[y]);
if(flag) pf(" *%s* 击杀 *%s* \n",s[x].cs,s[y].cs);
}
int main(){
srand(time(0));
pf("请输入名字个数:");
sf("%d",&n);
cnt=n;
pf("请输入n个名字,以及他们的血量,防御力,攻击力(不含空格):\n");
liv.push_back(0);
for(int i=1;i<=n;i++){
cin>>s[i]>>hp[i]>>fy[i]>>sh[i];
liv.push_back(i);
}
while(cnt>1){
int x=liv[rand()%cnt+1],y=liv[rand()%cnt+1];
while(x==y) x=liv[rand()%cnt+1],y=liv[rand()%cnt+1];
duel(x,y);
}
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++) x[i].id=i,x[i].val=kill[i];
sort(x+1,x+n+1,cmp);
for(int i=1;i<=n;i++){
pf(" *%s* 排名:%d 击杀数:%d 致命一击:",s[x[i].id].cs,i,x[i].val);
if(zmyj[x[i].id]) pf(" *%s* ",s[zmyj[x[i].id]].cs);
pf("\n");
}
}