恶魔轮盘赌
2026-08-28 13:54:28
发布于:广东
#include <bits/stdc++.h>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
const int MAX_SHELLS = 8;
const int MAX_ITEMS = 8;
enum Item {
NONE = 0,
BEER,
CIGARETTE,
HANDCUFF,
MAGNIFYING_GLASS,
SAW
};
struct Character {
string name;
int hp;
int maxHp;
Item items[MAX_ITEMS];
int itemCount;
bool cuffed;
bool sawActive;
// -1 = 不知道
// 0 = 空包弹
// 1 = 实弹
int knownShell;
};
int shells[MAX_SHELLS];
int shellCount = 0;
int shellIndex = 0;
int liveRemaining = 0;
int blankRemaining = 0;
// =============================
// 基础工具
// =============================
void clearScreen() {
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
void pauseGame() {
cout << "\n按回车继续...";
cin.ignore(10000, '\n');
cin.get();
}
int randomInt(int l, int r) {
return l + rand() % (r - l + 1);
}
string itemName(Item item) {
switch (item) {
case BEER:
return "啤酒";
case CIGARETTE:
return "香烟";
case HANDCUFF:
return "手铐";
case MAGNIFYING_GLASS:
return "放大镜";
case SAW:
return "手锯";
default:
return "未知";
}
}
string shellName(int shell) {
if (shell == 1)
return "实弹";
return "空包弹";
}
// =============================
// UI
// =============================
void printLine() {
cout << "========================================\n";
}
void showCharacter(const Character &c) {
cout << c.name << "\n";
cout << "生命: ";
for (int i = 0; i < c.hp; i++)
cout << "? ";
for (int i = c.hp; i < c.maxHp; i++)
cout << "· ";
cout << " (" << c.hp << "/" << c.maxHp << ")\n";
cout << "道具: ";
if (c.itemCount == 0) {
cout << "无";
} else {
for (int i = 0; i < c.itemCount; i++) {
cout << "[" << i + 1 << "]"
<< itemName(c.items[i]);
if (i != c.itemCount - 1)
cout << " ";
}
}
cout << "\n";
if (c.sawActive)
cout << "状态: 下一发实弹伤害 ×2\n";
if (c.cuffed)
cout << "状态: 被手铐束缚\n";
}
void showGameState(const Character &player,
const Character &dealer) {
clearScreen();
printLine();
cout << " 恶 魔 轮 盘 赌\n";
printLine();
showCharacter(dealer);
cout << "\n";
cout << "弹仓剩余: "
<< shellCount - shellIndex
<< " 发\n";
cout << "实弹: "
<< liveRemaining
<< " 空包弹: "
<< blankRemaining
<< "\n";
cout << "\n";
showCharacter(player);
printLine();
}
// =============================
// 弹仓
// =============================
void shuffleShells() {
for (int i = shellCount - 1; i > 0; i--) {
int j = randomInt(0, i);
int temp = shells[i];
shells[i] = shells[j];
shells[j] = temp;
}
}
void loadShotgun() {
shellIndex = 0;
shellCount = randomInt(3, MAX_SHELLS);
int live = randomInt(1, shellCount - 1);
int blank = shellCount - live;
liveRemaining = live;
blankRemaining = blank;
int p = 0;
for (int i = 0; i < live; i++)
shells[p++] = 1;
for (int i = 0; i < blank; i++)
shells[p++] = 0;
shuffleShells();
cout << "\n枪械重新装填。\n";
cout << "装入了 " << live
<< " 发实弹,"
<< blank
<< " 发空包弹。\n";
}
int currentShell() {
if (shellIndex >= shellCount)
return -1;
return shells[shellIndex];
}
void removeCurrentShell() {
if (shellIndex >= shellCount)
return;
if (shells[shellIndex] == 1)
liveRemaining--;
else
blankRemaining--;
shellIndex++;
}
bool magazineEmpty() {
return shellIndex >= shellCount;
}
// =============================
// 道具系统
// =============================
Item randomItem() {
return (Item)randomInt(1, 5);
}
void giveItem(Character &c) {
if (c.itemCount >= MAX_ITEMS)
return;
c.items[c.itemCount] = randomItem();
c.itemCount++;
}
void distributeItems(Character &player,
Character &dealer) {
int count = randomInt(2, 4);
cout << "\n双方获得 " << count
<< " 个随机道具。\n";
for (int i = 0; i < count; i++) {
giveItem(player);
giveItem(dealer);
}
}
void removeItem(Character &c, int index) {
for (int i = index; i < c.itemCount - 1; i++) {
c.items[i] = c.items[i + 1];
}
c.itemCount--;
}
// =============================
// 使用道具
// =============================
bool useBeer(Character &user) {
if (magazineEmpty()) {
cout << "弹仓已经空了。\n";
return false;
}
int shell = currentShell();
cout << user.name
<< " 使用啤酒,退出了一发 "
<< shellName(shell)
<< "!\n";
removeCurrentShell();
user.knownShell = -1;
return true;
}
bool useCigarette(Character &user) {
if (user.hp >= user.maxHp) {
cout << user.name
<< " 当前生命已满。\n";
return false;
}
user.hp++;
cout << user.name
<< " 点燃香烟,恢复 1 点生命。\n";
return true;
}
bool useHandcuff(Character &user,
Character &enemy) {
if (enemy.cuffed) {
cout << enemy.name
<< " 已经被铐住了。\n";
return false;
}
enemy.cuffed = true;
cout << user.name
<< " 使用手铐,"
<< enemy.name
<< " 下一次行动将被跳过。\n";
return true;
}
bool useMagnifyingGlass(Character &user) {
if (magazineEmpty()) {
cout << "弹仓已经空了。\n";
return false;
}
int shell = currentShell();
user.knownShell = shell;
cout << user.name
<< " 使用放大镜。\n";
cout << "当前子弹是:"
<< shellName(shell)
<< "\n";
return true;
}
bool useSaw(Character &user) {
if (user.sawActive) {
cout << user.name
<< " 已经锯短了枪管。\n";
return false;
}
user.sawActive = true;
cout << user.name
<< " 使用手锯。\n";
cout << "下一发实弹造成 2 点伤害。\n";
return true;
}
bool useItem(Character &user,
Character &enemy,
int index) {
if (index < 0 || index >= user.itemCount)
return false;
Item item = user.items[index];
bool success = false;
if (item == BEER)
success = useBeer(user);
else if (item == CIGARETTE)
success = useCigarette(user);
else if (item == HANDCUFF)
success = useHandcuff(user, enemy);
else if (item == MAGNIFYING_GLASS)
success = useMagnifyingGlass(user);
else if (item == SAW)
success = useSaw(user);
if (success)
removeItem(user, index);
return success;
}
// =============================
// 开枪
// =============================
bool shoot(Character &shooter,
Character &target,
bool selfShot) {
if (magazineEmpty())
return false;
int shell = currentShell();
cout << "\n"
<< shooter.name;
if (selfShot)
cout << " 将枪口对准了自己...\n";
else
cout << " 将枪口对准了 "
<< target.name
<< "...\n";
cout << "\n咔——\n\n";
if (shell == 1) {
int damage = 1;
if (shooter.sawActive)
damage = 2;
target.hp -= damage;
if (target.hp < 0)
target.hp = 0;
cout << "砰!!!\n";
cout << "是实弹!\n";
cout << target.name
<< " 受到 "
<< damage
<< " 点伤害。\n";
shooter.sawActive = false;
} else {
cout << "咔哒。\n";
cout << "是空包弹。\n";
}
removeCurrentShell();
shooter.knownShell = -1;
return shell == 0;
}
// =============================
// 玩家回合
// =============================
int readChoice(int l, int r) {
int x;
while (true) {
cin >> x;
if (!cin.fail() &&
x >= l &&
x <= r) {
return x;
}
cin.clear();
cin.ignore(10000, '\n');
cout << "输入无效,请重新输入: ";
}
}
bool playerTurn(Character &player,
Character &dealer) {
while (true) {
showGameState(player, dealer);
if (player.knownShell != -1) {
cout << "\n你通过放大镜知道当前是:"
<< shellName(player.knownShell)
<< "\n";
}
cout << "\n你的行动:\n";
cout << "1. 射击庄家\n";
cout << "2. 射击自己\n";
cout << "3. 使用道具\n";
cout << "\n选择: ";
int choice = readChoice(1, 3);
if (choice == 1) {
bool blank =
shoot(player,
dealer,
false);
pauseGame();
// 射击对方后总是结束行动
return false;
} else if (choice == 2) {
bool blank =
shoot(player,
player,
true);
pauseGame();
// 射自己 + 空包弹可以继续
if (blank && player.hp > 0) {
continue;
}
return false;
} else {
if (player.itemCount == 0) {
cout << "\n你没有道具。\n";
pauseGame();
continue;
}
cout << "\n选择道具:\n";
for (int i = 0;
i < player.itemCount;
i++) {
cout << i + 1
<< ". "
<< itemName(player.items[i])
<< "\n";
}
cout << player.itemCount + 1
<< ". 返回\n";
cout << "\n选择: ";
int itemChoice =
readChoice(
1,
player.itemCount + 1);
if (itemChoice ==
player.itemCount + 1) {
continue;
}
bool success =
useItem(
player,
dealer,
itemChoice - 1);
if (success) {
pauseGame();
if (magazineEmpty())
return false;
} else {
pauseGame();
}
}
}
}
// =============================
// AI 道具搜索
// =============================
int findItem(const Character &c,
Item item) {
for (int i = 0;
i < c.itemCount;
i++) {
if (c.items[i] == item)
return i;
}
return -1;
}
// =============================
// AI
// =============================
bool dealerUseItems(Character &dealer,
Character &player) {
// 生命低时优先抽烟
if (dealer.hp < dealer.maxHp) {
int index =
findItem(dealer,
CIGARETTE);
if (index != -1) {
useItem(
dealer,
player,
index);
pauseGame();
return true;
}
}
// 不知道当前弹时,有放大镜就观察
if (dealer.knownShell == -1) {
int index =
findItem(
dealer,
MAGNIFYING_GLASS);
if (index != -1) {
useItem(
dealer,
player,
index);
pauseGame();
return true;
}
}
// 确认实弹:优先手铐
if (dealer.knownShell == 1) {
if (!player.cuffed) {
int index =
findItem(
dealer,
HANDCUFF);
if (index != -1) {
useItem(
dealer,
player,
index);
pauseGame();
return true;
}
}
// 再使用手锯
if (!dealer.sawActive) {
int index =
findItem(
dealer,
SAW);
if (index != -1) {
useItem(
dealer,
player,
index);
pauseGame();
return true;
}
}
}
// 实弹概率高时使用手锯
int total =
liveRemaining +
blankRemaining;
if (total > 0) {
double liveChance =
(double)liveRemaining /
total;
if (liveChance >= 0.65 &&
!dealer.sawActive) {
int index =
findItem(
dealer,
SAW);
if (index != -1) {
useItem(
dealer,
player,
index);
pauseGame();
return true;
}
}
}
// 已知空包弹,如果有啤酒则直接退出
if (dealer.knownShell == 0) {
int index =
findItem(
dealer,
BEER);
if (index != -1) {
useItem(
dealer,
player,
index);
pauseGame();
return true;
}
}
return false;
}
void dealerTurn(Character &dealer,
Character &player) {
while (true) {
showGameState(player, dealer);
cout << "\n庄家正在思考...\n";
// 尝试使用道具
if (dealerUseItems(
dealer,
player)) {
if (magazineEmpty())
return;
continue;
}
bool shootSelf = false;
if (dealer.knownShell == 1) {
shootSelf = false;
} else if (dealer.knownShell == 0) {
shootSelf = true;
} else {
int total =
liveRemaining +
blankRemaining;
double liveChance =
(double)liveRemaining /
total;
/*
AI 简单策略:
实弹多 -> 打玩家
空包弹多 -> 打自己
一半一半 -> 随机
*/
if (liveChance > 0.5)
shootSelf = false;
else if (liveChance < 0.5)
shootSelf = true;
else
shootSelf =
randomInt(0, 1);
}
if (shootSelf) {
bool blank =
shoot(
dealer,
dealer,
true);
pauseGame();
if (dealer.hp <= 0)
return;
// 空包弹打自己继续行动
if (blank)
continue;
return;
} else {
shoot(
dealer,
player,
false);
pauseGame();
return;
}
}
}
// =============================
// 开始新弹仓
// =============================
void newMagazine(Character &player,
Character &dealer) {
clearScreen();
printLine();
cout << "重新装填霰弹枪\n";
printLine();
loadShotgun();
player.knownShell = -1;
dealer.knownShell = -1;
player.sawActive = false;
dealer.sawActive = false;
distributeItems(
player,
dealer);
pauseGame();
}
// =============================
// 单局游戏
// =============================
bool playRound(int roundNumber) {
Character player;
Character dealer;
player.name = "你";
dealer.name = "庄家";
/*
不同阶段生命不同
*/
int hp;
if (roundNumber == 1)
hp = 3;
else if (roundNumber == 2)
hp = 4;
else
hp = 5;
player.hp = hp;
player.maxHp = hp;
dealer.hp = hp;
dealer.maxHp = hp;
player.itemCount = 0;
dealer.itemCount = 0;
player.cuffed = false;
dealer.cuffed = false;
player.sawActive = false;
dealer.sawActive = false;
player.knownShell = -1;
dealer.knownShell = -1;
bool playerTurnNow = true;
newMagazine(
player,
dealer);
while (
player.hp > 0 &&
dealer.hp > 0) {
// 空仓 -> 重新装弹
if (magazineEmpty()) {
newMagazine(
player,
dealer);
}
if (playerTurnNow) {
// 玩家被手铐
if (player.cuffed) {
showGameState(
player,
dealer);
cout << "\n你被手铐铐住,无法行动!\n";
player.cuffed = false;
pauseGame();
playerTurnNow = false;
continue;
}
playerTurn(
player,
dealer);
if (dealer.hp <= 0)
break;
/*
如果庄家被手铐,
玩家继续行动
*/
if (dealer.cuffed) {
dealer.cuffed = false;
showGameState(
player,
dealer);
cout << "\n庄家被手铐束缚。\n";
cout << "你获得额外一次行动!\n";
pauseGame();
playerTurnNow = true;
} else {
playerTurnNow = false;
}
} else {
// 庄家被手铐
if (dealer.cuffed) {
showGameState(
player,
dealer);
cout << "\n庄家被手铐铐住,跳过行动!\n";
dealer.cuffed = false;
pauseGame();
playerTurnNow = true;
continue;
}
dealerTurn(
dealer,
player);
if (player.hp <= 0)
break;
/*
玩家若被手铐,
庄家继续
*/
if (player.cuffed) {
player.cuffed = false;
showGameState(
player,
dealer);
cout << "\n你被手铐束缚。\n";
cout << "庄家获得额外一次行动。\n";
pauseGame();
playerTurnNow = false;
} else {
playerTurnNow = true;
}
}
}
showGameState(
player,
dealer);
if (player.hp <= 0) {
cout << "\n你倒下了。\n";
cout << "庄家赢得了这一局。\n";
return false;
} else {
cout << "\n庄家倒下了。\n";
cout << "你赢得了第 "
<< roundNumber
<< " 局!\n";
return true;
}
}
// =============================
// 游戏说明
// =============================
void showRules() {
clearScreen();
printLine();
cout << "恶魔轮盘赌 - 游戏规则\n";
printLine();
cout << R"(
霰弹枪中混合装填:
- 实弹
- 空包弹
双方都知道剩余实弹和空包弹数量,
但不知道当前枪膛里的具体弹药。
你的目标:
在庄家击败你之前击败庄家。
【射击规则】
射击庄家:
无论实弹还是空包弹,
行动结束。
射击自己:
如果是空包弹,
你可以继续行动。
如果是实弹,
受到伤害并结束行动。
【道具】
啤酒
退出当前枪膛中的一发子弹。
香烟
恢复 1 点生命。
手铐
对手下一次行动被跳过。
放大镜
查看当前枪膛中的子弹。
手锯
下一发实弹造成 2 点伤害。
游戏共有 3 个阶段:
第一局:
3 点生命
第二局:
4 点生命
第三局:
5 点生命
击败庄家三次即可通关。
)";
printLine();
pauseGame();
}
// =============================
// 主程序
// =============================
int main() {
srand(
(unsigned int)time(NULL));
while (true) {
clearScreen();
printLine();
cout << R"(
____ _ _
| _ \ ___ __ _| | ___ _| |_
| | | |/ _ \/ _` | |/ _ \_ _|
| |_| | __/ (_| | | __/ | |
|____/ \___|\__,_|_|\___| |_|
恶 魔 轮 盘 赌
)";
printLine();
cout << "1. 开始游戏\n";
cout << "2. 游戏规则\n";
cout << "3. 退出\n";
cout << "\n选择: ";
int choice =
readChoice(1, 3);
if (choice == 1) {
bool survived = true;
for (int round = 1;
round <= 3;
round++) {
clearScreen();
printLine();
cout << "第 "
<< round
<< " 局\n";
printLine();
pauseGame();
if (!playRound(round)) {
survived = false;
break;
}
pauseGame();
}
clearScreen();
printLine();
if (survived) {
cout << R"(
你推开了桌子。
庄家已经没有下一局了。
YOU WIN
)";
} else {
cout << R"(
灯光熄灭。
游戏结束。
GAME OVER
)";
}
printLine();
pauseGame();
} else if (choice == 2) {
showRules();
} else {
clearScreen();
cout << "游戏结束。\n";
break;
}
}
return 0;
}
这里空空如也












有帮助,赞一个