一个对战游戏模板
查看原帖
一个对战游戏模板
84773
minecraft_herobrine楼主2021/8/6 21:30

额 代码有点大,就先放主程序

玩家数据值存储和伤害计算放在剪贴板了

这里玩家的数据值可以在战斗开始前自由更改,菜单还没做好,所以这个代码就可以往里面塞任何好康的自己的代码了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;
}

这个游戏不想再像我上个游戏一样烂尾了

2021/8/6 21:30
加载中...