问题标题: 酷町堂:三国杀

0
1
已解决
汪恺恒
汪恺恒
中级启示者
中级启示者

自制三国杀

目前只支持杀,闪,桃,酒,无中生有,无懈可击,过河拆桥,顺手牵羊 ,万箭齐发,南蛮入侵,乐不思蜀,兵粮寸断

牌堆数据,游戏开始时全部复制到程序框内

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";
    }   
}

注意事项:

  1. 尽量不要乱输入,例如在请求输入数字时输入字符,可能会导致程序错误
  2. 由于本程序一些判定还不是很充分,所以尽量不要“拆”,“牵”,空手牌区或空判定区

摘自洛谷


2
已采纳
黄依成
黄依成
中级天翼
中级天翼

可以去做一下洛谷的猪国杀

0
0
廖睿轩
廖睿轩
新手光能
新手光能

欧皇啊!!!兄弟!!!大佬!!!

建议:不要老是选择

0
廖睿轩
廖睿轩
新手光能
新手光能

欧皇啊!!!兄弟!!!大佬!!!

建议:不要老是选择

0
廖睿轩
廖睿轩
新手光能
新手光能

欧皇啊!!!兄弟!!!大佬!!!

建议:不要老是选择

0
0
0
张帆
张帆
中级天翼
中级天翼

NB,

提个建议:玩家二电脑操作(这有点麻烦)

0
0
0
0
0
我要回答