多人PVP小游戏

自创多人PVP小游戏,2人3人均可以,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;
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;
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值