额 代码有点大,就先放主程序
玩家数据值存储和伤害计算放在剪贴板了
这里玩家的数据值可以在战斗开始前自由更改,菜单还没做好,所以这个代码就可以往里面塞任何好康的自己的代码了awa
#include<bits/stdc++.h>
#include<time.h>
#include<conio.h>
#include<direct.h>
#include<stdlib.h>
#include<windows.h>
using namespace std;
#include<Player_Data.h>
void SetColor(unsigned short ForeColor,unsigned short BackGroundColor)//改变字体颜色
{
HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,(ForeColor%16)|(BackGroundColor%16*16));
}
//SetColor(文字颜色,背景颜色)
double Baseatk(double atk,double def)//近战伤害计算
{
double x=def/atk;
if(x<1.0) return atk*(1-(pow(2.0,(x-1.0))-0.5));
else return atk*(1-(pow(2.0,x)-1)/pow(2.0,x));
}
double Fireatk(double atk,double def,double d1,double d2,double d3,double d4)//火焰伤害计算
{
double A=atk,x=def/atk;
A*=(1-(pow(2.0,x)-1)/pow(2.0,x+2));
A*=((1.0-d1*0.03)*(1.0-d2*0.03)*(1.0-d3*0.03)*(1.0-d4*0.03));
return A;
}
double Arrowatk(double atk,double def,double d1,double d2,double d3,double d4)//箭矢伤害计算
{
double A=atk,x=def/atk;
A*=(1-(pow(2.0,x)-1)/pow(2.0,x+1));
A*=((1.0-d1*0.025)*(1.0-d2*0.025)*(1.0-d3*0.025)*(1.0-d4*0.025));
return A;
}
double Exatk(double atk,double def,double d1,double d2,double d3,double d4)//爆炸伤害计算
{
double A=atk,x=def/atk;
A*=(1-(pow(2.0,x)-1)/pow(2.0,x+1));
A*=((1.0-d1*0.03)*(1.0-d2*0.03)*(1.0-d3*0.03)*(1.0-d4*0.03));
return A;
}
string mat[7]=//装备名称材质前缀
{
"1145141919810",
"木",
"金",
"石",
"铁",
"钻石",
"合金"
};
int Hp_Length=50;//血量条长度
void PrintHp_Hurt(double Hp,double Maxhp,double Atk)//收到伤害特效
{
int Newhp=(int)((Hp-Atk)/Maxhp*(Hp_Length*1.0)),i;
int Oldhp=(int)(Hp/Maxhp*(Hp_Length*1.0));
if(Newhp<=5)
{
SetColor(12,12);
for(i=1;i<=Newhp;i++) printf(" ");
}
else if(Newhp<=10)
{
SetColor(14,14);
for(i=1;i<=Newhp;i++) printf(" ");
}
else
{
SetColor(10,10);
for(i=1;i<=Newhp;i++) printf(" ");
}
SetColor(4,4);
for(i=Newhp+1;i<=Oldhp;i++) printf(" ");
SetColor(8,8);
for(i=Oldhp+1;i<=Hp_Length;i++) printf(" ");
SetColor(15,0);
return;
}
void PrintHp_Reco(double Hp,double Maxhp,double Rec)//打印回血特效
{
int Newhp=(int)((Hp+Rec)/Maxhp*(Hp_Length*1.0)),i;
int Oldhp=(int)(Hp/Maxhp*(Hp_Length*1.0));
//Old恢复前血量 New恢复后
if(Newhp<=5)
{
SetColor(12,12);
for(i=1;i<=Oldhp;i++) printf(" ");
}
else if(Newhp<=10)
{
SetColor(14,14);
for(i=1;i<=Oldhp;i++) printf(" ");
}
else
{
SetColor(10,10);
for(i=1;i<=Oldhp;i++) printf(" ");
}
SetColor(2,2);
for(i=Oldhp+1;i<=Newhp;i++) printf(" ");
SetColor(8,8);
for(i=Newhp+1;i<=Hp_Length;i++) printf(" ");
SetColor(15,0);
return;
}
void War()//PVE战斗主模块
{
system("cls");
p2.Base_atk=4.0;
p2.Hp=20.0;
p2.Maxhp=20.0;
p2.Base_def=2.0;
p2.weapons.sword.Atk=6.0;
p2.weapons.sword.Dur=4;
p2.weapons.sword.Mat=4;
p1.Base_atk=1.0;
p1.weapons.sword.Atk=5.0;
p1.weapons.sword.Dur=3;
p1.weapons.sword.Mat=3;
p1.Hp=20.0;
p1.Maxhp=20.0;
p1.Base_def=0.0;
int r=0;
while(p2.Hp>0 && p1.Hp>0)
{
printf("Player\n");
printf("Hp:");
PrintHp_Hurt(p1.Hp,p1.Maxhp,0);
printf("%.3lf/%.3lf\n",p1.Hp,p1.Maxhp);
printf("Atk:%.3lf\n",p1.Base_atk);
printf("Def:%.3lf\n",p1.Base_def);
printf("\n");
printf("Emery\n");
printf("Hp:");
PrintHp_Hurt(p2.Hp,p2.Maxhp,0);
printf("%.3lf/%.3lf\n",p2.Hp,p2.Maxhp);
printf("Atk:%.3lf\n",p2.Base_atk);
printf("Def:%.3lf\n",p2.Base_def);
printf("\n");
switch(r%2)
{
case 0://玩家回合 在此编写菜单
{
char ch='0';bool ok=false;
printf("Player回合\n");
printf("1| 基础攻击 %.3lf伤害\n",p1.Base_atk);
if(p1.weapons.sword.Dur>0) printf("2| 石剑 %.3lf伤害\n",p1.weapons.sword.Atk);
while(1)
{
if(ok) break;
ch=getch();
switch(ch)
{
case '1':
{
system("cls");
double A=Baseatk(p1.Base_atk,p2.Base_def);
printf("Player\n");
printf("Hp:");
PrintHp_Hurt(p1.Hp,p1.Maxhp,0);
printf("%.3lf/%.3lf\n",p1.Hp,p1.Maxhp);
printf("Atk:%.3lf\n",p1.Base_atk);
printf("Def:%.3lf\n",p1.Base_def);
printf("\n");
printf("Emery\n");
printf("Hp:");
PrintHp_Hurt(p2.Hp,p2.Maxhp,A);
printf("%.3lf/%.3lf\n",p2.Hp,p2.Maxhp);
printf("Atk:%.3lf\n",p2.Base_atk);
printf("Def:%.3lf\n",p2.Base_def);
printf("\n");
printf("Player使用基础攻击\n");
printf("Emery受到了%.3lf伤害\n",A);
p2.Hp-=A;ok=true;
break;
}
case '2':
{
if(p1.weapons.sword.Dur<=0)
{
printf("无效输入\n");
break;
}
system("cls");
double A=Baseatk(p1.weapons.sword.Atk,p2.Base_def);
printf("Player\n");
printf("Hp:");
PrintHp_Hurt(p1.Hp,p1.Maxhp,0);
printf("%.3lf/%.3lf\n",p1.Hp,p1.Maxhp);
printf("Atk:%.3lf\n",p1.Base_atk);
printf("Def:%.3lf\n",p1.Base_def);
printf("\n");
printf("Emery\n");
printf("Hp:");
PrintHp_Hurt(p2.Hp,p2.Maxhp,A);
printf("%.3lf/%.3lf\n",p2.Hp,p2.Maxhp);
printf("Atk:%.3lf\n",p2.Base_atk);
printf("Def:%.3lf\n",p2.Base_def);
printf("\n");
printf("Player使用[");
SetColor(10,0);
printf("石剑");
SetColor(15,0);
printf("]攻击\n");
printf("Emery受到了%.3lf伤害\n",A);
p2.Hp-=A;ok=true;
p1.weapons.sword.Dur--;
if(p1.weapons.sword.Dur==0)
{
printf("[");
SetColor(10,0);
printf("石剑");
SetColor(15,0);
printf("]已损毁,无法使用\n");
}
break;
}
default:
{
printf("无效输入\n");
break;
}
}
}
getch();
r++;
break;
}
case 1://敌方回合 在此加入战斗AI
{
char ch='0';bool ok=false;
printf("Emery回合\n");
// printf("1| 基础攻击 %.3lf伤害\n",p1.Base_atk);
system("cls");
double A;
if(p2.weapons.sword.Dur>0) A=Baseatk(p2.weapons.sword.Atk,p1.Base_def);
else A=Baseatk(p2.Base_atk,p1.Base_def);
printf("Player\n");
printf("Hp:");
PrintHp_Hurt(p1.Hp,p1.Maxhp,A);
printf("%.3lf/%.3lf\n",p1.Hp,p1.Maxhp);
printf("Atk:%.3lf\n",p1.Base_atk);
printf("Def:%.3lf\n",p1.Base_def);
printf("\n");
printf("Emery\n");
printf("Hp:");
PrintHp_Hurt(p2.Hp,p2.Maxhp,0);
printf("%.3lf/%.3lf\n",p2.Hp,p2.Maxhp);
printf("Atk:%.3lf\n",p2.Base_atk);
printf("Def:%.3lf\n",p2.Base_def);
printf("\n");
if(p2.weapons.sword.Dur>0)
{
printf("Emery使用[");
SetColor(11,0);
printf("铁剑");
SetColor(15,0);
printf("]攻击\n");
printf("Player受到了%.3lf伤害\n",A);
p2.weapons.sword.Dur--;
}
else
{
printf("Emery使用基础攻击\n");
printf("Player受到了%.3lf伤害\n",A);
}
p1.Hp-=A;
r++;
getch();
break;
}
}
system("cls");
}
system("cls");
if(p1.Hp<=0)
{
SetColor(12,0);
printf("你死了\n");
}
else
{
SetColor(10,0);
printf("你赢了\n");
}
SetColor(15,0);
printf("按任意键继续\n");
getch();
system("cls");
return;
}
/*
void PVE()
{
while(1)
{
printf("选择副本等级和场景\n");
printf("新手副本 - 任何等级均可进入\n");
if(p1.Lvl<10) SetColor(2,0);
else SetColor(10,0);
printf("10级副本\n");
if(p1.Lvl<35) SetColor(3,0);
else SetColor(11,0);
printf("35级副本\n");
if(p1.Lvl<75) SetColor(1,0);
else SetColor(9,0);
printf("75级副本\n");
if(p1.Lvl<75) SetColor(5,0);
else SetColor(13,0);
printf("120级副本\n");
if(p1.Lvl<75) SetColor(6,0);
else SetColor(14,0);
printf("200级副本\n");
if(p1.Lvl<114514) SetColor(4,0);
else SetColor(12,0);
printf("炼狱副本(暂不开放)\n");
}
}*/
void P2()
{
return;
}
void game()
{
while(1)
{
char ch;
printf("1| 单人副本\n");
printf("2| 双人PVP\n");
ch=getch();
switch(ch)
{
case '1':
{
War();
break;
}
case '2':
{
P2();
break;
}
}
}
}
int main()
{
SetColor(15,0);
War();
return 0;
while(1)
{
printf("g| 开始\n");
printf("s| 存档\n");
printf("l| 读档\n");
printf("q| 退出\n");
char ch=getch();
system("cls");
switch(ch)
{
case 'g':
{
game();
break;
}
case 's':
{
break;
}
case 'l':
{
break;
}
case 'q':
{
break;
}
}
}
return 0;
}
这个游戏不想再像我上个游戏一样烂尾了