- 编程
恶魔轮盘赌(真)
- @ 2026-2-25 16:48:32
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <vector>
#include <iomanip>
#include <algorithm>
using namespace std;
// 清屏函数(兼容Windows和Linux)
void clearScreen() {
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
// 子弹类型枚举
enum BulletType {
REAL, // 实弹
BLANK // 空包弹
};
// 道具枚举(原版核心道具)
enum ItemType {
NONE,
MAGNIFIER, // 放大镜:查看当前膛内子弹类型
KNIFE, // 小刀:下一发实弹伤害×2
BEER, // 啤酒:退出当前膛内子弹,转到下一发
CIGARETTE, // 香烟:恢复1点生命值
HANDCUFF, // 手铐:对手下回合跳过
ADRENALINE, // 肾上腺素:偷对手1个道具并使用
REVERSER, // 逆转器:反转当前子弹属性
EXPIRED_DRUG // 过期药物:40%+2血/60%-1血
};
// 道具结构体
struct Item {
ItemType type;
string name;
string desc;
int count; // 数量
bool used; // 是否本局已使用(限制强力道具)
Item(ItemType t, string n, string d, int c = 1) : type(t), name(n), desc(d), count(c), used(false) {}
};
// 游戏核心类
class DevilRoulette {
private:
// 子弹系统
vector<BulletType> bulletChambers; // 6个膛的子弹类型
int currentChamber; // 当前枪膛位置(索引0-5)
bool knifeEffect; // 小刀双倍伤害效果
// 生命值系统(胜负核心)
int playerHP; // 玩家生命值(初始5)
int devilHP; // 恶魔生命值(初始5)
// 游戏状态
bool isGameOver; // 游戏是否结束
string winner; // 获胜者
string loseReason; // 失败原因
bool devilSkipTurn; // 恶魔是否被手铐限制跳过回合
bool playerSkipTurn; // 玩家是否被手铐限制跳过回合
// 道具系统
vector<Item> playerItems; // 玩家道具栏
vector<Item> devilItems; // 恶魔道具栏
// 初始化轮盘(生成6个膛的子弹类型)
void initRoulette() {
bulletChambers.clear();
// 随机生成2-3发实弹,其余为空包弹(原版比例)
int realBulletCount = rand() % 2 + 2;
for (int i = 0; i < 6; i++) {
if (i < realBulletCount) {
bulletChambers.push_back(REAL);
} else {
bulletChambers.push_back(BLANK);
}
}
// 打乱子弹顺序
random_shuffle(bulletChambers.begin(), bulletChambers.end());
currentChamber = 0; // 索引从0开始
knifeEffect = false;
isGameOver = false;
winner = "";
loseReason = "";
devilSkipTurn = false;
playerSkipTurn = false;
// 初始化生命值
playerHP = 5;
devilHP = 5;
cout << "【恶魔轮盘赌】左轮已装填完毕!" << endl;
cout << "(系统视角)子弹分布:";
for (int i = 0; i < 6; i++) {
cout << (bulletChambers[i] == REAL ? "实弹" : "空包弹") << " ";
}
cout << endl;
// 初始化道具栏
initItems();
}
// 初始化道具栏
void initItems() {
// 玩家初始道具
playerItems.clear();
playerItems.push_back(Item(MAGNIFIER, "放大镜", "查看当前膛内子弹是实弹/空包弹", 2));
playerItems.push_back(Item(KNIFE, "小刀", "下一发实弹伤害×2(单局1次)", 1));
playerItems.push_back(Item(BEER, "啤酒", "退出当前膛内子弹,转到下一发", 1));
playerItems.push_back(Item(CIGARETTE, "香烟", "恢复1点生命值", 2));
playerItems.push_back(Item(HANDCUFF, "手铐", "恶魔下回合完全跳过", 1));
playerItems.push_back(Item(REVERSER, "逆转器", "反转当前子弹属性(单局1次)", 1));
playerItems.push_back(Item(EXPIRED_DRUG, "过期药物", "40%+2血/60%-1血", 1));
// 恶魔初始道具
devilItems.clear();
devilItems.push_back(Item(MAGNIFIER, "放大镜", "查看当前膛内子弹是实弹/空包弹", 1));
devilItems.push_back(Item(BEER, "啤酒", "退出当前膛内子弹,转到下一发", 1));
devilItems.push_back(Item(HANDCUFF, "手铐", "玩家下回合完全跳过", 1));
devilItems.push_back(Item(ADRENALINE, "肾上腺素", "偷玩家1个道具并使用", 1));
}
// 胜负判定核心函数
bool checkGameOver() {
if (playerHP <= 0) {
isGameOver = true;
winner = "恶魔";
loseReason = "你的生命值已耗尽";
return true;
}
if (devilHP <= 0) {
isGameOver = true;
winner = "玩家";
loseReason = "恶魔的生命值已耗尽";
return true;
}
return false;
}
// 开枪判定(含伤害计算)
void shoot(string shooter, string target) {
BulletType currentBullet = bulletChambers[currentChamber];
int damage = 1;
// 小刀双倍伤害效果
if (knifeEffect && currentBullet == REAL) {
damage = 2;
knifeEffect = false;
}
cout << "\n🔫 枪响了!当前膛内是【" << (currentBullet == REAL ? "实弹" : "空包弹") << "】" << endl;
if (currentBullet == REAL) {
cout << "💥 命中实弹!造成" << damage << "点伤害!" << endl;
if (target == "玩家") {
playerHP -= damage;
if (playerHP < 0) playerHP = 0;
cout << "你的生命值剩余:" << playerHP << "/5" << endl;
} else {
devilHP -= damage;
if (devilHP < 0) devilHP = 0;
cout << "恶魔的生命值剩余:" << devilHP << "/5" << endl;
}
// 开枪后立即检查胜负
if (checkGameOver()) {
return;
}
} else {
cout << "🔇 命中空包弹!无伤害!" << endl;
// 空包弹奖励:随机获得道具
if (shooter == "玩家") {
randomGetItem(playerItems, "玩家");
} else {
randomGetItem(devilItems, "恶魔");
}
}
// 枪膛转动到下一发
currentChamber = (currentChamber + 1) % 6;
}
// 显示道具栏
void showItems(vector<Item>& items, string owner) {
cout << "\n===== " << owner << "的道具栏 =====" << endl;
if (owner == "玩家") {
cout << "0. 不使用道具" << endl;
}
int validIdx = 1;
for (int i = 0; i < items.size(); i++) {
if (items[i].count > 0 && !items[i].used) {
cout << validIdx << ". " << items[i].name << " - " << items[i].desc
<< " (剩余: " << items[i].count << ")" << endl;
validIdx++;
}
}
cout << "======================" << endl;
}
// 使用道具
void useItem(int itemIdx, vector<Item>& userItems, vector<Item>& targetItems, string user) {
if (itemIdx == 0 || userItems.empty()) return; // 不使用道具
int validIdx = 1;
for (auto& item : userItems) {
if (item.count <= 0 || item.used) continue;
if (itemIdx == validIdx) {
cout << "\n" << user << "使用了【" << item.name << "】!" << endl;
item.count--;
// 强力道具标记为已使用(单局限制)
if (item.type == KNIFE || item.type == REVERSER || item.type == ADRENALINE) {
item.used = true;
}
switch (item.type) {
case MAGNIFIER:
cout << "🔍 放大镜生效!当前膛内是【"
<< (bulletChambers[currentChamber] == REAL ? "实弹" : "空包弹") << "】" << endl;
break;
case KNIFE:
knifeEffect = true;
cout << "🔪 小刀生效!下一发实弹伤害翻倍!" << endl;
break;
case BEER:
cout << "🍻 啤酒生效!退出当前膛内子弹,转到下一发!" << endl;
currentChamber = (currentChamber + 1) % 6;
cout << "当前枪膛已切换到第" << (currentChamber + 1) << "膛" << endl;
break;
case CIGARETTE:
if (user == "玩家") {
playerHP = min(playerHP + 1, 5);
cout << "🚬 香烟生效!你的生命值恢复1点,当前:" << playerHP << "/5" << endl;
} else {
devilHP = min(devilHP + 1, 5);
cout << "😈 恶魔使用香烟!生命值恢复1点,当前:" << devilHP << "/5" << endl;
}
break;
case HANDCUFF:
if (user == "玩家") {
devilSkipTurn = true;
cout << "🔗 手铐生效!恶魔下回合将被强制跳过!" << endl;
} else {
playerSkipTurn = true;
cout << "😈 恶魔使用手铐!你下回合将被强制跳过!" << endl;
}
break;
case ADRENALINE:
{
// 偷对手1个道具
vector<int> validItems;
for (int i = 0; i < targetItems.size(); i++) {
if (targetItems[i].count > 0 && targetItems[i].type != ADRENALINE) {
validItems.push_back(i);
}
}
if (!validItems.empty()) {
int stealIdx = validItems[rand() % validItems.size()];
Item& stolenItem = targetItems[stealIdx];
stolenItem.count--;
// 给自己增加该道具
bool found = false;
for (auto& it : userItems) {
if (it.type == stolenItem.type) {
it.count++;
found = true;
break;
}
}
if (!found) {
userItems.push_back(Item(stolenItem.type, stolenItem.name, stolenItem.desc, 1));
}
cout << "💉 肾上腺素生效!偷取了对手的【" << stolenItem.name << "】并立即使用!" << endl;
// 立即使用偷来的道具(递归调用)
if (user == "玩家") {
useItem(userItems.size(), userItems, targetItems, user);
}
} else {
cout << "💉 肾上腺素生效!但对手没有可偷的道具!" << endl;
}
}
break;
case REVERSER:
cout << "🔄 逆转器生效!当前子弹属性反转!" << endl;
bulletChambers[currentChamber] = (bulletChambers[currentChamber] == REAL) ? BLANK : REAL;
cout << "当前膛内变为【"
<< (bulletChambers[currentChamber] == REAL ? "实弹" : "空包弹") << "】" << endl;
break;
case EXPIRED_DRUG:
{
int randRate = rand() % 10;
if (randRate < 4) {
// 40%概率+2血
if (user == "玩家") {
playerHP = min(playerHP + 2, 5);
cout << "💊 过期药物生效!幸运加成!生命值+2,当前:" << playerHP << "/5" << endl;
} else {
devilHP = min(devilHP + 2, 5);
cout << "😈 恶魔使用过期药物!生命值+2,当前:" << devilHP << "/5" << endl;
}
} else {
// 60%概率-1血
if (user == "玩家") {
playerHP = max(playerHP - 1, 0);
cout << "💊 过期药物生效!副作用触发!生命值-1,当前:" << playerHP << "/5" << endl;
} else {
devilHP = max(devilHP - 1, 0);
cout << "😈 恶魔使用过期药物!副作用触发!生命值-1,当前:" << devilHP << "/5" << endl;
}
}
// 检查用药后是否游戏结束
checkGameOver();
}
break;
default:
break;
}
return;
}
validIdx++;
}
cout << "无效的道具选择!" << endl;
}
// 随机获得道具
void randomGetItem(vector<Item>& items, string owner) {
int randItem = rand() % 7 + 1; // 1-7对应7种道具
ItemType newType = static_cast<ItemType>(randItem);
// 查找道具并增加数量
bool found = false;
for (auto& item : items) {
if (item.type == newType) {
item.count++;
found = true;
cout << "\n🎁 " << owner << "获得了【" << item.name << "】x1" << endl;
break;
}
}
if (!found) {
// 新增道具(根据类型生成名称和描述)
string name, desc;
switch (newType) {
case MAGNIFIER: name = "放大镜"; desc = "查看当前膛内子弹是实弹/空包弹"; break;
case KNIFE: name = "小刀"; desc = "下一发实弹伤害×2(单局1次)"; break;
case BEER: name = "啤酒"; desc = "退出当前膛内子弹,转到下一发"; break;
case CIGARETTE: name = "香烟"; desc = "恢复1点生命值"; break;
case HANDCUFF: name = "手铐"; desc = "对手下回合完全跳过"; break;
case ADRENALINE: name = "肾上腺素"; desc = "偷对手1个道具并使用"; break;
case EXPIRED_DRUG: name = "过期药物"; desc = "40%+2血/60%-1血"; break;
default: return;
}
items.push_back(Item(newType, name, desc, 1));
cout << "\n🎁 " << owner << "获得了新道具【" << name << "】x1" << endl;
}
}
// 游戏结算界面
void gameSettlement() {
clearScreen();
cout << "========================================" << endl;
cout << " 游戏结算 " << endl;
cout << "========================================" << endl;
cout << "最终结果:" << (winner == "玩家" ? "🎉 你获胜了!" : "😈 你失败了!") << endl;
cout << "失败原因:" << loseReason << endl;
cout << "----------------------------------------" << endl;
cout << "你的最终生命值:" << playerHP << "/5" << endl;
cout << "恶魔最终生命值:" << devilHP << "/5" << endl;
cout << "----------------------------------------" << endl;
cout << "你的剩余道具:" << endl;
for (auto& item : playerItems) {
if (item.count > 0) {
cout << "- " << item.name << " x" << item.count << endl;
}
}
if (playerItems.empty()) {
cout << "- 无" << endl;
}
cout << "========================================" << endl;
cout << "\n⚠️ 重要提示:本游戏仅为虚拟娱乐,现实中严禁模仿!" << endl;
}
public:
// 构造函数
DevilRoulette() {
srand(time(0)); // 初始化随机数种子
initRoulette();
}
// 开始游戏
void startGame() {
// 游戏欢迎界面
clearScreen();
cout << "========================================" << endl;
cout << " 【恶魔轮盘赌】原版游戏 " << endl;
cout << "========================================" << endl;
cout << "⚠️ 重要提示:本游戏仅为虚拟娱乐," << endl;
cout << "⚠️ 现实中严禁模仿任何危险行为!" << endl;
cout << "----------------------------------------" << endl;
cout << "胜负规则:生命值降至0则失败,先耗尽HP者输!" << endl;
cout << "初始生命值:玩家5点 | 恶魔5点" << endl;
cout << "========================================" << endl;
cout << "按任意键开始游戏..." << endl;
cin.ignore();
cin.get();
clearScreen();
string currentPlayer = "玩家"; // 当前开枪者
int choice; // 玩家选择(1=朝自己,2=朝恶魔)
int itemChoice; // 道具选择
while (!isGameOver) {
cout << "========================================" << endl;
cout << " 回合开始 " << endl;
cout << "========================================" << endl;
cout << "当前枪膛:第" << (currentChamber + 1) << "膛" << endl;
cout << "生命值:你 [" << playerHP << "/5] | 恶魔 [" << devilHP << "/5]" << endl;
cout << "当前开枪者:" << currentPlayer << endl;
if (currentPlayer == "玩家") {
// 检查是否被手铐限制跳过回合
if (playerSkipTurn) {
cout << "\n🔗 你被恶魔的手铐限制!本回合强制跳过!" << endl;
playerSkipTurn = false;
currentPlayer = "恶魔";
cout << "\n按任意键进入恶魔回合..." << endl;
cin.ignore();
cin.get();
clearScreen();
continue;
}
// 玩家回合:先选择是否使用道具
showItems(playerItems, "玩家");
cout << "请选择要使用的道具(输入序号):";
cin >> itemChoice;
// 验证道具输入
int maxItemIdx = 0;
for (auto& item : playerItems) {
if (item.count > 0 && !item.used) maxItemIdx++;
}
while (itemChoice < 0 || itemChoice > maxItemIdx) {
cout << "输入无效!请重新选择(0-" << maxItemIdx << "):";
cin >> itemChoice;
}
// 使用道具
useItem(itemChoice, playerItems, devilItems, "玩家");
// 检查使用道具后是否游戏结束
if (isGameOver) break;
// 选择开枪目标
cout << "\n请选择开枪目标:" << endl;
cout << "1. 朝自己开枪" << endl;
cout << "2. 朝恶魔开枪" << endl;
cout << "输入选择(1/2):";
cin >> choice;
// 验证输入
while (choice != 1 && choice != 2) {
cout << "输入无效!请重新选择(1/2):";
cin >> choice;
}
cout << "\n你扣动了扳机...";
// 执行开枪
shoot("玩家", (choice == 1) ? "玩家" : "恶魔");
} else {
// 检查是否被手铐限制跳过回合
if (devilSkipTurn) {
cout << "\n🔗 恶魔被你的手铐限制!本回合强制跳过!" << endl;
devilSkipTurn = false;
currentPlayer = "玩家";
cout << "\n按任意键进入你的回合..." << endl;
cin.ignore();
cin.get();
clearScreen();
continue;
}
// 恶魔回合
cout << "\n😈 恶魔正在行动...";
// 恶魔随机选择是否使用道具(30%概率)
int useItemProb = rand() % 10;
if (useItemProb < 3 && !devilItems.empty()) {
showItems(devilItems, "恶魔");
int devilItemChoice = rand() % devilItems.size() + 1;
useItem(devilItemChoice, devilItems, playerItems, "恶魔");
// 检查恶魔使用道具后是否游戏结束
if (isGameOver) break;
}
// 恶魔随机选择开枪目标
choice = rand() % 2 + 1;
cout << "\n😈 恶魔选择朝" << (choice == 1 ? "自己" : "玩家") << "开枪!" << endl;
cout << "恶魔扣动了扳机...";
// 执行开枪
shoot("恶魔", (choice == 1) ? "恶魔" : "玩家");
}
// 切换回合(游戏未结束时)
if (!isGameOver) {
currentPlayer = (currentPlayer == "玩家") ? "恶魔" : "玩家";
cout << "\n按任意键进入下一回合..." << endl;
cin.ignore();
cin.get();
clearScreen();
}
}
// 游戏结算
gameSettlement();
}
};
int main() {
char playAgain;
do {
DevilRoulette game;
game.startGame();
// 询问是否重来
cout << "\n是否再来一局?(Y/N):";
cin >> playAgain;
while (playAgain != 'Y' && playAgain != 'y' && playAgain != 'N' && playAgain != 'n') {
cout << "输入无效!请输入Y/N:";
cin >> playAgain;
}
} while (playAgain == 'Y' || playAgain == 'y');
cout << "\n感谢游玩【恶魔轮盘赌】,再见!" << endl;
return 0;
}
0 条评论
目前还没有评论...