devc++多人PVP小游戏2.0

终于改好了,前几天出去了,一直没改。

更新内容主要是修复一些bug,增加了一个选角色的功能,4人的还在搞。

顺便在此感谢那位提出有bug的同学。

#include<algorithm>
#include<cmath>
#include<vector>
#include<stdio.h>
#include<iostream>
#include<string>
#include<cstring>
#include<windows.h>
#include<conio.h>
#include<cstdlib>
#include<ctime>
#include<fstream>
using namespace std;
int ax[5];
void gotoxy(int y,int x) 
{
    COORD  coord;     
    coord.X=x;         
    coord.Y=y;
    HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(a,coord);    
}
void coutwhat(int a,int b,int c,int d,string n)
{
	int i,j;
	for(i=a;i<=c;i++)
	  for(j=b;j<=d;j++)
	    {
	    	gotoxy(i,j);
	    	cout<<n;
		}
}
void color(int x)
{
	switch(x)
	  {
	    case 0:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |FOREGROUND_GREEN);break;
	    case 1:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_GREEN);break;
		case 2:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_BLUE |FOREGROUND_GREEN);break;
	    case 3:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_BLUE |FOREGROUND_GREEN);break;
	  	case 4:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_BLUE);break;
	  	case 5:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_BLUE |FOREGROUND_RED);break;
		case 7:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_RED);break;
		case 8:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_RED|FOREGROUND_GREEN);break;
		case 9:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY |FOREGROUND_RED|FOREGROUND_BLUE);break;
	    case 10:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED);break;
	    default:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE);break;
	  }
}
int random(int n,int m)
{
	int s;
	s=rand()%(m-n+1);
	s+=n;
	return s;
}

