俄罗斯轮盘小游戏(三国杀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;
}