上个版本:名字竞技场v1.1
更新内容:
等级计算方式类似于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
*/