三国杀小游戏
代码如下
#include<bits/stdc++.h>
using namespace std;
#include<cstring>
#include<cstdlib>
struct card{
int number,color;
string kind;
};
// 更新时间
//K杀 S闪 P桃 2021/3/13
//WZ无中生有 WX无懈可击 2021/3/20
//B酒 2021/3/24
//GC过河拆桥 SQ顺手牵羊 2021/3/27
//WJ万箭齐发 NM南蛮入侵 LB乐不思蜀 BL兵粮寸断 2021/4/03
card null;
bool use;
int bl[5];//血量
card hd[5][20];//手牌
card pdq[5][20];//判定区的牌
int mn[5];//手牌数
int mnpd[5];//判定区牌数
card pd[1000];//牌堆
int gett=1;//摸到第几张
card qpd[1000];//弃牌堆
int qget=1;
int n;
char cl[5]={
6,5,4,3};
bool beer[5];
int pn=2;//玩家数量
int pl_zt[15];//玩家状态,0正常,-1死亡,1横置,2翻面
int winner=0;
void dunprint(string s)
{
for(int i=0;i<s.size();i++)
{
printf("%c",s[i]);
_sleep(50);
}
}
void scpd()
{
for(int i=gett;i<=n;i++)
cout<<pd[i].kind<<' '<<pd[i].number<<' '<<pd[i].color<<"\n";
}
void wash()
{
gett=1;
for(int i=1;i<=n;i++)
{
if(pd[i].kind!="0")
qpd[qget]=pd[i];
qget++;
}
for(int i=1;i<=n;i++)
pd[i]=qpd[i];
qget=1;
for(int i=1;i<=n*n;i++)//洗牌
{
card t;
int swap_1=rand()%n+1,swap_2=rand()%n+1;
swap(pd[swap_1],pd[swap_2]);
}
}
void give(int who,int x)
{
if(n-gett+1<x)wash();
for(int i=1;i<=x;i++)
{
hd[who][mn[who]+1]=pd[gett];
pd[gett]=null;
gett++;
mn[who]++;
}
}
void qy(int x)
{
for(int i=1;i<=mn[x];i++)
for(int j=1;j<=mn[x];j++)
{
if(hd[x][j].kind=="0")
swap(hd[x][j],hd[x][j+1]);
}
}
void qypd(int x)
{
for(int i=1;i<=mnpd[x];i++)
for(int j=1;j<=mnpd[x];j++)
{
if(pdq[x][j].kind=="0")
swap(pdq[x][j],pdq[x][j+1]);
}
}
void showpdq(int x);
void show_beside(int x)
{
for(int i=1;i<=pn;i++)
{
if(i!=x)
{
printf("玩家%d: 手牌数%d 血量%d\n",i,mn[i],bl[i]);
showpdq(i);
}
}
system("pause");
system("cls");
return;
}
void unshow(int x)
{
printf("手牌区:\n");
for(int i=1;i<=mn[x];i++)
printf("%d. 不展示\n",i);
}
void showpdq(int x)
{
printf("判定区:\n");
for(int i=1;i<mnpd[x];i++)
{
cout<<i<<"."<<' '<<cl[pdq[x][i].color]<<pdq[x][i].number<<" ";
if(pdq[x][i].kind=="LB")cout<<"乐不思蜀";
else if(pdq[x][i].kind=="BL")cout<<"兵粮寸断";
printf("\n");
}
}
void show(int x)
{
printf("玩家%d操作中...\n",x);
if(beer[x])
{
printf("你当前处于酒状态,使用的杀伤害+1\n");
}
cout<<"牌堆剩余牌数:"<<n-mn[1]-mn[2]-qget+1;
printf("\n\n");
cout<<"血量:"<<bl[x];
printf("\n");
cout<<"手牌数:"<<mn[x];
printf("\n");
for(int i=1;i<=mn[x];i++)
{
cout<<i<<"."<<' '<<cl[hd[x][i].color]<<hd[x][i].number<<" ";
string cki=hd[x][i].kind;
if(cki=="K")cout<<"杀";
else if(cki=="S")cout<<"闪";
else if(cki=="P")cout<<"桃";
else if(cki=="WZ")cout<<"无中生有";
else if(cki=="WX")cout<<"无懈可击";
else if(cki=="B")cout<<"酒";
else if(cki=="GC")cout<<"过河拆桥";
else if(cki=="SQ")cout<<"顺手牵羊";
else if(cki=="WJ")cout<<"万箭齐发";
else if(cki=="NM")cout<<"南蛮入侵";
else if(cki=="LB")cout<<"乐不思蜀";
else if(cki=="BL")cout<<"兵粮寸断";
printf("\n");
}
}
void near_die(int x)
{
bool live=false;
for(int ii=x+1;ii<x+pn;ii++)
{
int ask=(ii-1)%pn+1;
printf("请玩家%d操作\n",ask);
system("pause");
system("cls");
printf("玩家%d进入濒死状态,需要%d张桃,是否出桃?\n",x,1-bl[x]);
while(1)
{
system("pause");
system("cls");
show(ask);
int choose;
while(1)
{
cout<<"\n输入你要使用的桃的牌号,不出则输入0\n";
cin>>choose;
if(choose<0||choose>mn[ask])cout<<"牌号不存在!\n";
else if(choose==0)break;
else if(hd[ask][choose].kind!="P")cout<<"请出一张桃!\n";
else break;
}
if(choose==0)break;
bl[x]++;
qpd[qget]=hd[ask][choose];
qget++;
hd[ask][choose]=null;
qy(ask);
mn[ask]--;
if(bl[x]<1)
{
printf("玩家%d还需%d张桃...\n",x,1-bl[x]);
printf("是否继续出桃?Y--是 其他键--否\n");
char bsch=getchar();
if(bsch!='Y');
break;
}
else return;
}
}
printf("请玩家%d操作\n",x);
system("pause");
system("cls");
printf("你进入濒死状态,需要%d张桃或酒,是否出桃或酒?\n",1-bl[x]);
while(1)
{
system("pause");
system("cls");
show(x);
int choose;
while(1)
{
cout<<"\n输入你要使用的桃或酒的牌号,不出则输入0\n";
cin>>choose;
if(choose<0||choose>mn[x])cout<<"牌号不存在!\n";
else if(choose==0)break;
else