上代码:
#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;
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;
}
}
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);
}
/*
攻击方式:
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,"|");
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<=24)
{
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);
}
for(i=1;i<=n;i++)
if (save[i])
break;
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;
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(389000,630000),player[3].hp=player[3].HP,player[3].attack=random(4800,6700),player[3].defence=random(540,700);
player[4].x=4*random(6,8),player[4].y=4*random(6,8);
cout<<"操作方式:\n";
cout<<"Player 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<<"Player 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<<"Player 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斩杀:秒杀随机一名生命低于24%的敌人,如果没有,则对随机一名敌人造成560%attack真实伤害\n";
cout<<"7自疗:立刻恢复350%~550%攻击的血量\n";
cout<<"攻击范围:随机攻击场上任意一人\n";
cout<<"特点:血量较低,防御较低,攻击极高,单挑无敌\n";
cout<<"---------------------------------------------------------------------------\n";
Sleep(2000);
_getch();
system("cls");
win=PVP(n);
printf("%d win!",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[i].sc);
printf("治疗:%d\n",player[i].zl);
printf("承伤:%d\n",player[i].cs);
printf("---------------------------\n");
}
Sleep(5000);
return 0;
}
万水千山总是情,给波三连行不行?