俄罗斯轮盘小游戏(三国杀MOD版)

· · 个人记录

//作者:洛谷813622、989571
//严禁搬迁
//这个版本是三国杀MOD4.2版本
#include<bits/stdc++.h>
#include<windows.h>
#define clr system("cls")
#define int unsigned long long
using namespace std;
string dj[] = {"放大镜", "芙蓉王", "小刀", "饮料", "手铐", "诸葛连弩", "青釭剑", "方天画戟", "白银狮子"}, zd[] = {"空弹", "实弹"};
string pl1, pl2;
bool is1 = 1, sk, zs; //sk:手铐 zs:打自己
int yu, kb, sd, b1 = 2, b2 = 2, ls = 1, hit = 1, mxb = 2, jl, zgln, qhj, fthj1 = 1, fthj2 = 1, djs = 1, bysz1, bysz2, sl1, sl2; //jl:记录被挂手铐后局数
vector<int>dj1, dj2;
queue<int>g;//枪械装弹
void b11() {
    if (b1 <= 0 || b1 > 999999999) b1 = 0;
    return ;
}
void b22() {
    if (b2 <= 0 || b2 > 999999999) b2 = 0;
    return ;
}
signed main() {
    cout << "玩家1的名字:";
    cin >> pl1;
    cout << "玩家2的名字:";
    cin >> pl2;
    clr;
    cout << "现在讲解规则:\n小刀:可以让下一发子弹伤害变成两倍\n芙蓉王:可以回1滴血\n放大镜:你可以查看当前子弹\n饮料:可以退一发子弹\n手铐:可以限制对方一回合动不了\n";
    cout << "\n三国杀版本特供道具:\n诸葛连弩:本回合无限连发直至所有子弹打完或攻击自己\n青釭剑:本回合攻击对面时空包弹转换为实弹\n方天画戟:本局游戏中如果你对对面发射的子弹为最后一发,你的伤害翻倍\n白银狮子:接下来受到的三次伤害固定为1点(可叠加),并在消耗完后回复1点血量(此效果不叠加)\n\n一共有4轮。\n";
    Sleep(1200);
    system("pause");
    clr;
start:
    ;
    if (ls == 5) {
        exit(0);
    }
    //初始化
    b1 = 3 * ls;
    b2 = 3 * ls;
    hit = 1;
    zs = 0;
    sk = 0;
    yu = 0;
    kb = 0;
    sd = 0;
    jl = 0;
    mxb = b1;
    dj1.clear();
    dj2.clear();
    while (g.size())g.pop();
    cout << "第" << ls << "局\n";
    Sleep(1200);
//    for(int i=1;i<=12;i++){
//      dj1.push_back(4);
//  }
    clr;
    while (1) {
        clr;
        srand(time(0));
        if (!yu) {
sc:
            ;
            cout << "现在开始上道具!\n" << pl1 << "(p1)获得了:";
            for (int i = 1; i <= rand()%5+3; i++) {
                int t = rand() % 5;
                if (rand() % 8 == 0) t = 5 + rand() % 4;
                dj1.push_back(t);
                cout << dj[t] << ' ';
                Sleep(80);
            }
            cout << "\n现在" << pl1 << "(p1)拥有道具:\n";
            for (auto v : dj1) {
                cout << dj[v] << ' ';
            }
            cout << '\n';
            Sleep(1200);
            system("pause");
            clr;
            cout << pl2 << "获得了:";
            for (int i = 1; i <= rand()%5+4; i++) {
                int t = rand() % 5;
                if (rand() % 8 == 0) t = 5 + rand() % 4;
                dj2.push_back(t);
                cout << dj[t] << ' ';
                Sleep(80);
            }
            cout << "\n现在" << pl2 << "(p2)拥有道具:\n";
            for (auto v : dj2) {
                cout << dj[v] << ' ';
            }
            cout << '\n';
            Sleep(200);
            system("pause");
            clr;
            kb = rand() % 7;
            sd = 6 - kb;
            yu = (kb + sd);
            int tk = kb, ts = sd;
            cout << "空包弹有:" << kb << " 实弹有:" << sd << '\n';
            cout << "装填子弹中......\n";
            srand(time(0));
            for (int i = 1; i <= yu; i++) {
                bool k = rand() % 2;
                if (k) {
                    if (tk) {
                        g.push(0);
                        --tk;
                    } else {
                        g.push(1);
                        --ts;
                    }
                } else {
                    if (ts) {
                        g.push(1);
                        --ts;
                    } else {
                        g.push(0);
                        --tk;
                    }
                }
            }
            Sleep(200);
        }
        cout << "\n现在" << pl1 << "(p1)拥有道具:\n";
        for (auto v : dj1) {
            cout << dj[v] << ' ';
        }
        cout << "\n现在" << pl2 << "(p2)拥有道具:\n";
        for (auto v : dj2) {
            cout << dj[v] << ' ';
        }
        cout << "\n生命值(p1,p2):" << b1 << "," << b2 << "\n";
        cout << "空包弹有:" << kb << "发,实弹有:" << sd << "发\n";
        if (is1) {
            cout << "现在是" << pl1 << "(p1)的回合\n";
use1:
            ;
            if (dj1.size()) {
                cout << "\n现在" << pl1 << "(p1)拥有道具:\n";
                for (auto v : dj1) {
                    cout << djs++ << ":" << dj[v] << ' ';
                }
                djs = 1;
                cout << "\n请告诉我要使用道具在你拥有的的编号(从1开始,0为不使用):";
                int bh;
quesd1:
                ;
                cin >> bh;
                if (bh) {
                    --bh;
                    if (bh > dj1.size() - 1 || bh < 0) {
                        cout << "不合法!\n请重新输入!";
                        goto quesd1;
                    } else {
                        int tmp = dj1[bh];
                        dj1.erase(dj1.begin() + bh);
                        switch (tmp) {
                            case 0: {
                                cout << "当前子弹:";
                                cout << zd[g.front()] << '\n';
                                Sleep(1500);
                                break;
                            }
                            case 1: {
                                if (b1 == mxb) {
                                    cout << "达到上限值,无法回复。";
                                    break;
                                }
                                b1 ++;
                                cout << "你选择了芙蓉王!\n" << pl1 << "回复1点血量,现在他有" << b1 << "条生命值!\n";
                                Sleep(1500);
                                break;
                            }
                            case 2: {
                                hit *= 2;
                                cout << "你选择了小刀!这一回合将造成双倍伤害!\n";
                                Sleep(1500);
                                break;
                            }
                            case 3: {
                                int tmpo = g.front();
                                g.pop();
                                cout << "你选择了饮料!退出的这发子弹是:" << zd[tmpo] << "!\n";
                                if (tmpo)--sd;
                                else --kb;
                                --yu;
                                Sleep(1500);
                                break;
                            }
                            case 4: {
                                if (sk) {
                                    cout << "别人已经被铐起来了.....将把手铐移至末尾!\n";
                                    dj1.push_back(4);
                                } else {
                                    sk = 1;
                                    jl = 0;
                                    cout << "你选择了手铐!下一回合敌人将无法移动!\n";
                                }
                                Sleep(1500);
                                break;
                            }
                            case 5: {
                                zgln = 1;
                                cout << "你选择了诸葛连弩!本回合你将无限连发直至所有子弹打完或攻击自己!\n";
                                Sleep(1500);
                                break;
                            }
                            case 6: {
                                qhj = 1;
                                cout << "你选择了青釭剑!本回合攻击对面时空包弹转换为实弹!\n";
                                Sleep(1500);
                                break;
                            }
                            case 7: {
                                fthj1 *= 2;
                                cout << "你选择了方天画戟!本局游戏中如果你对对面发射的子弹为最后一发,你的伤害翻倍!\n";
                                if (pl1 == "吕布") {
                                    fthj1 *= 5;
                                    cout << "由于你的姓名正确,方天画戟苏醒了!你的伤害变为翻10倍!\n";
                                }
                                Sleep(1500);
                                break;
                            }
                            case 8: {
                                bysz1 += 3;
                                cout << "你选择了白银狮子!你接下来受到的三次伤害固定为1点(可叠加),并在消耗完后回复1点血量(此效果不叠加)!\n";
                                Sleep(1500);
                                break;
                            }
                        }
                        if (!yu) {
                            goto sc;
                        }
                        goto use1;
                    }
                }

            }
            do {
                if (g.empty()) break;
                cout << "你要打谁?(0:自己 1:另一名玩家):";
                bool ht;
                cin >> ht;
                int k = g.front();
                if (ht) {
                    if (yu == 1) {
                        hit *= fthj1;
                        if (hit > 999999999) hit = 999999999;
                    }
                    if (qhj && !k) {
                        if (bysz2 > 0) {
                            hit = 1;
                            bysz2--;
                            cout << "青釭剑发动!空包弹变为了实弹!" << pl2 << "受到了" << hit << "点伤害!\n";
                            b2 -= hit;
                            if (bysz2 == 0) {
                                cout << "对方的白银狮子碎裂了!";
                                if (b2 != mxb) {
                                    b2++;
                                    cout << "对方回复1点血量!";
                                }
                                cout << "\n";
                            }
                        } else {
                            cout << "青釭剑发动!空包弹变为了实弹!" << pl2 << "受到了" << hit << "点伤害!\n";
                            b2 -= hit;
                        }
                        b22();
                        --kb;
                    } else if (k) {
                        if (bysz2 > 0) {
                            hit = 1;
                            bysz2--;
                            cout << "当前是实弹!" << pl2 << "受到了" << hit << "点伤害!\n";
                            b2 -= hit;
                            if (bysz2 == 0) {
                                cout << "对方的白银狮子碎裂了!";
                                if (b2 != mxb) {
                                    b2++;
                                    cout << "对方回复1点血量!";
                                }
                                cout << "\n";
                            }
                        } else {
                            cout << "当前是实弹!" << pl2 << "受到了" << hit << "点伤害!\n";
                            b2 -= hit;
                        }
                        b22();
                        --sd;
                    } else {
                        cout << "很遗憾,当前是空包弹。\n";
                        --kb;
                    }
                } else {
                    zgln = 0;
                    zs = 1;
                    if (k) {
                        cout << "哦豁,当前是实弹!" << pl1 << "受到了" << hit << "点伤害!\n";
                        b1 -= hit;
                        b11();
                        --sd;
                    } else {
                        cout << "恭喜你,当前是空包弹!\n";
                        --kb;
                    }
                }
                g.pop();
                Sleep(1000);
                --yu;
                hit = 1;
            } while (zgln);
            qhj = 0;
            zgln = 0;

        } else {
            cout << "现在是" << pl2 << "(p2)的回合\n";
use2:
            ;
            if (dj2.size()) {
                cout << "\n现在" << pl2 << "(p2)拥有道具:\n";
                for (auto v : dj2) {
                    cout << djs++ << ":" << dj[v] << ' ';
                }
                djs = 1;
                cout << "\n请告诉我要使用道具在你拥有的的编号(从1开始,0为不使用):";
                int bh;
quesd2:
                ;
                cin >> bh;
                if (bh) {
                    --bh;
                    if (bh > dj2.size() - 1 || bh < 0) {
                        cout << "不合法!\n请重新输入!";
                        goto quesd2;
                    } else {
                        int tmp = dj2[bh];
                        dj2.erase(dj2.begin() + bh);
                        switch (tmp) {
                            case 0: {
                                cout << "当前子弹:";
                                cout << zd[g.front()] << '\n';
                                Sleep(1500);
                                break;
                            }
                            case 1: {
                                if (b1 == mxb) {
                                    cout << "达到上限值,无法回复。";
                                    break;
                                }
                                b2 ++;
                                cout << "你选择了芙蓉王!\n" << pl2 << "回复1点血量,现在他有" << b2 << "条生命值!\n";
                                Sleep(1500);
                                break;
                            }
                            case 2: {
                                hit *= 2;
                                cout << "你选择了小刀!这一回合将造成双倍伤害!\n";
                                Sleep(1500);
                                break;
                            }
                            case 3: {
                                int tmpo = g.front();
                                g.pop();
                                cout << "你选择了饮料!退出的这发子弹是:" << zd[tmpo] << "!\n";
                                --yu;
                                if (tmpo) {
                                    --sd;
                                } else --kb;
                                Sleep(1500);
                                break;
                            }
                            case 4: {
                                if (sk) {
                                    cout << "别人已经被铐起来了......将把手铐移至末尾!\n";
                                    dj2.push_back(4);
                                } else {
                                    sk = 1;
                                    jl = 0;
                                    cout << "你选择了手铐!下一回合敌人将无法移动!\n";
                                }

                                Sleep(1500);
                                break;
                            }
                            case 5: {
                                zgln = 1;
                                cout << "你选择了诸葛连弩!本回合你将无限连发直至所有子弹打完或攻击自己!\n";
                                Sleep(1500);
                                break;
                            }
                            case 6: {
                                qhj = 1;
                                cout << "你选择了青釭剑!本回合攻击对面时空包弹转换为实弹!\n";
                                Sleep(1500);
                                break;
                            }
                            case 7: {
                                fthj2 *= 2;
                                cout << "你选择了方天画戟!本局游戏中如果你对对面发射的子弹为最后一发,你的伤害翻倍!\n";
                                if (pl2 == "吕布") {
                                    fthj2 *= 5;
                                    cout << "由于你的姓名正确,方天画戟苏醒了!你的伤害变为翻10倍!\n";
                                }
                                Sleep(1500);
                                break;
                            }
                            case 8: {
                                bysz2 += 3;
                                cout << "你选择了白银狮子!你接下来受到的三次伤害固定为1点(可叠加),并在消耗完后回复1点血量(此效果不叠加)!\n";
                                Sleep(1500);
                                break;
                            }
                        }
                        if (!yu) {
                            goto sc;
                        }
                        goto use2;
                    }
                }

            }
            do {
                if (g.empty()) break;
                cout << "你要打谁?(0:自己 1:另一名玩家):";
                bool ht;
                cin >> ht;
                int k = g.front();
                if (ht) {
                    if (yu == 1) {
                        hit *= fthj2;
                        if (hit > 999999999) hit = 999999999;
                    }
                    if (qhj && !k) {
                        if (bysz1) {
                            hit = 1;
                            bysz1--;
                            cout << "青釭剑发动!空包弹变为了实弹!" << pl1 << "受到了" << hit << "点伤害!\n";
                            b1 -= hit;
                            if (!bysz1) {
                                cout << "对方的白银狮子碎裂了!";
                                if (b1 != mxb) {
                                    b1++;
                                    cout << "对方回复1点血量!";
                                }
                                cout << "\n";
                            }
                        } else {
                            bysz1--;
                            cout << "青釭剑发动!空包弹变为了实弹!" << pl1 << "受到了" << hit << "点伤害!\n";
                            b1 -= hit;
                        }
                        b22();
                        --kb;
                    } else if (k) {
                        if (bysz1 > 0) {
                            hit = 1;
                            bysz1--;
                            cout << "当前是实弹!" << pl1 << "受到了" << hit << "点伤害!\n";
                            b1 -= hit;
                            if (bysz1 == 0) {
                                cout << "对方的白银狮子碎裂了!";
                                if (b1 != mxb) {
                                    b1++;
                                    cout << "对方回复1点血量!";
                                }
                                cout << "\n";
                            }
                        } else {
                            cout << "当前是实弹!" << pl1 << "受到了" << hit << "点伤害!\n";
                            b1 -= hit;
                        }
                        b22();
                        --sd;
                    } else {
                        cout << "很遗憾,当前是空包弹。\n";
                        --kb;
                    }
                } else {
                    zgln = 0;
                    zs = 1;
                    if (k) {
                        cout << "哦豁,当前是实弹!" << pl2 << "受到了" << hit << "点伤害!\n";
                        b2 -= hit;
                        b22();
                        --sd;
                    } else {
                        cout << "恭喜你,当前是空包弹!\n";
                        --kb;
                    }
                }
                g.pop();
                Sleep(1000);
                --yu;
                hit = 1;
            } while (zgln);
            qhj = 0;
            zgln = 0;
        }
        if (b1 <= 0) {
            cout << pl2 << "赢了!";
            Sleep(500);
            clr;
            ++ls;
            goto start;
        }
        if (b2 <= 0) {
            cout << pl1 << "赢了!";
            Sleep(500);
            clr;
            ++ls;
            goto start;
        }
        if (sk) {
            ++jl;
            if (jl == 2)sk = 0;
        }
        if (!sk && !zs) {
            is1 = 1 - is1;
        }
        zs = 0;
    }
    return 0;
}