「三国杀」

#include <iostream>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
struct pai {
    int paifu;
    int huase;
    int yanse;
    int dianshu;
    int leixing;
    int changdu;
    void Kanpai() {
        if (paifu == 0 || paifu == 1);
        else
            printf("牌副参数错误!\n");

        switch (huase) {
        case 0:
            cout << "黑桃";
            break;

        case 1:
            cout << "红桃";
            break;

        case 2:
            cout << "草花";
            break;

        case 3:
            cout << "方片";
            break;

        case -1:
            cout << "无色";
            break;

        default:
            printf("花色错误!\n");
            break;
        }

        switch (dianshu) {
        case 0:
            cout << "A ";
            break;

        case 1:
            cout << "2 ";
            break;

        case 2:
            cout << "3 ";
            break;

        case 3:
            cout << "4 ";
            break;

        case 4:
            cout << "5 ";
            break;

        case 5:
            cout << "6 ";
            break;

        case 6:
            cout << "7 ";
            break;

        case 7:
            cout << "8 ";
            break;

        case 8:
            cout << "9 ";
            break;

        case 9:
            cout << "10 ";
            break;

        case 10:
            cout << "J ";
            break;

        case 11:
            cout << "Q ";
            break;

        case 12:
            cout << "K ";
            break;

        case -1:
            cout << "无点数";
            break;

        default:
            printf("点数错误!\n");
            break;
        }

        switch (leixing) {
        case 101:
            cout << "【杀】" << endl;
            break;

        case 102:
            cout << "【闪】" << endl;
            break;

        case 103:
            cout << "【桃】" << endl;
            break;

        case 201:
            cout << "【过河拆桥】" << endl;
            break;

        case 202:
            cout << "【顺手牵羊】" << endl;
            break;

        case 203:
            cout << "【无中生有】" << endl;
            break;

        case 204:
            cout << "【决斗】" << endl;
            break;

        case 205:
            cout << "【借刀杀人】" << endl;
            break;

        case 206:
            cout << "【桃园结义】" << endl;
            break;

        case 207:
            cout << "【五谷丰登】" << endl;
            break;

        case 208:
            cout << "【南蛮入侵】" << endl;
            break;

        case 209:
            cout << "【万箭齐发】" << endl;
            break;

        case 210:
            cout << "【无懈可击】" << endl;
            break;

        case 251:
            cout << "【乐不思蜀】" << endl;
            break;

        case 252:
            cout << "【闪电】" << endl;
            break;

        case 301:
            cout << "【诸葛连弩(1)】" << endl;
            break;

        case 302:
            cout << "【雌雄双股剑(2)】" << endl;
            break;

        case 303:
            cout << "【青釭剑(2)】" << endl;
            break;

        case 304:
            cout << "【青龙偃月刀(3)】" << endl;
            break;

        case 305:
            cout << "【丈八蛇矛(3)】" << endl;
            break;

        case 306:
            cout << "【贯石斧(3)】" << endl;
            break;

        case 307:
            cout << "【方天画戟(4)】" << endl;
            break;

        case 308:
            cout << "【麒麟弓(5)】" << endl;
            break;

        case 331:
            cout << "【八卦阵】" << endl;
            break;

        case 361:
            cout << "【赤兔(-1)】" << endl;
            break;

        case 362:
            cout << "【大宛(-1)】" << endl;
            break;

        case 363:
            cout << "【紫辛(-1)】" << endl;
            break;

        case 381:
            cout << "【爪黄飞电(+1)】" << endl;
            break;

        case 382:
            cout << "【的卢(+1)】" << endl;
            break;

        case 383:
            cout << "【绝影(+1)】" << endl;
            break;

        default:
            printf("类型参数错误!");
            break;
        }
    }
};
void Qishixipai(pai A[2][4][13], pai paidui[104]) {
    int i, m, x, y, z, a[104] = {0};
    srand((unsigned)time(NULL));

    for (i = 1; i <= 104; i++) {
        while (a[m = rand() % 104]);

        a[m] = i;
    }

    for (i = 0; i <= 103; i++) {
        x = (a[i] - 1) / 52;
        y = ((a[i] - 1) - 52 * x) / 13;
        z = (a[i] - 1) % 13;
        paidui[i] = A[x][y][z];
    }
}
void Xipai(pai paidui[104], int *paiduishu, pai qipaidui[104], int *qipaishu) {
    int i, m, a[104] = {0};
    srand((unsigned)time(NULL));

    for (i = 1; i <= (*qipaishu); i++) {
        while (a[m = rand() % (*qipaishu)]);

        a[m] = i;
    }

    for (i = 0; i <= ((*qipaishu) - 1); i++) {
        paidui[i] = qipaidui[a[i]];
        qipaidui[a[i]].leixing = -1;
        (*paiduishu)++;
        (*qipaishu)--;
    }

    for (i = (*paiduishu); i <= 103; i++)
        paidui[i].leixing = -1;
}
pai Mo1pai(pai A[104], int *x, pai B[104], int *y, int *b) {
    pai p;

    if ((*x) == 0)
        Xipai(A, x, B, y);
    else if ((*x) < 0)
        printf("摸牌参数错误!");
    else;

    p = A[104 - (*x)];
    (*x)--;
    (*b)++;
    return (p);
}
struct wujiang {
    char name;
    int tili;
    int tilishangxian;
    int shoupaishangxian;
    int huihekaishi;
    int panding;
    int mopai;
    int chupai;
    int qipai;
    int huihejieshu;
    int juese;
    pai shoupai[20];
    int shoupaishu;
    pai zhuangbei[4];
    int zhuangbeishu;
    pai pandingpai[3];
    int pandingshu;
    int juli[1];
    void Kanshoupai() {
        printf("玩家当前手牌:\n");

        if (shoupaishu) {
            int m;

            for (m = 0; m <= (shoupaishu - 1); m++) {
                printf("%d ", m);
                (shoupai[m]).Kanpai();
            }
        } else
            printf("空城!\n");

        printf("\n");
    }
    void Kanzhuangbei() {
        if (juese)
            printf("玩家");
        else
            printf("电脑");

        printf("当前装备:\n");
        printf("0 武器: ");

        if ((zhuangbei[0]).leixing == -1)
            printf("空\n");
        else (zhuangbei[0]).Kanpai();

        printf("1 防具: ");

        if ((zhuangbei[1]).leixing == -1)
            printf("空\n");
        else (zhuangbei[1]).Kanpai();

        printf("2 进攻马: ");

        if ((zhuangbei[2]).leixing == -1)
            printf("空\n");
        else (zhuangbei[2]).Kanpai();

        printf("3 防御马: ");

        if ((zhuangbei[3]).leixing == -1)
            printf("空\n");
        else (zhuangbei[3]).Kanpai();

        printf("\n");
    }
    void Kanpandingpai() {
        if (juese)
            printf("玩家");
        else
            printf("电脑");

        printf("当前判定区:\n");

        if ((pandingpai[0]).leixing == -1)
            printf("空\n");
        else {
            printf("0 ");
            (pandingpai[0]).Kanpai();

            if ((pandingpai[1]).leixing == -1);
            else {
                printf("1 ");
                (pandingpai[1]).Kanpai();

                if ((pandingpai[2]).leixing == -1);
                else {
                    printf("2 ");
                    (pandingpai[2]).Kanpai();
                }
            }
        }
    }
};
void Mopai(int *shoupaishu, pai shoupai[20], pai A[104], int *x, pai B[104], int *y, int juese) {
    if (juese)
        printf("玩家从牌堆摸2张牌\n");
    else
        printf("电脑从牌堆摸2张牌\n");

    pai p;
    p = Mo1pai(A, x, B, y, shoupaishu);
    shoupai[*shoupaishu - 1] = p;
    pai q;
    q = Mo1pai(A, x, B, y, shoupaishu);
    shoupai[*shoupaishu - 1] = q;
    int m;

    if (juese) {
        printf("玩家当前手牌:\n");

        for (m = 0; m <= (*shoupaishu - 1); m++) {
            printf("%d ", m);
            (shoupai[m]).Kanpai();
        }
    }

    printf("牌堆还剩%d张牌!\n\n", *x);
}
void Qishishoupai(wujiang *w, pai A[104], int *x, pai B[104], int *y) {
    pai a;
    a = Mo1pai(A, x, B, y, &((*w).shoupaishu));
    (*w).shoupai[(*w).shoupaishu - 1] = a;
    pai b;
    b = Mo1pai(A, x, B, y, &((*w).shoupaishu));
    (*w).shoupai[(*w).shoupaishu - 1] = b;
    pai c;
    c = Mo1pai(A, x, B, y, &((*w).shoupaishu));
    (*w).shoupai[(*w).shoupaishu - 1] = c;
    pai d;
    d = Mo1pai(A, x, B, y, &((*w).shoupaishu));
    (*w).shoupai[(*w).shoupaishu - 1] = d;
    int m;

    if ((*w).juese)
        printf("玩家从牌堆摸4张牌\n");
    else
        printf("电脑从牌堆摸4张牌\n");

    if ((*w).juese) {
        printf("玩家当前手牌:\n");

        for (m = 0; m <= ((*w).shoupaishu - 1); m++) {
            printf("%d ", m);
            ((*w).shoupai[m]).Kanpai();
        }
    }

    printf("牌堆还剩%d张牌!\n\n", *x);
}
void Panding(pai paidui[104], int *paiduishu, pai qipaidui[104], int *qipaishu) {
    paidui[*paiduishu].Kanpai();
    qipaidui[*qipaishu] = paidui[*paiduishu];
    (*paiduishu)--;
    (*qipaishu)++;
}
pai Zhangba(wujiang *w, pai qipaidui[104], int *qipaishu) {
    int x, y;
    pai p;

    for (;;) {
        int i, j;
        printf("请输入任意两张手牌之前的编号,以空格隔开,以回车结束!\n");
        scanf("%d", &x);
        scanf("%d", &y);

        if ((x >= 0) && (x < (*w).shoupaishu) && (y >= 0) && (y < (*w).shoupaishu - 1)) {
            switch ((((*w).shoupai[x].huase) % 2) + (((*w).shoupai[y].huase) % 2)) {
            case 0:
                p.yanse = 0;
                break;

            case 2:
                p.yanse = 1;
                break;

            case 1:
                p.yanse = 2;
                break;

            default:
                printf("【丈八蛇矛】函数参数错误!\n");
            }

            qipaidui[*qipaishu] = (*w).shoupai[x];
            (*w).shoupai[x].leixing = -1;
            ((*w).shoupaishu)--;
            (*qipaishu)++;
            qipaidui[*qipaishu] = (*w).shoupai[y];
            (*w).shoupai[y].leixing = -1;
            ((*w).shoupaishu)--;
            (*qipaishu)++;
            printf("弃牌数:%d", *qipaishu);

            for (i = 0; i <= (((*w).shoupaishu) + 1); i++) {
                if ((*w).shoupai[i].leixing == -1) {
                    for (j = i + 1; j <= (((*w).shoupaishu) + 2); j++)
                        (*w).shoupai[j - 1] = (*w).shoupai[j];

                    i--;
                }
            }

            printf("玩家把:\n");
            qipaidui[(*qipaishu) - 2].Kanpai();
            qipaidui[(*qipaishu) - 1].Kanpai();
            printf("当作一张");

            switch (p.yanse) {
            case 0:
                printf("黑色");
                break;

            case 2:
                printf("红色");
                break;

            case 1:
                printf("无色");
                break;

            default:
                printf("绿色");
                break;
            }

            printf("无点数的【杀】");
            p.dianshu = -1;
            p.leixing = 101;
            return p;
            break;
        }

        printf("你将两张空气当作一张空气属性的【杀】使用或打出!\n");
    }
}
int Xuanpai(wujiang *w, int t) {
    int x;

    if ((*w).juese) {
        for (;;) {
            printf("出牌请输入手牌之前的编号,以回车结束!\n如果你想结束出牌阶段,请输入“-1”,以回车结束!\n");
            scanf("%d", &x);

            if ((x >= -1 && x < ((*w).shoupaishu)) || ((x == 100) && ((*w).zhuangbei[0].leixing == 305))) {
                return x;
                break;
            }

            printf("你打出了一张空气!\n");
        }
    } else
        return t;
}
pai Panpai(wujiang *w1, int *sha, int y, pai qipaidui[104], int *qipaishu) {
    pai p, q;
    p.leixing = 0;
    q.leixing = -1;

    if (y == -1)
        return q;
    else {
        if (y == 100) {
            if ((*sha) > 0) {
                q = Zhangba(w1, qipaidui, qipaishu);
                printf("使用!\n");
                return q;
            } else {
                printf("当前回合使用【杀】的次数已用尽,你也不能使用【丈八蛇矛】效果!\n");
                return p;
            }
        }

        switch ((*w1).shoupai[y].leixing) {
        case 101:
            if (((*sha) > 0) || ((*w1).zhuangbei[0].leixing == 301)) {
                if (((*w1).zhuangbei[0].leixing == 301))
                    printf("武器【诸葛连弩】效果被触发!\n");

                return (*w1).shoupai[y];
                break;
            } else {
                if ((*w1).juese)
                    printf("当前回合使用【杀】的次数已用尽,你不能使用【杀】!\n");

                return p;
                break;
            }

        case 102:
            if ((*w1).juese)
                printf("当前不需要响应任何操作,你不能主动打出【闪】!\n");

            return p;
            break;

        case 103:
            if (((*w1).tili) < ((*w1).tilishangxian)) {
                return (*w1).shoupai[y];
                break;
            } else {
                if ((*w1).juese)
                    printf("你并未受伤,不能对自己使用【桃】!\n");
            }

            return p;
            break;

        case 210:
            if ((*w1).juese)
                printf("当前不需要响应任何锦囊,你不能主动打出【无懈可击】!\n");

            return p;
            break;

        case 201:
        case 202:
        case 203:
        case 204:
        case 205:
        case 206:
        case 207:
        case 208:
        case 209:
        case 251:
        case 252:
        case 301:
        case 302:
        case 303:
        case 304:
        case 305:
        case 306:
        case 307:
        case 308:
        case 331:
        case 361:
        case 362:
        case 363:
        case 381:
        case 382:
        case 383:
            return (*w1).shoupai[y];
            break;

        default:
            printf("手牌类型参数错误!\n");
            return p;
            break;
        }
    }
}
int Mubiao(pai p, wujiang *w1, wujiang *w2, int *sha) {
    int x;

    switch (p.leixing) {
    case 101:
        if ((*w1).juese) {
            printf("请选择【杀】的目标!\n输入目标前的编号,以回车结束!\n0 电脑1\n");
            scanf("%d", &x);

            if (x == 0) {
                if ((*w1).zhuangbei[0].changdu >= (*w1).juli[0]) {
                    (*sha)--;
                    return ((*w2).juese);
                } else {
                    printf("武器长度不够!\n");
                    return -2;
                }
            } else {
                printf("目标错误!\n");
                return -2;
            }
        } else {
            if ((*w1).zhuangbei[0].changdu >= (*w1).juli[0]) {
                (*sha)--;
                return ((*w2).juese);
            } else
                return -2;
        }

        break;

    case 103:
        return ((*w1).juese);
        break;

    case 201:
        if ((*w1).juese) {
            printf("请选择【过河拆桥】的目标!\n输入目标前的编号,以回车结束!\n0 电脑1\n");
            scanf("%d", &x);

            if (x == 0) {
                if ((*w2).shoupaishu || (*w2).zhuangbeishu || (*w2).pandingshu)
                    return ((*w2).juese);
                else {
                    printf("目标没有牌!\n");
                    return -2;
                }
            } else {
                printf("目标错误!\n");
                return -2;
            }
        } else
            return ((*w2).juese);

        break;

    case 202:
        if ((*w1).juese) {
            printf("请选择【顺手牵羊】的目标!\n输入目标前的编号,以回车结束!\n0 电脑1\n");
            scanf("%d", &x);

            if (x == 0) {
                if (((*w2).shoupaishu || (*w2).zhuangbeishu || (*w2).pandingshu) && ((*w1).juli[0] <= 1))
                    return ((*w2).juese);
                else {
                    printf("目标没有牌!\n");
                    return -2;
                }
            } else {
                printf("目标错误!\n");
                return -2;
            }
        } else {
            if ((*w1).juli[0] <= 1)
                return ((*w2).juese);
            else
                return -2;
        }

        break;

    case 203:
        return ((*w1).juese);
        break;

    case 204:
        if ((*w1).juese) {
            printf("请选择【决斗】的目标!\n输入目标前的编号,以回车结束!\n0 电脑1\n");
            scanf("%d", &x);

            if (x == 0)
                return ((*w2).juese);
            else {
                printf("目标错误!\n");
                return -2;
            }
        } else
            return ((*w2).juese);

        break;

    case 205:
        int y;

        if ((*w1).juese) {
            printf("请选择【借刀杀人】的目标!\n输入目标前的编号,以回车结束!\n0 电脑1\n");
            scanf("%d", &x);

            if (x != 0) {
                printf("目标错误!\n");
                return -2;
            } else {
                if (((*w2).zhuangbei[0]).leixing <= 300 || ((*w2).zhuangbei[0]).leixing >= 331) {
                    printf("目标装备区里没有武器!\n");
                    return -2;
                } else {
                    printf("请选择【杀】的目标!\n提示:【杀】的目标必须在【借刀杀人】的目标的攻击范围之内!\n输入目标前的编号,以回车结束!\n0 玩家\n");
                    scanf("%d", &y);

                    if (y != 0) {
                        printf("目标错误!\n");
                        return -2;
                    } else {
                        if (((*w2).zhuangbei[0].changdu) < (*w2).juli[0]) {
                            printf("武器距离不够!\n");
                            return -2;
                        } else
                            return ((*w2).juese);
                    }
                }
            }
        } else {
            if (((*w2).zhuangbei[0]).leixing <= 300 || ((*w2).zhuangbei[0]).leixing >= 331)
                return -2;
            else {
                if (((*w2).zhuangbei[0].changdu) < (*w2).juli[0])
                    return -2;
                else
                    return ((*w2).juese);
            }
        }

        break;

    case 206:
    case 207:
        return 99;
        break;

    case 208:
    case 209:
        return 100;
        break;

    case 251:
        if ((*w1).juese) {
            printf("请选择【乐不思蜀】的目标!\n输入目标前的编号,以回车结束!\n0 电脑1\n");
            scanf("%d", &x);

            if (x == 0) {
                int i;

                for (i = 0; i <= 2; i++) {
                    if ((*w2).pandingpai[i].leixing == 251)
                        i = -1;

                    break;
                }

                if (i == -1) {
                    printf("目标判定区里不能同时存在两张相同的延时类锦囊!\n");
                    return -2;
                } else
                    return ((*w2).juese);
            } else {
                printf("目标错误!\n");
                return -2;
            }
        } else {
            int i;

            for (i = 0; i <= 2; i++) {
                if ((*w2).pandingpai[i].leixing == 251)
                    i = -1;

                break;
            }

            if (i == -1)
                return -2;
            else
                return ((*w2).juese);
        }

        break;

    case 252:
        int i;

        for (i = 0; i <= 2; i++) {
            if ((*w1).pandingpai[i].leixing == 252)
                i = -1;

            break;
        }

        if (i == -1) {
            if ((*w1).juese)
                printf("目标判定区里不能同时存在两张相同的延时类锦囊!\n");

            return -2;
        } else
            return ((*w1).juese);

        break;

    case 301:
    case 302:
    case 303:
    case 304:
    case 305:
    case 306:
    case 307:
    case 308:
    case 331:
    case 361:
    case 362:
    case 363:
    case 381:
    case 382:
    case 383:
        return ((*w1).juese);
        break;

    default:
        return -2;
        break;
    }
}
void Da1pai(wujiang *w1, wujiang *w2, pai qipaidui[104], int *qipaishu, int x) {
    int i;

    if ((x < 0 || x >= ((*w1).shoupaishu)) && x != 100)
        printf("你的牌呢?!\n");
    else {
        switch (((*w1).shoupai)[x].leixing) {
        case 101:
        case 102:
        case 103:
        case 201:
        case 202:
        case 203:
        case 204:
        case 205:
        case 206:
        case 207:
        case 208:
        case 209:
        case 210:
            qipaidui[*qipaishu] = ((*w1).shoupai)[x];

            for (i = x + 1; i <= ((*w1).shoupaishu); i++)
                ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

            ((*w1).shoupaishu)--;
            (*qipaishu)++;
            break;

        case 251:
            for (i = 1; i >= 0; i--)
                (*w2).pandingpai[i + 1] = (*w2).pandingpai[i];

            (*w2).pandingpai[0] = (*w1).shoupai[x];

            for (i = x + 1; i <= ((*w1).shoupaishu); i++)
                ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

            ((*w1).shoupaishu)--;
            ((*w2).pandingshu)++;
            break;

        case 252:
            for (i = 1; i >= 0; i--)
                (*w1).pandingpai[i + 1] = (*w1).pandingpai[i];

            (*w1).pandingpai[0] = (*w1).shoupai[x];

            for (i = x + 1; i <= ((*w1).shoupaishu); i++)
                ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

            ((*w1).shoupaishu)--;
            ((*w1).pandingshu)++;
            break;

        case 301:
        case 302:
        case 303:
        case 304:
        case 305:
        case 306:
        case 307:
        case 308:
            if ((*w1).zhuangbei[0].leixing == -1)
                ((*w1).zhuangbeishu)++;
            else {
                qipaidui[*qipaishu] = ((*w1).zhuangbei)[0];
                (*qipaishu)++;
            }

            (*w1).zhuangbei[0] = (*w1).shoupai[x];

            for (i = x + 1; i <= ((*w1).shoupaishu); i++)
                ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

            ((*w1).shoupaishu)--;
            break;

        case 331:
            if ((*w1).zhuangbei[1].leixing == -1)
                ((*w1).zhuangbeishu)++;
            else {
                qipaidui[*qipaishu] = ((*w1).zhuangbei)[1];
                (*qipaishu)++;
            }

            (*w1).zhuangbei[1] = (*w1).shoupai[x];

            for (i = x + 1; i <= ((*w1).shoupaishu); i++)
                ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

            ((*w1).shoupaishu)--;
            break;

        case 361:
        case 362:
        case 363:
            if ((*w1).zhuangbei[2].leixing == -1)
                ((*w1).zhuangbeishu)++;
            else {
                qipaidui[*qipaishu] = ((*w1).zhuangbei)[2];
                (*qipaishu)++;
            }

            (*w1).zhuangbei[2] = (*w1).shoupai[x];

            for (i = x + 1; i <= ((*w1).shoupaishu); i++)
                ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

            ((*w1).shoupaishu)--;
            break;

        case 381:
        case 382:
        case 383:
            if ((*w1).zhuangbei[3].leixing == -1)
                ((*w1).zhuangbeishu)++;
            else {
                qipaidui[*qipaishu] = ((*w1).zhuangbei)[3];
                (*qipaishu)++;
            }

            (*w1).zhuangbei[3] = (*w1).shoupai[x];

            for (i = x + 1; i <= ((*w1).shoupaishu); i++)
                ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

            ((*w1).shoupaishu)--;
            break;

        default:
            break;
        }
    }
}
void Miaoshu(pai p, int juese, int duixiang) {
    if (juese == 0)
        printf("电脑");
    else if (juese == 1)
        printf("玩家");
    else
        printf("角色参数错误!\n");

    if (p.leixing <= 300 && p.leixing > 100) {
        switch (duixiang) {
        case -1:
            printf("打出");
            break;

        case 0:
            printf("对电脑使用");
            break;

        case 1:
            printf("对玩家使用");
            break;

        case 99:
            printf("使用");
            break;

        case 100:
            printf("对所有人使用");
            break;

        default:
            printf("对象参数错误\n");
            break;
        }
    } else if (p.leixing >= 301 && p.leixing <= 400)
        printf("装备");
    else
        printf("你出的是什么东西?\n");

    p.Kanpai();

    if (!juese && (p.leixing == 101 || p.leixing == 204 || p.leixing == 205 || p.leixing == 207 ||
                   p.leixing == 208 || p.leixing == 209))
        printf("请响应!\n");
}
int Wuxie(pai *p, wujiang *w1, wujiang *w2, pai qipaidui[104], int *qipaishu, int a) {
    int x;

    if ((*w1).juese) {
        printf("是否使用【无懈可击】响应?\n\n");

        for (;;) {
            (*w1).Kanshoupai();
            printf("如果要使用【无懈可击】请输入手牌之前编号,不需要请输入“-1”,以回车结束!\n");
            scanf("%d", &x);

            if (x == -1) {
                for (x = 0; x < ((*w2).shoupaishu); x++) {
                    if ((*w2).shoupai[x].leixing == 210) {
                        printf("电脑使用");
                        ((*w2).shoupai)[x].Kanpai();
                        printf("对象是");
                        (*p).Kanpai();
                        (*p) = ((*w2).shoupai)[x];
                        qipaidui[*qipaishu] = ((*w2).shoupai)[x];

                        for (int i = x + 1; i <= ((*w2).shoupaishu); i++)
                            ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

                        ((*w2).shoupaishu)--;
                        (*qipaishu)++;
                        a++;
                        break;
                    }
                }

                break;
            } else if ((*w1).shoupai[x].leixing == 210) {
                printf("玩家使用");
                ((*w1).shoupai)[x].Kanpai();
                printf("对象是");
                (*p).Kanpai();
                (*p) = ((*w1).shoupai)[x];
                qipaidui[*qipaishu] = ((*w1).shoupai)[x];

                for (int i = x + 1; i <= ((*w1).shoupaishu); i++)
                    ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

                ((*w1).shoupaishu)--;
                (*qipaishu)++;
                (*w1).Kanshoupai();
                a++;
                break;
            } else
                printf("你确定你使用的是【无懈可击】?\n");
        }
    } else {
        printf("是否使用【无懈可击】响应?\n");

        for (;;) {
            (*w2).Kanshoupai();
            printf("如果要使用【无懈可击】请输入手牌之前编号,不需要请输入“-1”,以回车结束!\n");
            scanf("%d", &x);

            if (x == -1)
                break;
            else if ((*w2).shoupai[x].leixing == 210) {
                printf("玩家使用");
                ((*w2).shoupai)[x].Kanpai();
                printf("对象是");
                (*p).Kanpai();
                (*p) = ((*w2).shoupai)[x];
                qipaidui[*qipaishu] = ((*w2).shoupai)[x];

                for (int i = x + 1; i <= ((*w2).shoupaishu); i++)
                    ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

                ((*w2).shoupaishu)--;
                (*qipaishu)++;
                (*w2).Kanshoupai();
                a++;
                break;
            } else
                printf("你确定你使用的是【无懈可击】?\n");
        }
    }

    return a;
}
int Qiutao(wujiang *w, pai qipaidui[104], int *qipaishu) {
    int x;

    if ((*w).juese) {
        for (;;) {
            printf("如果要使用【桃】请输入手牌之前的编号,不需要请输入“-1”,以回车结束!\n");
            scanf("%d", &x);

            if (x == -1) {
                return -1;
                break;
            } else if ((*w).shoupai[x].leixing == 103) {
                qipaidui[*qipaishu] = ((*w).shoupai)[x];

                for (int i = x + 1; i <= ((*w).shoupaishu); i++)
                    ((*w).shoupai)[i - 1] = ((*w).shoupai)[i];

                ((*w).shoupaishu)--;
                (*qipaishu)++;
                return 0;
                break;
            } else
                printf("你确定你使用的是【桃】?\n");
        }
    } else {
        for (x = 0; x < ((*w).shoupaishu); x++) {
            if ((*w).shoupai[x].leixing == 103) {
                qipaidui[*qipaishu] = ((*w).shoupai)[x];

                for (int i = x + 1; i <= ((*w).shoupaishu); i++)
                    ((*w).shoupai)[i - 1] = ((*w).shoupai)[i];

                ((*w).shoupaishu)--;
                (*qipaishu)++;
                return 0;
                break;
            }
        }

        return -1;
    }
}
int Binsi(wujiang *w1, wujiang *w2, pai qipaidui[104], int *qipaishu) {
    if (((*w2).tili) > 0)
        return 0;
    else {
        int i;

        if ((*w1).juese) {
            for (;;) {
                printf("电脑濒死,是否使用【桃】?\n");
                i = Qiutao(w1, qipaidui, qipaishu);

                if (i == 0)
                    ((*w2).tili)++;

                if ((i == -1) || ((*w2).tili > 0))
                    break;
            }

            if ((*w2).tili > 0)
                return 0;
            else {
                for (;;) {
                    i = Qiutao(w2, qipaidui, qipaishu);

                    if (i == 0)
                        ((*w2).tili)++;

                    if ((i == -1) || ((*w2).tili > 0))
                        break;
                }

                if ((*w2).tili > 0)
                    return 0;
                else
                    return -1;
            }
        } else {
            for (;;) {
                printf("玩家濒死,是否使用【桃】?\n");
                i = Qiutao(w2, qipaidui, qipaishu);

                if (i == 0)
                    ((*w2).tili)++;

                if ((i == -1) || ((*w2).tili > 0))
                    break;
            }

            if ((*w2).tili > 0)
                return 0;
            else
                return -1;
        }
    }
}
int Shan(wujiang *w1, wujiang *w2, pai paidui[104], int *paiduishu, pai qipaidui[104], int *qipaishu) {
    int x;

    if ((*w2).juese) {
        if (((*w2).zhuangbei[1].leixing == 331) && ((*w1).zhuangbei[0].leixing != 303)) {
            for (;;) {
                int m;
                printf("是否发动【八卦阵】防具效果?\n0 否\n1 是\n请输入选项之前的编号,以回车结束!\n");
                scanf("%d", &m);

                if (m == 1) {
                    Panding(paidui, paiduishu, qipaidui, qipaishu);

                    if (qipaidui[(*qipaishu) - 1].huase % 2) {
                        printf("【八卦阵】判定成功!\n");
                        return 0;
                    }
                } else if (m == 0) {
                    printf("【八卦阵】判定失败!\n");
                    break;
                } else
                    printf("你确定你输入的是“0”或“1”?\n");
            }
        } else if (((*w2).zhuangbei[1].leixing == 331) && ((*w1).zhuangbei[0].leixing == 303))
            printf("【青釭剑】锁定技被触发!\n");

        for (;;) {
            printf("请输入手牌之前的编号,或者输入“-1”放弃打出【闪】,以回车结束!\n");
            scanf("%d", &x);

            if (x == -1) {
                return -1;
                break;
            } else if ((*w2).shoupai[x].leixing == 102) {
                printf("玩家打出");
                ((*w2).shoupai)[x].Kanpai();
                qipaidui[*qipaishu] = ((*w2).shoupai)[x];

                for (int i = x + 1; i <= ((*w2).shoupaishu); i++)
                    ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

                ((*w2).shoupaishu)--;
                (*qipaishu)++;
                return 0;
                break;
            } else
                printf("你确定你打出的是【闪】?\n");
        }
    } else {
        if (((*w2).zhuangbei[1].leixing == 331) && ((*w1).zhuangbei[0].leixing != 303)) {
            Panding(paidui, paiduishu, qipaidui, qipaishu);

            if (qipaidui[(*qipaishu) - 1].huase % 2) {
                printf("【八卦阵】判定成功!\n");
                return 0;
            } else
                printf("【八卦阵】判定失败!\n");
        } else if (((*w2).zhuangbei[1].leixing == 331) && ((*w1).zhuangbei[0].leixing == 303))
            printf("【青釭剑】锁定技被触发!\n");

        int i;

        for (x = 0; x < ((*w2).shoupaishu); x++) {
            if ((*w2).shoupai[x].leixing == 102) {
                printf("电脑打出");
                ((*w2).shoupai)[x].Kanpai();
                qipaidui[*qipaishu] = ((*w2).shoupai)[x];

                for (i = x + 1; i <= ((*w2).shoupaishu); i++)
                    ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

                ((*w2).shoupaishu)--;
                (*qipaishu)++;
                return 0;
                break;
            }
        }

        return -1;
    }
}
int Sha(wujiang *w1, wujiang *w2, pai paidui[104], int *paiduishu, pai qipaidui[104], int *qipaishu) {
    int x;

    if ((*w2).juese) {
        printf("请打出【闪】响应【杀】!否则你将受到1点伤害!\n");
        x = Shan(w1, w2, paidui, paiduishu, qipaidui, qipaishu);

        if (x == -1) {
            int i;
            ((*w2).tili)--;
            printf("电脑对玩家造成1点伤害!\n");
            i = Binsi(w1, w2, qipaidui, qipaishu);
            return i;
        } else if (x == 0 && ((*w1).zhuangbei[0].leixing == 306)) {
            int i;

            if (((*w1).shoupaishu) >= 2) {
                printf("电脑弃掉:\n");
                ((*w1).shoupai)[0].Kanpai();
                qipaidui[*qipaishu] = ((*w1).shoupai)[0];

                for (i = 1; i <= ((*w1).shoupaishu); i++)
                    ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

                ((*w1).shoupaishu)--;
                (*qipaishu)++;
                ((*w1).shoupai)[0].Kanpai();
                qipaidui[*qipaishu] = ((*w1).shoupai)[0];

                for (i = 1; i <= ((*w1).shoupaishu); i++)
                    ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

                ((*w1).shoupaishu)--;
                (*qipaishu)++;
                printf("发动【贯石斧】武器效果使【杀】造成伤害!\n");
                ((*w2).tili)--;
                i = Binsi(w1, w2, qipaidui, qipaishu);
                return i;
            } else
                return 0;
        } else if (x == 0 && ((*w1).zhuangbei[0].leixing == 304)) {
            int i;

            for (x = 0; x < ((*w1).shoupaishu); x++) {
                if ((*w1).shoupai[x].leixing == 101) {
                    printf("电脑发动【青龙偃月刀】效果对玩家使用");
                    ((*w1).shoupai)[x].Kanpai();
                    qipaidui[*qipaishu] = ((*w1).shoupai)[x];

                    for (i = x + 1; i <= ((*w1).shoupaishu); i++)
                        ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

                    ((*w1).shoupaishu)--;
                    (*qipaishu)++;
                    i = Sha(w1, w2, paidui, paiduishu, qipaidui, qipaishu);
                    return i;
                    break;
                }
            }

            return 0;
        }
    } else {
        x = Shan(w1, w2, paidui, paiduishu, qipaidui, qipaishu);

        if (x == -1) {
            if ((*w1).zhuangbei[0].leixing == 308) {
                for (;;) {
                    printf("是否发动【麒麟弓】武器效果?\n0 否\n1 是\n");
                    scanf("%d", &x);

                    if (x == 1) {
                        if (((*w2).zhuangbei[2].leixing == -1) && ((*w2).zhuangbei[3].leixing == -1)) {
                            printf("电脑根本没有马,射你妹的马啊!\n");
                            break;
                        } else {
                            for (;;) {
                                printf("0 ");
                                ((*w2).zhuangbei[2]).Kanpai();
                                printf("1 ");
                                ((*w2).zhuangbei[3]).Kanpai();
                                printf("请选择要弃掉的马,输入之前的编号,以回车结束!\n");
                                scanf("%d", &x);

                                if ((x == 0) && ((*w2).zhuangbei[2].leixing != -1)) {
                                    printf("你弃掉了电脑的");
                                    ((*w2).zhuangbei)[2].Kanpai();
                                    qipaidui[*qipaishu] = ((*w2).zhuangbei)[2];
                                    ((*w2).zhuangbeishu)--;
                                    (*qipaishu)++;
                                    ((*w2).zhuangbei)[2].leixing = -1;
                                    ((*w2).juli[0])++;
                                    break;
                                } else if ((x == 1) && ((*w2).zhuangbei[3].leixing != -1)) {
                                    printf("你弃掉了电脑的");
                                    ((*w2).zhuangbei)[3].Kanpai();
                                    qipaidui[*qipaishu] = ((*w2).zhuangbei)[3];
                                    ((*w2).zhuangbeishu)--;
                                    (*qipaishu)++;
                                    ((*w2).zhuangbei)[3].leixing = -1;
                                    ((*w1).juli[0])--;
                                    break;
                                } else
                                    printf("射你妹的马!");
                            }

                            break;
                        }
                    } else if (x == 0)
                        break;
                    else
                        printf("键盘上的“0”和“1”被你吃了吗?\n");
                }
            }

            int i;
            ((*w2).tili)--;
            printf("玩家对电脑造成1点伤害!\n");
            i = Binsi(w1, w2, qipaidui, qipaishu);
            return i;
        } else if (x == 0 && ((*w1).zhuangbei[0].leixing == 306)) {
            for (;;) {
                printf("是否发动【贯石斧】武器效果?\n0 否\n1 是\n");
                scanf("%d", &x);

                if (x == 1) {
                    int i;

                    if ((*w1).shoupaishu + (*w1).zhuangbeishu <= 2) {
                        printf("你除了【贯石斧】以外连2张牌都没有,发动你妹的效果!\n");
                        break;
                    } else {
                        printf("请分别弃掉两张牌!\n");

                        for (i = 0; i <= 2; i++) {
                            for (;;) {
                                printf("请选择区域:\n0 手牌\n1 装备\n");
                                scanf("%d", &x);

                                if (x == 0 && ((*w1).shoupaishu == 0))
                                    printf("你根本没有手牌,弃你妹啊!\n");
                                else if (x == 1 && ((*w1).zhuangbeishu == 1))
                                    printf("你根本没有别的装备,弃你妹啊!\n");
                                else if (x >= 0 && x <= 1)
                                    break;
                                else
                                    printf("键盘上的“0”和“1”被你吃了吗?\n");
                            }

                            if (x == 0) {
                                for (;;) {
                                    (*w1).Kanshoupai();
                                    printf("弃牌请输入手牌之前的编号,以回车结束!\n");
                                    scanf("%d", &x);

                                    if (x >= 0 && x < ((*w1).shoupaishu))
                                        break;
                                    else
                                        printf("弃你妹的手牌!\n");
                                }

                                printf("你弃掉了");
                                ((*w1).shoupai)[x].Kanpai();
                                qipaidui[*qipaishu] = ((*w1).shoupai)[x];

                                for (i = x + 1; i <= ((*w1).shoupaishu); i++)
                                    ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

                                ((*w1).shoupaishu)--;
                                (*qipaishu)++;
                            } else {
                                for (;;) {
                                    (*w1).Kanzhuangbei();
                                    printf("请输入装备之前的编号,以回车键结束!\n");
                                    scanf("%d", &x);

                                    if ((((*w1).zhuangbei[x]).leixing != -1) && (x >= 0) && (x <= 3)) {
                                        printf("你弃掉了");
                                        ((*w1).zhuangbei)[x].Kanpai();
                                        qipaidui[*qipaishu] = ((*w1).zhuangbei)[x];
                                        ((*w1).zhuangbeishu)--;
                                        (*qipaishu)++;
                                        ((*w1).zhuangbei)[x].leixing = -1;
                                        break;
                                    } else
                                        printf("弃你妹的装备!\n");
                                }
                            }
                        }
                    }

                    printf("玩家发动【贯石斧】武器效果使【杀】造成伤害!\n");
                    ((*w2).tili)--;
                    i = Binsi(w1, w2, qipaidui, qipaishu);
                    return i;
                    break;
                } else if (x == 0)
                    break;
                else
                    printf("键盘上的“0”和“1”被你吃了吗?\n");
            }
        } else if (x == 0 && ((*w1).zhuangbei[0].leixing == 304)) {
            for (;;) {
                printf("是否发动【青龙偃月刀】武器效果?\n0 否\n1 是\n");
                scanf("%d", &x);

                if (x == 1) {
                    for (;;) {
                        printf("请对电脑使用一张【杀】!\n请输入手牌之前的编号,或者输入“-1”放弃出【杀】,以回车结束!\n");
                        (*w1).Kanshoupai();
                        scanf("%d", &x);

                        if (x == -1) {
                            return 0;
                            break;
                        } else if ((*w1).shoupai[x].leixing == 101) {
                            int i;
                            printf("玩家对电脑使用");
                            ((*w1).shoupai)[x].Kanpai();
                            qipaidui[*qipaishu] = ((*w1).shoupai)[x];

                            for (i = x + 1; i <= ((*w1).shoupaishu); i++)
                                ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

                            ((*w1).shoupaishu)--;
                            (*qipaishu)++;
                            i = Sha(w1, w2, paidui, paiduishu, qipaidui, qipaishu);
                            return i;
                            break;
                        } else
                            printf("你确定你打出的是【杀】?\n");
                    }
                } else if (x == 0) {
                    return 0;
                    break;
                } else
                    printf("你确定你输入的是“0”或“1”?\n");
            }
        } else
            return 0;
    }

    return 0;
}
void Tao(wujiang *w1) {
    ((*w1).tili)++;

    if ((*w1).juese)
        printf("玩家");
    else
        printf("电脑");

    printf("恢复了1点体力!\n");

    if (((*w1).tili) > ((*w1).tilishangxian))
        printf("你被撑死了!\n");
}
void Chai(wujiang *w1, wujiang *w2, pai qipaidui[104], int *qipaishu) {
    int i, x, y;

    if ((*w1).juese) {
        for (;;) {
            if ((*w2).shoupaishu + (*w2).zhuangbeishu + (*w2).pandingshu == 0) {
                printf("对方空城,拆你妹啊!\n");
                break;
            } else {
                printf("请选择想拆的区域,输入选项之前的编号,以回车结束!\n0 手牌\n1 装备区\n2 判定区\n");
                scanf("%d", &x);

                if (x == 0 && ((*w2).shoupaishu == 0))
                    printf("你拆掉了一张空气!\n");
                else if (x == 1 && ((*w2).zhuangbeishu == 0))
                    printf("你拆掉了一张空气!\n");
                else if (x == 2 && ((*w2).pandingshu == 0))
                    printf("你拆掉了一张空气!\n");
                else if (x >= 0 && x <= 2)
                    break;
                else
                    printf("你拆掉了太空区里的一张牌!\n");
            }
        }

        switch (x) {
        case 0:
            srand((unsigned)time(NULL));
            y = rand() % ((*w2).shoupaishu);
            printf("你弃掉了电脑的");
            ((*w2).shoupai)[y].Kanpai();
            qipaidui[*qipaishu] = ((*w2).shoupai)[y];

            for (i = y + 1; i <= ((*w2).shoupaishu); i++)
                ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

            ((*w2).shoupaishu)--;
            (*qipaishu)++;
            break;

        case 1:
            for (;;) {
                (*w2).Kanzhuangbei();
                printf("请输入装备之前的编号,以回车键结束!\n");
                scanf("%d", &y);

                if ((((*w2).zhuangbei[y]).leixing != -1) && (y >= 0) && (y <= 3)) {
                    printf("你弃掉了电脑的");
                    ((*w2).zhuangbei)[y].Kanpai();
                    qipaidui[*qipaishu] = ((*w2).zhuangbei)[y];
                    ((*w2).zhuangbeishu)--;
                    (*qipaishu)++;
                    ((*w2).zhuangbei)[y].leixing = -1;

                    if (!y)
                        ((*w2).zhuangbei)[y].changdu = 1;
                    else if (y == 2)
                        ((*w2).juli[0])++;
                    else if (y == 3)
                        ((*w1).juli[0])--;

                    break;
                } else
                    printf("你弃掉了一张空气!\n");
            }

            break;

        case 2:
            for (;;) {
                (*w2).Kanpandingpai();
                printf("请输入判定牌之前的编号,以回车键结束!\n");
                scanf("%d", &y);

                if ((*w2).pandingpai[y].leixing != -1) {
                    printf("你弃掉了电脑的");
                    ((*w2).pandingpai)[y].Kanpai();
                    qipaidui[*qipaishu] = ((*w2).pandingpai)[y];
                    ((*w2).pandingshu)--;
                    (*qipaishu)++;
                    ((*w2).pandingpai)[y].leixing = -1;
                    break;
                } else
                    printf("你弃掉了一张空气!\n");
            }

            break;

        default:
            break;
        }
    } else {
        if ((*w2).zhuangbeishu) {
            if ((*w2).zhuangbei[1].leixing != -1) {
                printf("电脑弃掉了玩家的");
                ((*w2).zhuangbei)[1].Kanpai();
                qipaidui[*qipaishu] = ((*w2).zhuangbei)[1];
                ((*w2).zhuangbeishu)--;
                (*qipaishu)++;
                ((*w2).zhuangbei)[1].leixing = -1;
            } else if ((*w2).zhuangbei[3].leixing != -1) {
                printf("电脑弃掉了玩家的");
                ((*w2).zhuangbei)[3].Kanpai();
                qipaidui[*qipaishu] = ((*w2).zhuangbei)[3];
                ((*w2).zhuangbeishu)--;
                (*qipaishu)++;
                ((*w2).zhuangbei)[3].leixing = -1;
                ((*w1).juli[0])--;
            } else if ((*w2).zhuangbei[0].leixing != -1) {
                printf("电脑弃掉了玩家的");
                ((*w2).zhuangbei)[0].Kanpai();
                qipaidui[*qipaishu] = ((*w2).zhuangbei)[0];
                ((*w2).zhuangbeishu)--;
                (*qipaishu)++;
                ((*w2).zhuangbei)[0].leixing = -1;
                ((*w2).zhuangbei)[0].changdu = 1;
            } else {
                printf("电脑弃掉了玩家的");
                ((*w2).zhuangbei)[2].Kanpai();
                qipaidui[*qipaishu] = ((*w2).zhuangbei)[2];
                ((*w2).zhuangbeishu)--;
                (*qipaishu)++;
                ((*w2).zhuangbei)[2].leixing = -1;
                ((*w2).juli[0])++;
            }
        } else {
            srand((unsigned)time(NULL));
            y = rand() % ((*w2).shoupaishu);
            printf("电脑弃掉了玩家的手牌");
            ((*w2).shoupai)[y].Kanpai();
            qipaidui[*qipaishu] = ((*w2).shoupai)[y];

            for (i = y + 1; i <= ((*w2).shoupaishu); i++)
                ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

            ((*w2).shoupaishu)--;
            (*qipaishu)++;
        }
    }
}
void Qian(wujiang *w1, wujiang *w2) {
    int i, x, y;

    if ((*w1).juese) {
        for (;;) {
            if ((*w2).shoupaishu + (*w2).zhuangbeishu + (*w2).pandingshu == 0) {
                printf("对方空城啦!你牵走了一张寂寞!\n");
                break;
            } else {
                printf("请选择想牵的区域,输入选项之前的编号,以回车结束!\n0 手牌\n1 装备区\n2 判定区\n");
                scanf("%d", &x);

                if (x == 0 && ((*w2).shoupaishu == 0))
                    printf("你牵走了一张空气!\n");
                else if (x == 1 && ((*w2).zhuangbeishu == 0))
                    printf("你牵走了一张空气!\n");
                else if (x == 2 && ((*w2).pandingshu == 0))
                    printf("你牵走了一张空气!\n");
                else if (x >= 0 && x <= 2)
                    break;
                else
                    printf("你牵走了太空区里的一张牌!\n");
            }
        }

        switch (x) {
        case 0:
            srand((unsigned)time(NULL));
            y = rand() % ((*w2).shoupaishu);
            printf("你牵走了电脑的");
            ((*w2).shoupai)[y].Kanpai();
            (*w1).shoupai[(*w1).shoupaishu] = ((*w2).shoupai)[y];

            for (i = y + 1; i <= ((*w2).shoupaishu); i++)
                ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

            ((*w2).shoupaishu)--;
            ((*w1).shoupaishu)++;
            break;

        case 1:
            for (;;) {
                (*w2).Kanzhuangbei();
                printf("请输入装备之前的编号,以回车键结束!\n");
                scanf("%d", &y);

                if ((((*w2).zhuangbei[y]).leixing != -1) && (y >= 0) && (y <= 3)) {
                    printf("你牵走了电脑的");
                    ((*w2).zhuangbei)[y].Kanpai();
                    (*w1).shoupai[(*w1).shoupaishu] = ((*w2).zhuangbei)[y];
                    ((*w2).zhuangbeishu)--;
                    ((*w1).shoupaishu)++;
                    ((*w2).zhuangbei)[y].leixing = -1;

                    if (!y)
                        ((*w2).zhuangbei[y]).changdu = 1;
                    else if (y == 2)
                        ((*w2).juli[0])++;
                    else if (y == 3)
                        ((*w1).juli[0])--;

                    break;
                } else
                    printf("你弃掉了一张空气!\n");
            }

            break;

        case 2:
            for (;;) {
                (*w2).Kanpandingpai();
                printf("请输入判定牌之前的编号,以回车键结束!\n");
                scanf("%d", &y);

                if ((*w2).pandingpai[y].leixing != -1) {
                    printf("你牵走了电脑的");
                    ((*w2).pandingpai)[y].Kanpai();
                    (*w1).shoupai[(*w1).shoupaishu] = ((*w2).pandingpai)[y];
                    ((*w2).pandingshu)--;
                    ((*w1).shoupaishu)++;
                    ((*w2).pandingpai)[y].leixing = -1;
                    break;
                } else
                    printf("你牵走了一张空气!\n");
            }

            break;

        default:
            break;
        }
    } else {
        if ((*w2).zhuangbeishu) {
            if ((*w2).zhuangbei[1].leixing != -1) {
                printf("电脑牵走了玩家的");
                ((*w2).zhuangbei)[1].Kanpai();
                (*w1).shoupai[(*w1).shoupaishu] = ((*w2).zhuangbei)[1];
                ((*w2).zhuangbeishu)--;
                ((*w1).shoupaishu)++;
                ((*w2).zhuangbei)[1].leixing = -1;
            } else if ((*w2).zhuangbei[3].leixing != -1) {
                printf("电脑牵走了玩家的");
                ((*w2).zhuangbei)[3].Kanpai();
                (*w1).shoupai[(*w1).shoupaishu] = ((*w2).zhuangbei)[3];
                ((*w2).zhuangbeishu)--;
                ((*w1).shoupaishu)++;
                ((*w2).zhuangbei)[3].leixing = -1;
                ((*w1).juli[0])--;
            } else if ((*w2).zhuangbei[0].leixing != -1) {
                printf("电脑牵走了玩家的");
                ((*w2).zhuangbei)[0].Kanpai();
                (*w1).shoupai[(*w1).shoupaishu] = ((*w2).zhuangbei)[0];
                ((*w2).zhuangbeishu)--;
                ((*w1).shoupaishu)++;
                ((*w2).zhuangbei)[0].leixing = -1;
                ((*w2).zhuangbei)[0].changdu = 1;
            } else {
                printf("电脑牵走了玩家的");
                ((*w2).zhuangbei)[2].Kanpai();
                (*w1).shoupai[(*w1).shoupaishu] = ((*w2).zhuangbei)[2];
                ((*w2).zhuangbeishu)--;
                ((*w1).shoupaishu)++;
                ((*w2).zhuangbei)[2].leixing = -1;
                ((*w2).juli[0])--;
            }
        } else {
            srand((unsigned)time(NULL));
            y = rand() % ((*w2).shoupaishu);
            printf("电脑牵走了玩家的手牌");
            ((*w2).shoupai)[y].Kanpai();
            (*w1).shoupai[(*w1).shoupaishu] = ((*w2).shoupai)[y];

            for (i = y + 1; i <= ((*w2).shoupaishu); i++)
                ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

            ((*w2).shoupaishu)--;
            ((*w1).shoupaishu)++;
        }
    }
}
void Wuzhong(wujiang *w1, pai A[104], int *x, pai B[104], int *y) {
    Mopai(&((*w1).shoupaishu), (*w1).shoupai, A, x, B, y, (*w1).juese);
}
int Juedou(wujiang *w1, wujiang *w2, pai qipaidui[104], int *qipaishu) {
    int i, j, x;

    if ((*w1).juese) {
        for (;;) {
            j = 0;

            for (x = 0; x < ((*w2).shoupaishu); x++) {
                if ((*w2).shoupai[x].leixing == 101) {
                    printf("电脑打出");
                    ((*w2).shoupai)[x].Kanpai();
                    qipaidui[*qipaishu] = ((*w2).shoupai)[x];

                    for (int i = x + 1; i <= ((*w2).shoupaishu); i++)
                        ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

                    ((*w2).shoupaishu)--;
                    (*qipaishu)++;
                    j = 1;
                    break;
                }
            }

            if (!j) {
                printf("玩家对电脑造成1点伤害!\n");
                ((*w2).tili)--;
                i = Binsi(w1, w2, qipaidui, qipaishu);
                return i;
                break;
            }

            j = 0;

            for (;;) {
                printf("请打出一张【杀】响应【决斗】,否则你将受到1点伤害!\n请输入手牌之前的编号,或者输入“-1”放弃出【杀】,以回车结束!\n");

                if (((*w1).zhuangbei[0].leixing == 305))
                    printf("如果想发动【丈八蛇矛】效果,请输入“100”,以回车结束!\n");

                (*w1).Kanshoupai();
                scanf("%d", &x);

                if (x == -1) {
                    int i;
                    ((*w1).tili)--;
                    printf("电脑对玩家造成1点伤害!\n");
                    i = Binsi(w2, w1, qipaidui, qipaishu);
                    return i;
                    break;
                } else if (((*w1).zhuangbei[0].leixing == 305) && x == 100) {
                    pai p = Zhangba(w1, qipaidui, qipaishu);
                    p.paifu = -1;
                    printf("打出!\n");
                    j = 1;
                    break;
                } else if ((*w1).shoupai[x].leixing == 101) {
                    printf("玩家打出");
                    ((*w1).shoupai)[x].Kanpai();
                    qipaidui[*qipaishu] = ((*w1).shoupai)[x];

                    for (i = x + 1; i <= ((*w1).shoupaishu); i++)
                        ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

                    ((*w1).shoupaishu)--;
                    (*qipaishu)++;
                    j = 1;
                    break;
                } else
                    printf("你确定你打出的是【杀】?\n");
            }
        }
    } else {
        for (;;) {
            j = 0;

            for (;;) {
                printf("请打出一张【杀】响应【决斗】,否则你将受到1点伤害!\n请输入手牌之前的编号,或者输入“-1”放弃出【杀】,以回车结束!\n");

                if (((*w1).zhuangbei[0].leixing == 305))
                    printf("如果想发动【丈八蛇矛】效果,请输入“100”,以回车结束!\n");

                (*w2).Kanshoupai();
                scanf("%d", &x);

                if (x == -1) {
                    int i;
                    ((*w2).tili)--;
                    printf("电脑对玩家造成1点伤害!\n");
                    i = Binsi(w1, w2, qipaidui, qipaishu);
                    return i;
                    break;
                } else if (((*w2).zhuangbei[0].leixing == 305) && x == 100) {
                    pai p = Zhangba(w2, qipaidui, qipaishu);
                    p.paifu = -1;
                    printf("打出!\n");
                    j = 1;
                    break;
                } else if ((*w2).shoupai[x].leixing == 101) {
                    printf("玩家打出");
                    ((*w2).shoupai)[x].Kanpai();
                    qipaidui[*qipaishu] = ((*w2).shoupai)[x];

                    for (i = x + 1; i <= ((*w2).shoupaishu); i++)
                        ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

                    ((*w2).shoupaishu)--;
                    (*qipaishu)++;
                    j = 1;
                    break;
                } else
                    printf("你确定你打出的是【杀】?\n");
            }

            j = 0;

            for (x = 0; x < ((*w1).shoupaishu); x++) {
                if ((*w1).shoupai[x].leixing == 101) {
                    printf("电脑打出");
                    ((*w1).shoupai)[x].Kanpai();
                    qipaidui[*qipaishu] = ((*w1).shoupai)[x];

                    for (int i = x + 1; i <= ((*w1).shoupaishu); i++)
                        ((*w1).shoupai)[i - 1] = ((*w1).shoupai)[i];

                    ((*w1).shoupaishu)--;
                    (*qipaishu)++;
                    j = 1;
                    break;
                }
            }

            if (!j) {
                printf("玩家对电脑造成1点伤害!\n");
                ((*w2).tili)--;
                i = Binsi(w2, w1, qipaidui, qipaishu);
                return i;
                break;
            }
        }
    }
}
int Jiedao(wujiang *w1, wujiang *w2, pai paidui[104], int *paiduishu, pai qipaidui[104], int *qipaishu) {
    int i, j = 0, x;

    if ((*w1).juese) {
        for (x = 0; x < ((*w2).shoupaishu); x++) {
            if ((*w2).shoupai[x].leixing == 101) {
                printf("电脑对玩家使用");
                ((*w2).shoupai)[x].Kanpai();
                qipaidui[*qipaishu] = ((*w2).shoupai)[x];

                for (int i = x + 1; i <= ((*w2).shoupaishu); i++)
                    ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

                ((*w2).shoupaishu)--;
                (*qipaishu)++;
                j = 1;
                break;
            }
        }

        if (j) {
            i = Sha(w2, w1, paidui, paiduishu, qipaidui, qipaishu);
            return i;
            printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n", (*w1).tili, (*w1).tilishangxian,
                   (*w2).tili, (*w2).tilishangxian);
        } else {
            printf("电脑放弃使用【杀】,玩家获得电脑的武器");
            (*w2).zhuangbei[0].Kanpai();
            (*w1).shoupai[(*w1).shoupaishu] = ((*w2).zhuangbei)[0];
            ((*w2).zhuangbeishu)--;
            ((*w1).shoupaishu)++;
            ((*w2).zhuangbei)[0].leixing = -1;
            ((*w2).zhuangbei)[0].changdu = 1;
            (*w1).Kanshoupai();
            return 0;
        }
    } else {
        for (;;) {
            printf("请对电脑使用一张【杀】,否则电脑将获得你的武器!\n请输入手牌之前的编号,或者输入“-1”放弃出【杀】,以回车结束!\n");

            if (((*w2).zhuangbei[0].leixing == 305))
                printf("如果想发动【丈八蛇矛】效果,请输入“100”,以回车结束!\n");

            (*w2).Kanshoupai();
            scanf("%d", &x);

            if (x == -1)
                break;
            else if (((*w2).zhuangbei[0].leixing == 305) && x == 100) {
                pai p = Zhangba(w2, qipaidui, qipaishu);
                p.paifu = -1;
                printf("使用!\n");
                j = 1;
                break;
            } else if ((*w2).shoupai[x].leixing == 101) {
                printf("玩家对电脑使用");
                ((*w2).shoupai)[x].Kanpai();
                qipaidui[*qipaishu] = ((*w2).shoupai)[x];

                for (i = x + 1; i <= ((*w2).shoupaishu); i++)
                    ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

                ((*w2).shoupaishu)--;
                (*qipaishu)++;
                j = 1;
                break;
            } else
                printf("你确定你使用的是【杀】?\n");
        }

        if (j) {
            i = Sha(w2, w1, paidui, paiduishu, qipaidui, qipaishu);
            return i;
            printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n", (*w2).tili, (*w2).tilishangxian,
                   (*w1).tili, (*w1).tilishangxian);
        } else {
            printf("玩家放弃使用【杀】,电脑获得玩家的武器");
            ((*w2).zhuangbei)[0].Kanpai();
            (*w1).shoupai[(*w1).shoupaishu] = ((*w2).zhuangbei)[0];
            ((*w2).zhuangbeishu)--;
            ((*w1).shoupaishu)++;
            ((*w2).zhuangbei)[0].leixing = -1;
            ((*w2).zhuangbei)[0].changdu = 1;
            return 0;
        }
    }
}
void Taoyuan(wujiang *w) {
    if ((*w).tili < (*w).tilishangxian) {
        ((*w).tili)++;

        if ((*w).juese)
            printf("玩家");
        else
            printf("电脑");

        printf("恢复1点体力!\n");
    }
}
void Kaipai(pai paidui[104], int *paiduishu, int renshu, pai wugu[10]) {
    int i;
    printf("五谷丰登开牌:\n");

    for (i = 1; i <= renshu; i++) {
        wugu[i - 1] = paidui[104 - (*paiduishu)];
        (*paiduishu)--;
        printf("%d ", i - 1);
        wugu[i - 1].Kanpai();
    }
}
void Qupai(pai wugu[10], wujiang *w) {
    int i, x;
    printf("五谷丰登开牌:\n");

    for (i = 0; (wugu[i].leixing) != -1; i++) {
        printf("%d ", i);
        wugu[i].Kanpai();
    }

    if ((*w).juese) {
        for (;;) {
            printf("请选择你想要的卡牌,输入卡牌之前的编号,以回车结束!\n");
            scanf("%d", &x);

            if (wugu[x].leixing != -1) {
                printf("玩家选择");
                wugu[x].Kanpai();
                (*w).shoupai[(*w).shoupaishu] = wugu[x];
                ((*w).shoupaishu)++;

                for (i = x + 1; i <= 9; i++)
                    wugu[i - 1] = wugu[i];

                wugu[9].leixing = -1;
                break;
            }

            printf("你选择了一张空气加入手牌!");
        }
    } else {
        printf("电脑选择");
        wugu[0].Kanpai();
        (*w).shoupai[(*w).shoupaishu] = wugu[0];
        ((*w).shoupaishu)++;

        for (i = 1; i <= 9; i++)
            wugu[i - 1] = wugu[i];

        wugu[9].leixing = -1;
    }
}
void Rengpai(pai wugu[10], pai qipaidui[104], int *qipaishu) {
    int i;

    for (i = 0; wugu[i].leixing != -1; i++) {
        qipaidui[*qipaishu] = wugu[i];
        (*qipaishu)++;
        wugu[i].leixing = -1;
    }
}
int Nanman(wujiang *w1, wujiang *w2, pai qipaidui[104], int *qipaishu) {
    int i, x;

    if ((*w1).juese) {
        for (x = 0; x < ((*w2).shoupaishu); x++) {
            if ((*w2).shoupai[x].leixing == 101) {
                printf("电脑打出");
                ((*w2).shoupai)[x].Kanpai();
                qipaidui[*qipaishu] = ((*w2).shoupai)[x];

                for (int i = x + 1; i <= ((*w2).shoupaishu); i++)
                    ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

                ((*w2).shoupaishu)--;
                (*qipaishu)++;
                return 0;
                break;
            }
        }

        printf("玩家对电脑造成1点伤害!\n");
        ((*w2).tili)--;
        i = Binsi(w1, w2, qipaidui, qipaishu);
        return i;
    } else {
        for (;;) {
            printf("请打出一张【杀】响应【南蛮入侵】,否则你将受到1点伤害!\n请输入手牌之前的编号,或者输入“-1”放弃出【杀】,以回车结束!\n");

            if (((*w2).zhuangbei[0].leixing == 305))
                printf("如果想发动【丈八蛇矛】效果,请输入“100”,以回车结束!\n");

            (*w2).Kanshoupai();
            scanf("%d", &x);

            if (x == -1) {
                int i;
                ((*w2).tili)--;
                printf("电脑对玩家造成1点伤害!\n");
                i = Binsi(w1, w2, qipaidui, qipaishu);
                return i;
                break;
            } else if (((*w2).zhuangbei[0].leixing == 305) && x == 100) {
                pai p = Zhangba(w2, qipaidui, qipaishu);
                p.paifu = -1;
                printf("使用!\n");
                return 0;
                break;
            } else if ((*w2).shoupai[x].leixing == 101) {
                printf("玩家打出");
                ((*w2).shoupai)[x].Kanpai();
                qipaidui[*qipaishu] = ((*w2).shoupai)[x];

                for (i = x + 1; i <= ((*w2).shoupaishu); i++)
                    ((*w2).shoupai)[i - 1] = ((*w2).shoupai)[i];

                ((*w2).shoupaishu)--;
                (*qipaishu)++;
                return 0;
                break;
            } else
                printf("你确定你打出的是【杀】?\n");
        }
    }
}
int Wanjian(wujiang *w1, wujiang *w2, pai paidui[104], int *paiduishu, pai qipaidui[104], int *qipaishu) {
    int i;
    i = Shan(w1, w2, paidui, paiduishu, qipaidui, qipaishu);

    if (i == -1) {
        i = Binsi(w1, w2, qipaidui, qipaishu);
        return i;
    } else
        return 0;
}
int Chupai(pai paidui[104], pai qipaidui[104], int *paiduishu, int *qipaishu, wujiang *w1, wujiang *w2,
           pai yuanshipaidui[2][4][13]) {
    pai p1;
    int sha = 1;
    int y = -1, i, t = ((*w1).shoupaishu) - 1;

    for (;; t--) {
        if ((*w1).juese) {
            printf("\n电脑当前手牌数:%d\n", ((*w2).shoupaishu));
            (*w2).Kanzhuangbei();
            (*w1).Kanshoupai();
            (*w1).Kanzhuangbei();
        }

        int j = 0;

        if ((*w1).juese && ((*w1).zhuangbei[0].leixing == 305))
            printf("如果想发动【丈八蛇矛】效果,请输入“100”,以回车结束!\n");

        y = Xuanpai(w1, t);
        p1 = Panpai(w1, &sha, y, qipaidui, qipaishu);

        if ((p1).leixing == -1)
            break;
        else if ((p1).leixing == 0)
            continue;
        else {
            int duixiang;
            duixiang = Mubiao(p1, w1, w2, &sha);

            if (duixiang == -2)
                continue;
            else {
                Da1pai(w1, w2, qipaidui, qipaishu, y);
                Miaoshu(p1, ((*w1).juese), duixiang);

                if (!((*w1).juese)) {
                    printf("\n电脑当前手牌数:%d\n", ((*w1).shoupaishu));
                    (*w1).Kanzhuangbei();
                    (*w2).Kanshoupai();
                    (*w2).Kanzhuangbei();
                }

                switch (p1.leixing) {
                case 101:
                    i = Sha(w1, w2, paidui, paiduishu, qipaidui, qipaishu);

                    if (i == -1) {
                        return -1;
                        break;
                    }

                    if ((*w1).juese)
                        printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n", (*w1).tili, (*w1).tilishangxian,
                               (*w2).tili, (*w2).tilishangxian);
                    else
                        printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n", (*w2).tili, (*w2).tilishangxian,
                               (*w1).tili, (*w1).tilishangxian);

                    break;

                case 103:
                    Tao(w1);
                    break;

                case 201:
                    for (;;) {
                        i = Wuxie(&p1, w1, w2, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                        i = Wuxie(&p1, w2, w1, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                    }

                    if (!(j % 2))
                        Chai(w1, w2, qipaidui, qipaishu);
                    else;

                    if ((*w1).juese)
                        (*w1).Kanshoupai();

                    break;

                case 202:
                    for (;;) {
                        i = Wuxie(&p1, w1, w2, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                        i = Wuxie(&p1, w2, w1, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                    }

                    if (!(j % 2))
                        Qian(w1, w2);
                    else;

                    if ((*w1).juese)
                        (*w1).Kanshoupai();

                    break;

                case 203:
                    for (;;) {
                        i = Wuxie(&p1, w1, w2, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                        i = Wuxie(&p1, w2, w1, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                    }

                    if (!(j % 2))
                        Wuzhong(w1, paidui, paiduishu, qipaidui, qipaishu);
                    else;

                    break;

                case 204:
                    for (;;) {
                        i = Wuxie(&p1, w1, w2, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                        i = Wuxie(&p1, w2, w1, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                    }

                    if (!(j % 2)) {
                        i = Juedou(w1, w2, qipaidui, qipaishu);

                        if (i == -1)
                            return -1;

                        if ((*w1).juese)
                            printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n", (*w1).tili, (*w1).tilishangxian,
                                   (*w2).tili, (*w2).tilishangxian);
                        else
                            printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n", (*w2).tili, (*w2).tilishangxian,
                                   (*w1).tili, (*w1).tilishangxian);
                    }

                    break;

                case 205:
                    for (;;) {
                        i = Wuxie(&p1, w1, w2, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                        i = Wuxie(&p1, w2, w1, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                    }

                    if (!(j % 2)) {
                        i = Jiedao(w1, w2, paidui, paiduishu, qipaidui, qipaishu);

                        if (i == -1)
                            return -1;

                        if ((*w1).juese)
                            printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n", (*w1).tili, (*w1).tilishangxian,
                                   (*w2).tili, (*w2).tilishangxian);
                        else
                            printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n", (*w2).tili, (*w2).tilishangxian,
                                   (*w1).tili, (*w1).tilishangxian);
                    }

                    break;

                case 206:
                    for (;;) {
                        i = Wuxie(&p1, w1, w2, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                        i = Wuxie(&p1, w2, w1, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                    }

                    if (!(j % 2))
                        Taoyuan(w1);

                    j = 0;

                    for (;;) {
                        i = Wuxie(&p1, w2, w1, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                        i = Wuxie(&p1, w2, w1, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                    }

                    if (!(j % 2))
                        Taoyuan(w2);

                    break;

                case 207:
                    pai wugu[10];

                    for (i = 1; i <= 10; i++)
                        wugu[i - 1].leixing = -1;

                    Kaipai(paidui, paiduishu, 2, wugu);

                    for (;;) {
                        i = Wuxie(&p1, w1, w2, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                        i = Wuxie(&p1, w2, w1, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                    }

                    if (!(j % 2))
                        Qupai(wugu, w1);

                    for (;;) {
                        i = Wuxie(&p1, w2, w1, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                        i = Wuxie(&p1, w2, w1, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                    }

                    if (!(j % 2))
                        Qupai(wugu, w2);

                    Rengpai(wugu, qipaidui, qipaishu);
                    printf("弃牌数:%d\n", *qipaishu);
                    break;

                case 208:
                    for (;;) {
                        i = Wuxie(&p1, w1, w2, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                        i = Wuxie(&p1, w2, w1, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                    }

                    if (!(j % 2)) {
                        i = Nanman(w1, w2, qipaidui, qipaishu);

                        if (i == -1)
                            return -1;

                        if ((*w1).juese)
                            printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n", (*w1).tili, (*w1).tilishangxian,
                                   (*w2).tili, (*w2).tilishangxian);
                        else
                            printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n", (*w2).tili, (*w2).tilishangxian,
                                   (*w1).tili, (*w1).tilishangxian);
                    }

                    break;

                case 209:
                    for (;;) {
                        i = Wuxie(&p1, w1, w2, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                        i = Wuxie(&p1, w2, w1, qipaidui, qipaishu, 0);

                        if (!i)
                            break;

                        j++;
                    }

                    if (!(j % 2)) {
                        i = Wanjian(w1, w2, paidui, paiduishu, qipaidui, qipaishu);

                        if (i == -1)
                            return -1;

                        if ((*w1).juese)
                            printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n", (*w1).tili, (*w1).tilishangxian,
                                   (*w2).tili, (*w2).tilishangxian);
                        else
                            printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n", (*w2).tili, (*w2).tilishangxian,
                                   (*w1).tili, (*w1).tilishangxian);
                    }

                    break;

                case 361:
                case 362:
                case 363:
                    ((*w1).juli[0])--;
                    break;

                case 381:
                case 382:
                case 383:
                    ((*w2).juli[0])++;
                    break;

                default:
                    break;
                }

                printf("\n");
            }
        }
    }

    return 0;
}
void Qipai(pai shoupai[20], int *shoupaishu, pai qipaidui[104], int *qipaishu, int juese,
           int *shoupaishangxian) {
    int x;

    if ((*shoupaishu) > (*shoupaishangxian)) {
        if (juese != 1 && juese != 0)
            printf("身份参数错误!");

        int q = (*shoupaishu) - (*shoupaishangxian);
        int i, j;

        for (j = 1; j <= q; j++) {
            for (;;) {
                if (juese) {
                    printf("弃牌请输入手牌之前的编号,以回车结束!\n注:一次只能弃一张牌\n");
                    printf("手牌数:%d\n", *shoupaishu);
                    scanf("%d", &x);

                    if (x >= 0 && x < (*shoupaishu))
                        break;
                    else
                        printf("你弃掉了一张空气!\n");
                } else {
                    srand((unsigned)time(NULL));
                    x = rand() % (*shoupaishu);
                    break;
                }
            }

            qipaidui[*qipaishu] = shoupai[x];

            for (i = x + 1; i <= (*shoupaishu); i++)
                shoupai[i - 1] = shoupai[i];

            (*shoupaishu)--;

            if (juese)
                printf("弃牌阶段玩家弃置");
            else
                printf("弃牌阶段电脑弃置");

            qipaidui[*qipaishu].Kanpai();
            (*qipaishu)++;
            int m;

            if (juese) {
                printf("玩家当前手牌:\n");

                for (m = 0; m <= (*shoupaishu - 1); m++) {
                    printf("%d ", m);
                    (shoupai[m]).Kanpai();
                }
            }

            printf("弃牌堆:%d\n", *qipaishu);
        }
    }
}
int Huihe(pai A[104], pai B[104], int *x, int *y, pai yuanshipaidui[2][4][13], wujiang *w1, wujiang *w2) {
    printf("\n回合开始阶段……\n");

    switch ((*w1).huihekaishi) {
    case 0:
        break;

    default:
        printf("回合开始阶段参数错误!\n");
        break;
    }

    printf("判定阶段……\n");
    int K = 0;

    if ((*w1).pandingshu > 0) {
        int i, j;

        for (; (*w1).pandingshu;) {
            switch ((*w1).pandingpai[0].leixing) {
            case 251:
                printf("【乐不思蜀】开始判定……\n");
                break;

            case 252:
                printf("【闪电】开始判定……\n");
                break;

            default:
                printf("【??】开始判定……\n");
                break;
            }

            j = 0;
            pai p = ((*w1).pandingpai[0]);

            for (;;) { //在判定之前询问【无懈】
                i = Wuxie(&p, w2, w1, B, y, 0);

                if (!i)
                    break;

                j++;
                i = Wuxie(&p, w1, w2, B, y, 0);

                if (!i)
                    break;

                j++;
            }

            switch ((*w1).pandingpai[0].leixing) {
            case 251:
                if (!(j % 2)) {
                    printf("【乐不思蜀】的判定牌是:");
                    Panding(A, x, B, y);

                    if ((B[(*y) - 1].huase) != 1) {
                        printf("【乐不思蜀】判定成功!\n");

                        if ((*w1).juese)
                            printf("玩家");
                        else
                            printf("电脑");

                        printf("跳过出牌阶段!\n");
                        K = -1;
                    } else
                        printf("【乐不思蜀】判定失败!\n");
                }

                B[*y] = (*w1).pandingpai[0];
                ((*w1).pandingshu)--;
                (*w1).pandingpai[0] = (*w1).pandingpai[1];
                (*w1).pandingpai[1] = (*w1).pandingpai[2];
                (*w1).pandingpai[2].leixing = -1;
                (*y)++;
                break;

            case 252:
                if (!(j % 2)) {
                    printf("【闪电】的判定牌是:");
                    Panding(A, x, B, y);

                    if ((B[(*y) - 1].huase == 0) && (B[(*y) - 1].dianshu >= 1) && (B[(*y) - 1].dianshu <= 8)) {
                        printf("【闪电】判定成功!\n");

                        if ((*w1).juese)
                            printf("玩家");
                        else
                            printf("电脑");

                        printf("受到3点雷电伤害!");
                        ((*w1).tili) = ((*w1).tili) - 3;
                        i = Binsi(w2, w1, B, y);
                        B[*y] = (*w1).pandingpai[0];
                        ((*w1).pandingshu)--;
                        (*w1).pandingpai[0] = (*w1).pandingpai[1];
                        (*w1).pandingpai[1] = (*w1).pandingpai[2];
                        (*w1).pandingpai[2].leixing = -1;
                        (*y)++;

                        if (i == -1)
                            return -1;
                    } else {
                        printf("【闪电】判定失败!\n");
                        (*w2).pandingpai[2] = (*w2).pandingpai[1];
                        (*w2).pandingpai[1] = (*w2).pandingpai[0];
                        (*w2).pandingpai[0] = (*w1).pandingpai[0];
                        (*w1).pandingpai[0] = (*w1).pandingpai[1];
                        (*w1).pandingpai[1] = (*w1).pandingpai[2];
                        (*w1).pandingpai[2].leixing = -1;
                        ((*w1).pandingshu)--;
                        ((*w2).pandingshu)++;
                    }

                    break;
                }

            default:
                printf("判定牌错误!");
            }

            printf("弃牌数:%d\n", *y);
        }
    } else if (!((*w1).pandingshu));
    else
        printf("判定阶段参数错误!\n");

    printf("摸牌阶段……\n");

    switch ((*w1).mopai) {
    case 0:
        Mopai(&((*w1).shoupaishu), (*w1).shoupai, A, x, B, y, (*w1).juese);
        break;

    case -1:
        break;

    default:
        printf("摸牌阶段参数错误!\n");
        break;
    }

    if (K == -1)
        goto M;

    printf("出牌阶段……\n");

    switch ((*w1).chupai) {
    case 0: {
        int i;
        i = Chupai(A, B, x, y, w1, w2, yuanshipaidui);

        if (i == -1) {
            return -1;
            break;
        } else
            break;
    }

    case -1:
        break;

    default:
        printf("出牌阶段参数错误!\n");
        break;
    }

M:

    printf("弃牌阶段……\n");

    switch ((*w1).qipai) {
    case 0:
        Qipai((*w1).shoupai, &((*w1).shoupaishu), B, y, (*w1).juese, &((*w1).tili));
        break;

    default:
        printf("弃牌阶段参数错误!\n");
        break;
    }

    printf("回合结束阶段……\n");

    switch ((*w1).huihejieshu) {
    case 0:
        break;

    default:
        printf("回合结束阶段参数错误!\n");
        break;
    }

    return 0;
}
int main() {
    void Kanshoupai(pai p);
    pai yuanshipaidui[2][4][13], qipaidui[104], paidui[104];
    wujiang wanjia, com;
    com.tili = wanjia.tili = 5;
    com.tilishangxian = wanjia.tilishangxian = 5;
    com.huihekaishi = wanjia.huihekaishi = 0;
    com.panding = wanjia.panding = 0;
    com.mopai = wanjia.mopai = 0;
    com.chupai = wanjia.chupai = 0;
    com.qipai = wanjia.qipai = 0;
    com.huihejieshu = wanjia.huihejieshu = 0;
    com.shoupaishu = wanjia.shoupaishu = 0;
    com.pandingshu = wanjia.pandingshu = 0;
    com.zhuangbeishu = wanjia.zhuangbeishu = 0;
    com.juese = 0;
    wanjia.juese = 1;
    pai p;
    p.leixing = -1;
    com.zhuangbei[0] = com.zhuangbei[1] = com.zhuangbei[2] = com.zhuangbei[3] = wanjia.zhuangbei[0] =
            wanjia.zhuangbei[1] = wanjia.zhuangbei[2] = wanjia.zhuangbei[3] = p;
    com.zhuangbei[0].changdu = wanjia.zhuangbei[0].changdu = 1;
    com.pandingpai[0] = com.pandingpai[1] = com.pandingpai[2] = wanjia.pandingpai[0] = wanjia.pandingpai[1] =
            wanjia.pandingpai[2] = p;
    com.juli[0] = wanjia.juli[0] = 1;
    int a, b, c;

    for (a = 0; a <= 1; a++) {
        for (b = 0; b <= 3; b++) {
            for (c = 0; c <= 12; c++) {
                yuanshipaidui[a][b][c].paifu = a;
                yuanshipaidui[a][b][c].huase = b;
                yuanshipaidui[a][b][c].dianshu = c;
            }
        }
    }

    yuanshipaidui[0][0][0].leixing = 204;
    yuanshipaidui[0][0][1].leixing = 331;
    yuanshipaidui[0][0][2].leixing = 201;
    yuanshipaidui[0][0][3].leixing = 201;
    yuanshipaidui[0][0][4].leixing = 304;
    yuanshipaidui[0][0][4].changdu = 3;
    yuanshipaidui[0][0][5].leixing = 251;
    yuanshipaidui[0][0][6].leixing = 101;
    yuanshipaidui[0][0][7].leixing = 101;
    yuanshipaidui[0][0][8].leixing = 101;
    yuanshipaidui[0][0][9].leixing = 101;
    yuanshipaidui[0][0][10].leixing = 202;
    yuanshipaidui[0][0][11].leixing = 201;
    yuanshipaidui[0][0][12].leixing = 208;
    yuanshipaidui[0][1][0].leixing = 209;
    yuanshipaidui[0][1][1].leixing = 102;
    yuanshipaidui[0][1][2].leixing = 103;
    yuanshipaidui[0][1][3].leixing = 103;
    yuanshipaidui[0][1][4].leixing = 308;
    yuanshipaidui[0][1][4].changdu = 5;
    yuanshipaidui[0][1][5].leixing = 103;
    yuanshipaidui[0][1][6].leixing = 103;
    yuanshipaidui[0][1][7].leixing = 103;
    yuanshipaidui[0][1][8].leixing = 103;
    yuanshipaidui[0][1][9].leixing = 101;
    yuanshipaidui[0][1][10].leixing = 101;
    yuanshipaidui[0][1][11].leixing = 103;
    yuanshipaidui[0][1][12].leixing = 102;
    yuanshipaidui[0][2][0].leixing = 204;
    yuanshipaidui[0][2][1].leixing = 101;
    yuanshipaidui[0][2][2].leixing = 101;
    yuanshipaidui[0][2][3].leixing = 101;
    yuanshipaidui[0][2][4].leixing = 101;
    yuanshipaidui[0][2][5].leixing = 101;
    yuanshipaidui[0][2][6].leixing = 101;
    yuanshipaidui[0][2][7].leixing = 101;
    yuanshipaidui[0][2][8].leixing = 101;
    yuanshipaidui[0][2][9].leixing = 101;
    yuanshipaidui[0][2][10].leixing = 101;
    yuanshipaidui[0][2][11].leixing = 205;
    yuanshipaidui[0][2][12].leixing = 205;
    yuanshipaidui[0][3][0].leixing = 204;
    yuanshipaidui[0][3][1].leixing = 102;
    yuanshipaidui[0][3][2].leixing = 102;
    yuanshipaidui[0][3][3].leixing = 102;
    yuanshipaidui[0][3][4].leixing = 102;
    yuanshipaidui[0][3][5].leixing = 101;
    yuanshipaidui[0][3][6].leixing = 101;
    yuanshipaidui[0][3][7].leixing = 101;
    yuanshipaidui[0][3][8].leixing = 101;
    yuanshipaidui[0][3][9].leixing = 101;
    yuanshipaidui[0][3][10].leixing = 102;
    yuanshipaidui[0][3][11].leixing = 103;
    yuanshipaidui[0][3][12].leixing = 101;
    yuanshipaidui[1][0][0].leixing = 252;
    yuanshipaidui[1][0][1].leixing = 302;
    yuanshipaidui[1][0][1].changdu = 2;
    yuanshipaidui[1][0][2].leixing = 202;
    yuanshipaidui[1][0][3].leixing = 202;
    yuanshipaidui[1][0][4].leixing = 383;
    yuanshipaidui[1][0][5].leixing = 303;
    yuanshipaidui[1][0][5].changdu = 2;
    yuanshipaidui[1][0][6].leixing = 208;
    yuanshipaidui[1][0][7].leixing = 101;
    yuanshipaidui[1][0][8].leixing = 101;
    yuanshipaidui[1][0][9].leixing = 101;
    yuanshipaidui[1][0][10].leixing = 210;
    yuanshipaidui[1][0][11].leixing = 305;
    yuanshipaidui[1][0][11].changdu = 3;
    yuanshipaidui[1][0][12].leixing = 362;
    yuanshipaidui[1][1][0].leixing = 206;
    yuanshipaidui[1][1][1].leixing = 102;
    yuanshipaidui[1][1][2].leixing = 207;
    yuanshipaidui[1][1][3].leixing = 207;
    yuanshipaidui[1][1][4].leixing = 361;
    yuanshipaidui[1][1][5].leixing = 251;
    yuanshipaidui[1][1][6].leixing = 203;
    yuanshipaidui[1][1][7].leixing = 203;
    yuanshipaidui[1][1][8].leixing = 203;
    yuanshipaidui[1][1][9].leixing = 101;
    yuanshipaidui[1][1][10].leixing = 203;
    yuanshipaidui[1][1][11].leixing = 201;
    yuanshipaidui[1][1][12].leixing = 381;
    yuanshipaidui[1][2][0].leixing = 301;
    yuanshipaidui[1][2][0].changdu = 1;
    yuanshipaidui[1][2][1].leixing = 331;
    yuanshipaidui[1][2][2].leixing = 201;
    yuanshipaidui[1][2][3].leixing = 201;
    yuanshipaidui[1][2][4].leixing = 382;
    yuanshipaidui[1][2][5].leixing = 251;
    yuanshipaidui[1][2][6].leixing = 208;
    yuanshipaidui[1][2][7].leixing = 101;
    yuanshipaidui[1][2][8].leixing = 101;
    yuanshipaidui[1][2][9].leixing = 101;
    yuanshipaidui[1][2][10].leixing = 101;
    yuanshipaidui[1][2][11].leixing = 210;
    yuanshipaidui[1][2][12].leixing = 210;
    yuanshipaidui[1][3][0].leixing = 301;
    yuanshipaidui[1][3][0].changdu = 1;
    yuanshipaidui[1][3][1].leixing = 102;
    yuanshipaidui[1][3][2].leixing = 202;
    yuanshipaidui[1][3][3].leixing = 202;
    yuanshipaidui[1][3][4].leixing = 306;
    yuanshipaidui[1][3][4].changdu = 3;
    yuanshipaidui[1][3][5].leixing = 102;
    yuanshipaidui[1][3][6].leixing = 102;
    yuanshipaidui[1][3][7].leixing = 102;
    yuanshipaidui[1][3][8].leixing = 102;
    yuanshipaidui[1][3][9].leixing = 102;
    yuanshipaidui[1][3][10].leixing = 102;
    yuanshipaidui[1][3][11].leixing = 307;
    yuanshipaidui[1][3][11].changdu = 4;
    yuanshipaidui[1][3][12].leixing = 363;
    int paiduishu = 104;
    int qipaishu = 0;
    printf("游戏开始!\n");
    Qishixipai(yuanshipaidui, paidui);
    Qishishoupai(&wanjia, paidui, &(paiduishu), qipaidui, &(qipaishu));
    Qishishoupai(&com, paidui, &(paiduishu), qipaidui, &(qipaishu));
    int i;

    for (;;) {
        i = Huihe(paidui, qipaidui, &paiduishu, &qipaishu, yuanshipaidui, &wanjia, &com);

        if (i == -1)
            break;

        i = Huihe(paidui, qipaidui, &paiduishu, &qipaishu, yuanshipaidui, &com, &wanjia);

        if (i == -1)
            break;
    }
}
posted @ 2019-12-29 09:43  _xuefeng  阅读(16)  评论(0编辑  收藏  举报