0
已解决
汪恺恒
中级启示者
中级启示者
自制三国杀
目前只支持杀,闪,桃,酒,无中生有,无懈可击,过河拆桥,顺手牵羊 ,万箭齐发,南蛮入侵,乐不思蜀,兵粮寸断
牌堆数据,游戏开始时全部复制到程序框内
105
K 1 3
K 2 3
K 3 3
K 4 2
K 5 2
K 6 2
K 7 2
K 8 2
K 9 2
K 10 0
K 11 0
K 12 0
K 13 0
K 1 0
K 2 0
K 3 0
K 4 1
K 5 1
K 6 1
K 7 1
K 8 1
K 9 1
K 10 1
K 11 1
K 12 1
K 13 1
K 1 1
K 2 1
K 3 1
K 4 1
S 5 3
S 6 3
S 7 3
S 8 2
S 9 2
S 10 2
S 11 2
S 12 2
S 13 2
S 1 2
S 2 2
S 3 2
S 4 2
S 5 2
S 6 2
S 7 2
S 8 2
P 9 3
P 10 3
P 11 3
P 12 3
P 13 3
P 1 3
P 2 3
P 3 2
SQ 4 0
SQ 5 0
SQ 6 0
SQ 7 2
SQ 8 2
GC 9 0
GC 10 0
GC 11 0
GC 12 3
GC 13 1
GC 1 1
GC 2 1
WZ 3 3
WZ 4 3
WZ 5 3
WZ 10 3
NM 11 0
NM 12 0
NM 13 1
WJ 1 3
WX 2 2
WX 3 0
WX 4 1
WX 5 1
WX 6 0
WX 7 3
WX 8 3
LB 6 3
LB 7 0
LB 8 1
BL 9 0
BL 10 1
B 11 0
B 12 0
B 13 1
B 1 1
B 2 2
S 3 3
S 4 3
S 5 3
S 6 3
S 7 2
S 8 2
S 9 2
S 10 2
S 11 2
P 12 3
P 13 3
P 1 2
P 2 2
程序↓
#include<bits/stdc++.h>
using namespace std;
#include<cstring>
#include<cstdlib>
struct card{
int number,color;
string kind;
};
//
//K杀 S闪 P桃
//WZ无中生有 WX无懈可击
//B酒
//GC过河拆桥 SQ顺手牵羊
//WJ万箭齐发 NM南蛮入侵 LB乐不思蜀 BL兵粮寸断
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 if(hd[x][choose].kind!="P"&&hd[x][choose].kind!="B")cout<<"请出一张桃或酒!\n";
else break;
}
if(choose==0)break;
bl[x]++;
qpd[qget]=hd[x][choose];
qget++;
hd[x][choose]=null;
qy(x);
mn[x]--;
if(bl[x]<1)
{
printf("你还需%d张桃或酒...\n",1-bl[x]);
printf("是否继续出桃或酒?Y--是 其他键--否\n");
char bsch=getchar();
if(bsch!='Y');
break;
}
else return;
}
}
bool wx(int a)
{
bool sb_use_wx=true;
for(int ii=a+1;ii<=a+pn;ii++)
{
int ask=(ii-1)%pn+1;
system("pause");
system("cls");
printf("请玩家%d操作\n",ask);
system("pause");
system("cls");
printf("玩家%d的无懈可击将生效,是否出无懈可击?\n",a);
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!="WX")cout<<"请出一张无懈可击!\n";
else break;
}
if(choose!=0)
{
qpd[qget]=hd[ask][choose];
qget++;
hd[ask][choose]=null;
qy(ask);
mn[ask]--;
sb_use_wx=!(wx(ask));
break;
}
}
return sb_use_wx;
}
void chos_gc_sq(int a,int b,int cdkd)
{
if(mn[b]==0&&mnpd[b]==0)
{
printf("哦不,对方已经没有牌了!\n");
return;
}
printf("玩家%d请选择要",a);
if(cdkd==1)cout<<"过河拆桥";
else cout<<"顺手牵羊";
printf("玩家%d的牌\n",b);
unshow(b);
showpdq(b);
int kindd;
while(1)
{
printf("\n输入你要");
if(cdkd==1)cout<<"过河拆桥";
else cout<<"顺手牵羊";
printf("玩家%d的牌型(1,手牌2,判定区的牌)\n",b);
cin>>kindd;
if(kindd<1||kindd>2)cout<<"牌型不存在!\n";
else break;
}
if(kindd==1)
{
unshow(b);
int choose;
while(1)
{
printf("\n输入你要");
if(cdkd==1)cout<<"过河拆桥";
else cout<<"顺手牵羊";
printf("玩家%d的牌号\n",b);
cin>>choose;
if(choose<1||choose>mn[b])cout<<"牌号不存在!\n";
else break;
}
if(cdkd==1)
{
printf("你弃置了玩家%d的:",b);
cout<<cl[hd[b][choose].color]<<hd[b][choose].number<<" ";
string cki=hd[b][choose].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");
qpd[qget]=hd[b][choose];
qget++;
hd[b][choose]=null;
qy(b);
mn[b]--;
}
else
{
printf("你得到了玩家%d的:",b);
cout<<cl[hd[b][choose].color]<<hd[b][choose].number<<" ";
string cki=hd[b][choose].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");
mn[a]++;
hd[a][mn[a]]=hd[b][choose];
qy(a);
hd[b][choose]=null;
qy(b);
mn[b]--;
}
}
else if(kindd==2)
{
showpdq(b);
int choose;
while(1)
{
printf("\n输入你要");
if(cdkd==1)cout<<"过河拆桥";
else cout<<"顺手牵羊";
printf("玩家%d的牌号\n",b);
cin>>choose;
if(choose<1||choose>mnpd[b])cout<<"牌号不存在!\n";
else break;
}
if(cdkd==1)
{
printf("你弃置了玩家%d的:",b);
cout<<cl[pdq[b][choose].color]<<pdq[b][choose].number<<" ";
string cki=pdq[b][choose].kind;
if(cki=="LB")cout<<"乐不思蜀";
else if(cki=="BL")cout<<"兵粮寸断";
printf("\n");
qpd[qget]=pdq[b][choose];
qget++;
pdq[b][choose]=null;
qypd(b);
mnpd[b]--;
}
else
{
printf("你得到了玩家%d的:",b);
cout<<cl[pdq[b][choose].color]<<pdq[b][choose].number<<" ";
string cki=pdq[b][choose].kind;
if(cki=="LB")cout<<"乐不思蜀";
else if(cki=="BL")cout<<"兵粮寸断";
printf("\n");
mn[a]++;
hd[a][mn[a]]=pdq[b][choose];
qy(a);
pdq[b][choose]=null;
qy(b);
mnpd[b]--;
}
}
}
void gc_sq(int a,int b,int cdkd)
{
for(int ii=a+1;ii<=a+pn;ii++)
{
int ask=(ii-1)%pn+1;
printf("请玩家%d操作\n",ask);
system("pause");
system("cls");
printf("玩家%d将对玩家%d使用一张",a,b);
if(cdkd==1)cout<<"过河拆桥";
else cout<<"顺手牵羊";
printf(",是否出无懈可击?\n");
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!="WX")cout<<"请出一张无懈可击!\n";
else break;
}
if(hd[ask][choose].kind=="WX")
{
qpd[qget]=hd[ask][choose];
qget++;
hd[ask][choose]=null;
qy(ask);
mn[ask]--;
if(wx(ask))
{
printf("玩家%d的",a);
if(cdkd==1)cout<<"过河拆桥";
else cout<<"顺手牵羊";
printf("被无懈可击了!\n");
system("pause");
system("cls");
printf("请玩家%d操作\n",a);
return;
}
}
}
printf("请玩家%d操作\n",a);
system("pause");
system("cls");
chos_gc_sq(a,b,cdkd);
system("pause");
system("cls");
printf("请玩家%d操作\n",a);
return;
}
void wz(int a)
{
for(int ii=a+1;ii<=a+pn;ii++)
{
int ask=(ii-1)%pn+1;
printf("请玩家%d操作\n",ask);
system("pause");
system("cls");
printf("玩家%d将使用一张无中生有,是否出无懈可击?\n",a);
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!="WX")cout<<"请出一张无懈可击!\n";
else break;
}
if(hd[ask][choose].kind=="WX")
{
qpd[qget]=hd[ask][choose];
qget++;
hd[ask][choose]=null;
qy(ask);
mn[ask]--;
if(wx(ask))
{
printf("玩家%d的无中生有被无懈可击了!\n",a);
system("pause");
system("cls");
printf("请玩家%d操作\n",a);
return;
}
else
{
printf("玩家%d通过无中生有获得两张牌\n",a);
give(a,2);
system("pause");
system("cls");
printf("请玩家%d操作\n",a);
return;
}
break;
}
printf("玩家%d通过无中生有获得两张牌\n",a);
give(a,2);
system("pause");
system("cls");
printf("请玩家%d操作\n",a);
return;
}
}
void kill(int a,int b,int hurt)
{
printf("请玩家%d操作\n",b);
system("pause");
system("cls");
printf("玩家%d被玩家%d伤害为%d的 杀 指定了,请出一张闪\n",b,a,hurt);
show(b);
int choose=0;//用闪闪避杀
while(1)
{
cout<<"\n输入你要使用的闪的牌号,不出则输入0\n";
cin>>choose;
if(choose<0||choose>mn[b])cout<<"牌号不存在!\n";
else if(choose==0)break;
else if(hd[b][choose].kind!="S")cout<<"请出一张闪!\n";
else break;
}
if(hd[b][choose].kind=="S")
{
mn[b]--;
qpd[qget]=hd[b][choose];
qget++;
hd[b][choose]=null;
qy(b);
printf("玩家%d闪避了玩家%d的杀\n",b,a);
system("pause");
system("cls");
printf("请玩家%d操作\n",a);
return;
}
else
{
printf("玩家%d未能闪避玩家%d的杀,受到%d点伤害!\n",b,a,hurt);
bl[b]-=hurt;
printf("玩家%d剩余血量:",b);
cout<<bl[b];
if(bl[b]<1)
{
near_die(b);
if(bl[b]<1)pl_zt[b]=-1;
int sr=0;
for(int ii=1;ii<=pn;ii++)
if(pl_zt[ii]==-1)sr++;
if(sr==pn-1)
{
for(int ii=1;ii<=pn;ii++)
if(pl_zt[ii]!=-1)
{
winner=ii;
break;
}
return;
}
}
printf("\n");
printf("请玩家%d操作\n",a);
system("pause");
system("cls");
return;
}
printf("\n");
}
void each_wj_nm(int a,int b,int wic)
{
for(int ii=a+1;ii<=a+pn;ii++)
{
int ask=(ii-1)%pn+1;
printf("请玩家%d操作\n",ask);
system("pause");
system("cls");
if(wic==1)
printf("玩家%d将对玩家%d使用一张万箭齐发,是否出无懈可击?\n",a,b);
else
printf("玩家%d将对玩家%d使用一张南蛮入侵,是否出无懈可击?\n",a,b);
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!="WX")cout<<"请出一张无懈可击!\n";
else break;
}
if(hd[ask][choose].kind=="WX")
{
qpd[qget]=hd[ask][choose];
qget++;
hd[ask][choose]=null;
qy(ask);
mn[ask]--;
if(wx(ask))
{
if(wic==1)
printf("玩家%d的万箭齐发被无懈可击了!\n",a);
else
printf("玩家%d的南蛮入侵被无懈可击了!\n",a);
system("pause");
system("cls");
return;
}
break;
}
}
printf("请玩家%d操作\n",b);
system("pause");
system("cls");
if(wic==1)
printf("玩家%d被玩家%d的 万箭齐发 指定了,请出一张闪\n",b,a);
else
printf("玩家%d被玩家%d的 南蛮入侵 指定了,请出一张杀\n",b,a);
show(b);
int choose=0;//用闪闪避杀
while(1)
{
if(wic==1)
cout<<"\n输入你要使用的闪的牌号,不出则输入0\n";
else
cout<<"\n输入你要使用的闪的牌号,不出则输入0\n";
cin>>choose;
if(choose<0||choose>mn[b])cout<<"牌号不存在!\n";
else if(choose==0)break;
else if(hd[b][choose].kind!="S"&&wic==1)cout<<"请出一张闪!\n";
else if(hd[b][choose].kind!="K"&&wic==2)cout<<"请出一张杀!\n";
else break;
}
if(hd[b][choose].kind=="S"||hd[b][choose].kind=="K")
{
mn[b]--;
qpd[qget]=hd[b][choose];
qget++;
hd[b][choose]=null;
qy(b);
printf("玩家%d闪避了玩家%d的",b,a);
if(wic==1)printf("万箭齐发\n");
else printf("南蛮入侵\n");
system("pause");
system("cls");
return;
}
else
{
if(wic==1)
printf("玩家%d未能闪避玩家%d的万箭齐发,受到1点伤害!\n",b,a);
else
printf("玩家%d未能闪避玩家%d的南蛮入侵,受到1点伤害!\n",b,a);
bl[b]-=1;
printf("玩家%d剩余血量:",b);
cout<<bl[b];
if(bl[b]<1)
{
near_die(b);
if(bl[b]<1)pl_zt[b]=-1;
int sr=0;
for(int ii=1;ii<=pn;ii++)
if(pl_zt[ii]==-1)sr++;
if(sr==pn-1)
{
for(int ii=1;ii<=pn;ii++)
if(pl_zt[ii]!=-1)
{
winner=ii;
break;
}
return;
}
}
printf("\n");
system("pause");
system("cls");
return;
}
printf("\n");
}
void wj_nm(int a,int wic)
{
for(int ii=a+1;ii<a+pn;ii++)
{
int ask=(ii-1)%pn+1;
each_wj_nm(a,ask,wic);
}
}
card get_pdcard()
{
card pdcard=pd[gett];
gett++;
qpd[qget]=pdcard;
qget++;
return pdcard;
}
void c_lb(int b,card pushin)
{
pdq[b][mnpd[b]]=pushin;
mnpd[b]++;
}
void c_bl(int b,card pushin)
{
pdq[b][mnpd[b]]=pushin;
mnpd[b]++;
}
bool lb_sx(int a)
{
for(int ii=a+1;ii<=a+pn;ii++)
{
int ask=(ii-1)%pn+1;
printf("请玩家%d操作\n",ask);
system("pause");
system("cls");
printf("玩家%d的乐不思蜀将判定,是否出无懈可击?\n",a);
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!="WX")cout<<"请出一张无懈可击!\n";
else break;
}
if(hd[ask][choose].kind=="WX")
{
qpd[qget]=hd[ask][choose];
qget++;
hd[ask][choose]=null;
qy(ask);
mn[ask]--;
if(wx(ask))
{
printf("玩家%d的乐不思蜀被无懈可击了!\n",a);
system("pause");
system("cls");
printf("请玩家%d操作\n",a);
return true;
}
break;
}
}
card wdf=get_pdcard();
printf("玩家%d乐不思蜀的判定牌:",a);
cout<<cl[wdf.color]<<wdf.number<<" ";
string cki=wdf.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");
if(wdf.color==3)
{
printf("失效\n");
return true;
}
else
{
printf("生效\n");
return false;
}
}
bool bl_sx(int a)
{
for(int ii=a+1;ii<=a+pn;ii++)
{
int ask=(ii-1)%pn+1;
printf("请玩家%d操作\n",ask);
system("pause");
system("cls");
printf("玩家%d的兵粮寸断将判定,是否出无懈可击?\n",a);
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!="WX")cout<<"请出一张无懈可击!\n";
else break;
}
if(hd[ask][choose].kind=="WX")
{
qpd[qget]=hd[ask][choose];
qget++;
hd[ask][choose]=null;
qy(ask);
mn[ask]--;
if(wx(ask))
{
printf("玩家%d的兵粮寸断被无懈可击了!\n",a);
system("pause");
system("cls");
printf("请玩家%d操作\n",a);
return true;
}
break;
}
}
card wdf=get_pdcard();
printf("玩家%d兵粮寸断的判定牌:",a);
cout<<cl[wdf.color]<<wdf.number<<" ";
string cki=wdf.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");
if(wdf.color==1)
{
printf("失效\n");
return true;
}
else
{
printf("生效\n");
return false;
}
}
bool findpd(int a,string fkin)
{
for(int iii=1;iii<mnpd[a];iii++)
if(pdq[a][iii].kind==fkin)return true;
return false;
}
int main()
{
srand(time(NULL));
null.color=null.number=-1;
null.kind="0";
cin>>n;
for(int i=1;i<=n;i++)
cin>>pd[i].kind>>pd[i].number>>pd[i].color;//输入牌堆
wash();//洗牌
for(int i=1;i<=pn;i++)
{
bl[i]=4;
mnpd[i]=1;
}
for(int i=1;i<=pn;i++)
give(i,4);//初始化
while(1)
{
for(int player=1;player<=pn;player++)
{
//玩家回合
printf("现在是玩家%d的回合,请玩家%d使用\n",player,player);
system("pause");
bool have_pd=true;
if(mnpd[player]==1)have_pd=false;
bool can_mp=true,can_cp=true;
for(int chepd=1;chepd<mnpd[player];chepd++)//判定阶段
{
if(pdq[player][chepd].kind=="LB")can_cp=lb_sx(player);
if(pdq[player][chepd].kind=="BL")can_mp=bl_sx(player);
qpd[qget]=pdq[player][chepd];
qget++;
pdq[player][chepd]=null;
}
mnpd[player]=1;
if(have_pd)
system("pause");
system("cls");
if(can_mp)
give(player,2);//摸牌阶段
else
{
printf("玩家%d的摸牌阶段被跳过了!\n",player);
}
printf("\n");
use=true;
if(can_cp)
while(1)
{
int choose=-3;//出牌阶段
while(1)
{
show(player);
cout<<"\n输入你要使用的牌号,再次查看请输入0,不出请输入-1,查看他人数据输入-2\n";
cin>>choose;
if(choose<-2||choose>mn[player])cout<<"牌号不存在!\n";
else if(choose==0)
{
system("cls");
show(player);
printf("\n");
}
else if(choose==-1)break;
else if(choose==-2)show_beside(player);
else if(hd[player][choose].kind=="WX")cout<<"无懈可击不能直接使用!\n";
else if(hd[player][choose].kind=="S")cout<<"闪不能直接使用!\n";
else if(hd[player][choose].kind=="P"&&bl[player]==4)cout<<"桃不能在满血量时使用!\n";
else if(hd[player][choose].kind=="K"&&use==false)cout<<"本回合已经不能再用杀了\n";
else if(hd[player][choose].kind=="B"&&beer[player]==true)cout<<"在酒状态时不能用酒!\n";
else if(hd[player][choose].kind=="GC"&&mn[3-player]==0)cout<<"对方无牌可拆!\n";
else if(hd[player][choose].kind=="SQ"&&mn[3-player]==0)cout<<"对方无牌可牵!\n";
else if(hd[player][choose].kind=="LB"&&findpd(3-player,"LB")==true)cout<<"同一玩家判定区域内不能同时有两张同名牌!\n";
else if(hd[player][choose].kind=="BL"&&findpd(3-player,"BL")==true)cout<<"同一玩家判定区域内不能同时有两张同名牌!\n";
else break;
}
if(choose==-1)break;
else if(hd[player][choose].kind=="B")
{
beer[player]=true;
mn[player]--;
qpd[qget]=hd[player][choose];
qget++;
hd[player][choose]=null;
qy(player);
}
else if(hd[player][choose].kind=="P")
{
mn[player]--;
qpd[qget]=hd[player][choose];
qget++;
hd[player][choose]=null;
qy(player);
bl[player]++;
printf("玩家%d回复体力至%d\n",player,bl[player]);
}
else if(hd[player][choose].kind=="K")
{
system("cls");
mn[player]--;
qpd[qget]=hd[player][choose];
qget++;
hd[player][choose]=null;
qy(player);
kill(player,3-player,1+beer[player]);
beer[player]=false;
use=false;
if(winner!=0)break;
}
else if(hd[player][choose].kind=="WZ")
{
mn[player]--;
qpd[qget]=hd[player][choose];
qget++;
hd[player][choose]=null;
qy(player);
wz(player);
}
else if(hd[player][choose].kind=="GC")
{
mn[player]--;
qpd[qget]=hd[player][choose];
qget++;
hd[player][choose]=null;
qy(player);
gc_sq(player,3-player,1);
}
else if(hd[player][choose].kind=="SQ")
{
mn[player]--;
qpd[qget]=hd[player][choose];
qget++;
hd[player][choose]=null;
qy(player);
gc_sq(player,3-player,2);
}
else if(hd[player][choose].kind=="WJ")
{
system("cls");
mn[player]--;
qpd[qget]=hd[player][choose];
qget++;
hd[player][choose]=null;
qy(player);
wj_nm(player,1);
if(winner!=0)break;
}
else if(hd[player][choose].kind=="NM")
{
system("cls");
mn[player]--;
qpd[qget]=hd[player][choose];
qget++;
hd[player][choose]=null;
qy(player);
wj_nm(player,2);
if(winner!=0)break;
}
else if(hd[player][choose].kind=="LB")
{
system("cls");
mn[player]--;
c_lb(3-player,hd[player][choose]);
hd[player][choose]=null;
qy(player);
}
else if(hd[player][choose].kind=="BL")
{
system("cls");
mn[player]--;
c_bl(3-player,hd[player][choose]);
hd[player][choose]=null;
qy(player);
}
system("pause");
system("cls");
if(winner!=0)break;
}
else
{
printf("玩家%d的出牌阶段被跳过了!\n",player);
}
if(winner!=0)break;
beer[player]=false;
printf("玩家%d的出牌阶段结束了\n",player);
system("pause");
system("cls");
//弃牌阶段
if(mn[player]>bl[player])
{
int thr=mn[player]-bl[player];
printf("玩家%d请弃置%d张牌\n",player,thr);
system("pause");
system("cls");
for(int ii=1;ii<=thr;ii++)
{
while(1)
{
show(player);
int choose;
cout<<"\n输入你要弃置的牌号\n";
cin>>choose;
if(choose<0||choose>mn[player])cout<<"牌号不存在!\n";
else
{
mn[player]--;
qpd[qget]=hd[player][choose];
qget++;
hd[player][choose]=null;
qy(player);
if(ii<thr)printf("弃牌成功,还需弃置%d张牌\n",thr-ii);
else printf("弃牌成功\n");
break;
}
}
system("pause");
system("cls");
}
}
//结束阶段
}
}
system("cls");
for(int j=1;j<=3;j++)
{
for(int i=1;i<=20;i++)
{
cout<<"=";
_sleep(50);
}
cout<<"\n";
}
dunprint("玩家%d赢得了三国杀的胜利!!\n");
for(int j=1;j<=3;j++)
{
for(int i=1;i<=20;i++)
{
cout<<"=";
_sleep(50);
}
cout<<"\n";
}
}
注意事项:
- 尽量不要乱输入,例如在请求输入数字时输入字符,可能会导致程序错误
- 由于本程序一些判定还不是很充分,所以尽量不要“拆”,“牵”,空手牌区或空判定区
摘自洛谷
2
0
0
0
0
0
0
李显晨
中级启示者
中级启示者
0
0
0
0
汪宇航
新手启示者
新手启示者
https://wenda.codingtang.com/questions/12993/
@汪恺恒 ,能帮我一下吗???
0
0