void cls()
{
	system("cls");
}
struct Player
{
	string name;
	int hp;
	int HP;
	int attack;
	int defence;
	int fw;//0,1,2,3
	int energy;
	int kill;
	int x;
	int y;
	int sc;
	int zl;
	int cs;
};
Player player[5];
void printfssbh(int n)
{
	int i,j,k;
	for(i=1;i<=4;i++)
	  	  {
	  	  	gotoxy(0,i*25);
	  	  	cout<<player[i].energy<<"("<<player[i].energy/10.0<<"%)"<<player[i].kill<<"kill ";
		  }
	//计算生命百分比 
	float a[5];
	int b[5];
	for(i=1;i<=n;i++)
	  a[i]=(player[i].hp*1.0)/(player[i].HP*1.0);
	for(i=1;i<=n;i++)
	  b[i]=a[i]*100;
	for(i=1;i<=n;i++)
	  if (b[i]>10000)
	    b[i]=0;//死者 
	  else
	    if (b[i]>100)
	      b[i]=100;//血量溢出但还没死 
	//输出 
	for(i=1;i<=n;i++)
	  {
	  	gotoxy(35+i,0);
	  	cout<<"|";
	    coutwhat(35+i,1,35+i,b[i],"#");
	    coutwhat(35+i,b[i]+1,35+i,100," ");
		gotoxy(35+i,101);
		cout<<"|";
		cout<<a[i]*100.0<<'%';
		cout<<" "<<player[i].hp;
		gotoxy(35+i,120);
		printf("Player %d",ax[i]);
	  }
}
bool save[5]={1,1,1,1,1};
void printfplayer(string ml,int n)
{
	int i;
	if (ml=="clear")
	  {
	  	for(i=1;i<=n;i++)
	  	  {
	  	  	gotoxy(player[i].x,player[i].y);
	  	  	cout<<"  ";
		  }
	  }
	if (ml=="printf")
	  {
	  	for(i=1;i<=n;i++)
	  	  {
	  	  	if (save[i]==0) //此人已亡 
	  	  	  continue;
	  	  	color(i*3);
	  	  	gotoxy(player[i].x,player[i].y);
	  	  	cout<<"♀";
		  }
	  }
}
void hidden()
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(handle, &CursorInfo);
CursorInfo.bVisible = false;
SetConsoleCursorInfo(handle, &CursorInfo);
}
bool choose[5]={0,0,0,0,0};
/*
攻击方式:
player 1 十字架攻击
player 2 小范围攻击
player 3 全战场攻击 (随机攻击一人) 
player 4 三角形攻击

*/
int PVP(int n)
{
	int r=n,m,i,j,k,sh;
	//输出界面
	coutwhat(1,0,1,100,"=");
	coutwhat(2,0,32,0,"|");
	coutwhat(33,0,33,100,"=");
	coutwhat(2,101,32,101,"|");
	for(i=1;i<=4;i++)
	  save[i]=choose[i];//没被选的都是死人 
	while(r>1)
	  {
	  	for(i=1;i<=n;i++)
	  	  if (save[i]==0)
	  	    player[i].hp=21474836;//永远无法击败死者 
	  	int GJ[5]={0,0,0,0,0};//记录被攻击者编号 
	  	int qx=0,qy=0,zx=0,zy=0;
	  	hidden();
	  	//输出实时变化 
		printfssbh(n);
		//输入 
		char l='/';
		if (kbhit())
		  l=getch();
		m=0;
		//已死亡玩家判断 
		if ((l=='w'||l=='a'||l=='s'||l=='d'||l=='x'||l=='q'||l=='e'||l=='z'||l=='c')&&save[1]==0)
		  l='/';
		if ((l=='u'||l=='i'||l=='o'||l=='j'||l=='k'||l=='l'||l=='m'||l==','||l=='.')&&save[2]==0)
		  l='/';
		if ((l>='1'&&l<='9')&&save[3]==0)
		  l='/'; 
		printfplayer("clear",n);
		switch(l)
		  {
		  	//Player 1
		  	case 'w':if (player[1].x-1>=4)player[1].x--;break;
		  	case 'a':if (player[1].y-1>=2)player[1].y--;break;
		  	case 's':if (player[1].x+1<=32)player[1].x++;break;
		  	case 'd':if (player[1].y+1<=100)player[1].y++;break;
		  	case 'x':
			  {
			  	coutwhat(player[1].x,2,player[1].x,99,"-");
			  	coutwhat(2,player[1].y,31,player[1].y,"|");
			  	for(i=2;i<=4;i++)
				  if (player[i].x==player[1].x||player[i].y==player[1].y)
				    GJ[++m]=i;
				for(i=1;i<=m;i++)
				  {
				  	if (save[GJ[i]]==0)
				  	  continue;
				  	player[1].energy+=random(10,30);
				  	player[GJ[i]].energy+random(5,15);
				  	sh=player[1].attack-player[GJ[i]].defence;
				  	player[1].sc+=sh;
				  	player[GJ[i]].cs+=sh;
				  	player[GJ[i]].hp-=sh;
				  	gotoxy(player[GJ[i]].x,player[GJ[i]].y);
				  	cout<<'-'<<sh;
				  	if (player[GJ[i]].hp<=0)
				  	  save[GJ[i]]=0,player[1].kill++,player[1].energy+=350,r--;
				  } 
				for(i=1;i<=m;i++)
				gotoxy(player[GJ[i]].x,player[GJ[i]].y);
				cout<<"       ";
				coutwhat(player[1].x,2,player[1].x,100," ");
				coutwhat(2,player[1].y,31,player[1].y,"  ");
				break;
			  } 
			case 'q':
				{
					if (player[1].energy<1000)
					  break;
					player[1].energy-=1000;
					m=random(367,763);
					player[2].energy-=m;
					if (n>=3)
					player[3].energy-=1000-m;
					sh=player[1].attack*3;
					for(i=2;i<=n;i++)
					  {
					  	if (save[i]==0)
					  	  continue;
					  	gotoxy(player[i].x-2,player[i].y);
					  	cout<<'-'<<sh-player[i].defence;
					  	player[i].hp-=sh-player[i].defence;
					  	player[1].sc+=sh-player[i].defence;
					  	player[i].cs+=sh-player[i].defence;
					  	if (player[i].hp<=0)
					  	  player[1].kill++,player[1].energy+=350,save[i]=0;
					  }
					break;
				}
			case 'e':
				{
					if (player[1].energy<500)
					  break;
					player[1].energy-=500;
					m=random(player[1].attack*3,player[1].attack*5);
					player[1].zl+=m;
					player[1].hp+=m;
					gotoxy(player[1].x-1,player[1].y);
					cout<<"+"<<m;
					break;
				}
			//Player 2
			case 'i':if (player[2].x-1>=1)player[2].x--;break;
		  	case 'j':if (player[2].y-1>=1)player[2].y--;break;
		  	case 'k':if (player[2].x+1<=32)player[2].x++;break;
		  	case 'l':if (player[2].y+1<=100)player[2].y++;break;
		  	case ',':
			  {
			  	qx=player[2].x-5;
			  	qy=player[2].y-5;
			  	zx=player[2].x+5;
			  	zy=player[2].y+5;
			  	if (qx<=2)
			  	  qx=2;
			  	if (qx>=32)
			  	  qx=32;
			  	if (qy<=2)
			  	  qy=2;
			  	if (qy>=100)
			  	  qy=100;
			  	if (zx<=2)
			  	  zx=2;
			  	if (zx>=32)
			  	  zx=32;
			  	if (zy<=2)
			  	  zy=2;
			  	if (zy>=100)
			  	  zy=100;
			  	coutwhat(qx,qy,zx,zy,"#");
			  	if (player[1].x>=qx&&player[1].x<=zx&&player[1].y>=qy&&player[1].y<=zy&&save[1]==1)
				  GJ[++m]=1;
				for(i=3;i<=n;i++)
				 if (player[i].x>=qx&&player[i].x<=zx&&player[i].y>=qy&&player[i].y<=zy&&save[i]==1)
				  GJ[++m]=i;
				for(i=1;i<=m;i++)
				  {
				  	player[2].energy+=random(10,30);
				  	player[GJ[i]].energy+random(5,15);
				  	sh=player[2].attack-player[GJ[i]].defence;
				  	player[2].sc+=sh;
				  	gotoxy(player[GJ[i]].x,player[GJ[i]].y);
				  	cout<<'-'<<sh;
				  	player[GJ[i]].cs+=sh;
				  	player[GJ[i]].hp-=sh;
				  	if (player[GJ[i]].hp<=0)
				  	  save[GJ[i]]=0,player[2].kill++,player[2].energy+=350,r--;
				  } 
				for(i=1;i<=m;i++)
				gotoxy(player[GJ[i]].x,player[GJ[i]].y);
				cout<<"       ";
				coutwhat(qx,qy,zx,zy," ");
				break;
			  } 
			case 'u':
				{
					if (player[2].energy<1000)
					  break;
					player[2].energy-=1000;
					sh=player[2].attack*3.5;
					gotoxy(player[1].x-2,player[1].y);
					cout<<'-'<<sh-player[1].defence;
					player[1].hp-=sh-player[1].defence;
					player[1].cs+=sh-player[1].defence;
					player[2].sc+=sh-player[1].defence;
					for(i=3;i<=n;i++)
					  {
					  	gotoxy(player[i].x-2,player[i].y);
						cout<<'-'<<sh-player[i].defence;
						player[i].hp-=sh-player[i].defence;
						player[i].cs+=sh-player[i].defence;
						player[2].sc+=sh-player[i].defence;
					  }
					sh*=(n-1);
					gotoxy(player[2].x-1,player[2].y);
					cout<<'+'<<sh;
					player[2].hp+=sh;
					player[2].zl+=sh;
					break;
				}
			case 'o':
				{
					if (player[2].energy<500)
					  break;
					player[2].energy-=500;
					m=random(player[2].attack*3,player[2].attack*5);
					player[2].zl+=m;
					player[2].hp+=m;
					gotoxy(player[2].x-1,player[2].y);
					cout<<"+"<<m;
					break;
				}
			//Player 3
			case '1':if (player[3].x-1>=1)player[3].x--;break;
		  	case '2':if (player[3].y-1>=1)player[3].y--;break;
		  	case '3':if (player[3].x+1<=32)player[3].x++;break;
		  	case '4':if (player[3].y+1<=100)player[3].y++;break;
		  	case '5':
		  		{
		  			do
		  			  m=random(1,n);
		  			while(m==3||save[m]==0);
		  			player[3].energy+=random(10,30);
				  	player[m].energy+random(5,15);
				  	sh=player[3].attack-player[m].defence;
				  	player[3].sc+=sh;
				  	gotoxy(player[m].x-2,player[m].y);
				  	cout<<'-'<<sh;
				  	player[m].cs+=sh;
				  	player[m].hp-=sh;
				  	if (player[m].hp<=0)
				  	  save[m]=0,player[3].kill++,player[3].energy+=350,r--;
				  	gotoxy(player[m].x-2,player[m].y);
				  	cout<<"       ";
				  	break;
				}
			case '6':
				{
					if (player[3].energy<1000)
					  break;
					player[3].energy-=1000;
					m=0;
					for(i=1;i<=n;i++)
					  if (i==3)
					    continue;
					  else
					    if (player[i].hp*100/player[i].HP<=13)
					      {
					      	GJ[++m]=i;
						  }
					if (m==0)
					  {
					  	do 
					  	  m=random(1,n);
					  	while(m==3);
					  	sh=player[3].attack*5.6;
					  	player[m].hp-=sh;
					  	player[m].cs+=sh;
					  	player[3].sc+=sh;
					  	break;
					  }
					else
					  {
					  	m=GJ[random(1,m)];
					  	player[3].sc+=player[m].hp;
					  	player[m].cs+=player[m].hp;
					  	player[m].hp=0;
						save[m]=0;
						player[3].kill++,player[3].energy+=350,r--;
						break;
					  }
					break;
				}
			case '7':
				{
					if (player[3].energy<500)
					  break;
					player[3].energy-=500;
					m=random(player[3].attack*3,player[3].attack*5);
					player[3].zl+=m;
					player[3].hp+=m;
					gotoxy(player[3].x-1,player[3].y);
					cout<<"+"<<m;
					break;
				}
		  }
		printfplayer("printf",n);
		int live=0;
		for(i=1;i<=n;i++)
		  {
		  	live+=save[i];
		  	if (live>=2)
		  	  break;
		  }
		if (live<=1)
		  break;
	  }
	for(i=1;i<=n;i++)
	  if (save[i]&&player[i].hp<=1000000)//
		return i;
}
int main()
{
	srand(time(0));
	hidden();
	int n,i,win;
	printf("请选择游戏人数:\n");
	printf("1.2人\n");
	printf("2.3人\n");
	printf("3.4人(编写中)\n");
	char m,l;
	do
	  m=_getch();
	while(!(m>='1'&&m<='2'));
	n=m-'0'+1;
	system("cls"); 
	player[1].x=1*random(6,8),player[1].y=1*random(6,8),player[1].HP=random(450000,678901),player[1].hp=player[1].HP,player[1].attack=random(3500,5500),player[1].defence=random(600,800);
	player[2].x=2*random(6,8),player[2].y=2*random(6,8),player[2].HP=random(670000,1000000),player[2].hp=player[2].HP,player[2].attack=random(2700,4600),player[2].defence=random(750,900);
	player[3].x=3*random(6,8),player[3].y=3*random(6,8),player[3].HP=random(489000,730000),player[3].hp=player[3].HP,player[3].attack=random(3800,4700),player[3].defence=random(540,700);
	player[4].x=4*random(6,8),player[4].y=4*random(6,8);
	cout<<"操作方式:\n";
	cout<<"1.法师\n";
	cout<<"上移:W\n";
	cout<<"左移:A\n";
	cout<<"下移:S\n";
	cout<<"右移:D\n";
	cout<<"攻击:X\n";
	cout<<"技能:Q、E\n";
	cout<<"技能描述\n";
	cout<<"Q湮灭枷锁:对其他1~2名敌人造成300%attack伤害,并令第一个目标失去367~763点能量,如果还有其它玩家则令其中一人失去与之前一人总和1000点能量\n";
	cout<<"E自疗:立刻恢复350%~550%攻击的血量\n";
	cout<<"攻击范围:十字架攻击(同一行或同一列上的敌人受伤)\n";
	cout<<"特点:血量较高,攻击一般,防御一般,攻击范围较广,适合远战\n";
	cout<<"---------------------------------------------------------------------------\n";
	cout<<"2.坦克\n";
	cout<<"上移:I\n";
	cout<<"左移:J\n";
	cout<<"下移:K\n";
	cout<<"右移:L\n";
	cout<<"攻击:<,\n";
	cout<<"技能:U、O\n";
	cout<<"技能描述\n";
	cout<<"U毒雾:释放烟雾,对其它所有敌人造成350%attack伤害,并恢复伤害总量100%的生命\n";
	cout<<"O自疗:立刻恢复350%~550%攻击的血量\n";
	cout<<"攻击范围:周围10*10的小范围攻击\n";
	cout<<"特点:血量极高,攻击较低,防御较低,适合近战\n";
	cout<<"---------------------------------------------------------------------------\n";
	cout<<"3.射手\n";
	cout<<"上移:1\n";
	cout<<"左移:2\n";
	cout<<"下移:3\n";
	cout<<"右移:4\n";
	cout<<"攻击:5\n";
	cout<<"技能:6、7\n";
	cout<<"技能描述\n";
	cout<<"6斩杀:秒杀随机一名生命低于13%的敌人,如果没有,则对随机一名敌人造成360%attack真实伤害\n";
	cout<<"7自疗:立刻恢复350%~550%攻击的血量\n";
	cout<<"攻击范围:随机攻击场上任意一人\n";
	cout<<"特点:血量一般,防御较低,攻击一般,但是攻击范围较大\n"; 
	cout<<"---------------------------------------------------------------------------\n";
	for(i=1;i<=(m-'0'+1);i++)
	  {
	    printf("Player %d请选择(输入编号1~3)\n",i);
		do
		  l=_getch();
		while(l<'1'||l>'3'||choose[l-'0']);
		choose[l-'0']=1;
		ax[l-'0']=i;
	  }
	if (choose[3])
	  m='2';
	Sleep(2000);
	_getch();
	system("cls");
	win=PVP(m-'0'+1);
	printf("%d win!",ax[win]);
	Sleep(5000);
	system("cls");
	for(i=1;i<=n;i++)
	  {
	  	printf("Player %d\n",i);
	  	if (i==win)
	  	  printf("\b( WIN )\n");
	  	printf("输出:%d\n",player[ax[i]].sc);
	  	printf("治疗:%d\n",player[ax[i]].zl);
	  	printf("承伤:%d\n",player[ax[i]].cs);
	  	printf("---------------------------\n");
	  }
	Sleep(5000);
	return 0;
}

希望这次无bug...

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值