恶魔轮盘赌(搞笑版,含PVP,PVE)
2026-08-15 11:40:04
发布于:广东
话不多说,上代码:
#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <iomanip>
#include <thread>
#include <chrono>
using namespace std;
// 道具枚举
enum Item {
MAGNIFYING_GLASS = 0, // 放大镜
HANDCUFFS, // 手铐
CIGARETTE, // 烟
BEER, // 啤酒
SAW, // 锯子
ITEM_COUNT
};
const string itemNames[] = {"放大镜", "手铐", "烟", "啤酒", "锯子"};
// 玩家结构体
struct Player {
string name;
int health;
int maxHealth;
vector<int> items; // 存储各道具数量
Player(string n, int h) : name(n), health(h), maxHealth(h) {
items.resize(ITEM_COUNT, 0);
}
void addItem(Item item, int count = 1) {
items[item] += count;
}
bool hasItem(Item item) const {
return items[item] > 0;
}
void useItem(Item item) {
if (hasItem(item)) {
items[item]--;
}
}
void heal(int amount) {
health = min(health + amount, maxHealth);
}
};
// 游戏状态
struct GameState {
vector<bool> chamber; // true: 实弹, false: 空弹
int currentSlot;
bool knownNextType; // 是否已经用放大镜看过
int damageMultiplier; // 伤害倍率
GameState() : currentSlot(0), knownNextType(false), damageMultiplier(1) {}
};
// 工具函数:清屏
void clearScreen() {
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
// 工具函数:暂停
void pause() {
cout << "\n按回车键继续...";
cin.ignore();
cin.get();
}
// 随机数生成
int randomInt(int min, int max) {
return rand() % (max - min + 1) + min;
}
// 初始化枪膛
void loadChamber(GameState& state, int realCount, int fakeCount) {
state.chamber.clear();
state.currentSlot = 0;
state.knownNextType = false;
state.damageMultiplier = 1;
for (int i = 0; i < realCount; ++i) state.chamber.push_back(true);
for (int i = 0; i < fakeCount; ++i) state.chamber.push_back(false);
// 洗牌
random_shuffle(state.chamber.begin(), state.chamber.end());
cout << "装弹完成: " << realCount << " 发实弹, " << fakeCount << " 发空弹." << endl;
}
// 显示状态
void displayStatus(const Player& p1, const Player& p2, const GameState& state, bool isP1Turn) {
clearScreen();
cout << "" << endl;
cout << " 恶 魔 轮 盘 赌 (Buckshot Roulette)" << endl;
cout << "" << endl;
// 显示玩家信息
cout << left << setw(20) << p1.name << " HP: " << p1.health << "/" << p1.maxHealth;
cout << right << setw(20) << p2.name << " HP: " << p2.health << "/" << p2.maxHealth << endl;
cout << "----------------------------------------" << endl;
cout << "当前回合: " << (isP1Turn ? p1.name : p2.name) << endl;
if (state.damageMultiplier > 1) {
cout << "*** 警告: 下一发子弹伤害加倍! ***" << endl;
}
cout << "----------------------------------------" << endl;
// 显示道具
auto showItems = [&](const Player& p) {
for (int i = 0; i < ITEM_COUNT; ++i) {
if (p.items[i] > 0) {
cout << "[" << itemNames[i] << ": " << p.items[i] << "] ";
}
}
cout << endl;
};
cout << p1.name << " 道具: ";
showItems(p1);
cout << p2.name << " 道具: ";
showItems(p2);
cout << "========================================" << endl;
}
// 获取有效输入
int getIntInput(const string& prompt, int minVal, int maxVal) {
int val;
while (true) {
cout << prompt;
if (cin >> val && val >= minVal && val <= maxVal) {
return val;
}
cin.clear();
cin.ignore(10000, '\n');
cout << "输入无效,请重新输入 (" << minVal << "-" << maxVal << ")." << endl;
}
}
// 执行射击
bool shoot(Player& shooter, Player& target, GameState& state, bool shootSelf) {
if (state.chamber.empty()) return false;
bool isReal = state.chamber[state.currentSlot];
state.currentSlot++;
cout << "\n>>> " << shooter.name << " 举起左轮,对准目标扣下扳机... <<<" << endl;
this_thread::sleep_for(chrono::milliseconds(800));
if (isReal) {
int damage = 1 * state.damageMultiplier;
if (shootSelf) {
shooter.health -= damage;
cout << "[MC死亡提示] " << shooter.name << " 试图展示铁头功,结果失败了,喜提 " << damage << " 点真实伤害!" << endl;
} else {
target.health -= damage;
cout << "[MC死亡提示] " << shooter.name << " 给 " << target.name << " 来了一发热情问候,对方血条直接掉了 " << damage << " 格!" << endl;
}
state.damageMultiplier = 1;
return true;
} else {
if (shootSelf) {
cout << "[MC死亡提示] " << shooter.name << " 对着自己开了一枪,枪里只喷出了一股风,白赚一回合!" << endl;
} else {
cout << "[MC死亡提示] " << shooter.name << " 对着 " << target.name << " 开枪,结果枪卡壳了,对方当场笑出了声。" << endl;
}
state.damageMultiplier = 1;
return false;
}
}
// 玩家回合逻辑
void playerTurn(Player& me, Player& opponent, GameState& state) {
while (true) {
displayStatus(me, opponent, state, true);
// 检查是否死亡
if (me.health <= 0 || opponent.health <= 0) return;
cout << "选择行动:" << endl;
cout << "1. 向对手开枪" << endl;
cout << "2. 向自己开枪" << endl;
// 显示可用道具选项
int optionOffset = 3;
vector<Item> availableItems;
for (int i = 0; i < ITEM_COUNT; ++i) {
if (me.hasItem(static_cast<Item>(i))) {
cout << optionOffset << ". 使用 " << itemNames[i] << endl;
availableItems.push_back(static_cast<Item>(i));
optionOffset++;
}
}
int choice = getIntInput("请输入选项: ", 1, optionOffset - 1);
if (choice == 1) {
// 射击对手
bool isReal = shoot(me, opponent, state, false);
if (!isReal) {
// 空弹射对手,换回合
break;
}
// 实弹射对手,换回合
break;
} else if (choice == 2) {
// 射击自己
bool isReal = shoot(me, opponent, state, true);
if (!isReal) {
// 空弹射自己,继续回合
pause();
continue;
}
// 实弹射自己,换回合
break;
} else {
// 使用道具
Item usedItem = availableItems[choice - 3];
me.useItem(usedItem);
switch (usedItem) {
case MAGNIFYING_GLASS:
if (state.currentSlot < state.chamber.size()) {
bool nextIsReal = state.chamber[state.currentSlot];
cout << "[MC提示] 你眯起眼睛往枪膛里瞅了一眼,下一发是" << (nextIsReal ? "实弹" : "空弹") << ",这波信息差直接拉满" << endl;
state.knownNextType = true;
} else {
cout << "弹仓已空,无法查看。" << endl;
}
pause();
break;
case HANDCUFFS:
cout << "[MC提示] 你掏出了手铐,但是发现这里没有警察......(简化版暂无实际效果)" << endl;
pause();
break;
case CIGARETTE:
me.heal(1);
cout << "[MC提示] 你掏出一根华子猛吸一口,瞬间回了1点血,状态直接回满" << endl;
pause();
break;
case BEER:
if (!state.chamber.empty()) {
bool ejected = state.chamber[state.currentSlot];
state.currentSlot++;
cout << "[MC提示] 你对啤酒进行龙吸水,枪里自动退出来一颗子弹,是" << (ejected ? "实弹" : "空弹") << endl;
state.damageMultiplier = 1;
state.knownNextType = false;
}
pause();
break;
case SAW:
state.damageMultiplier = 2;
cout << "[MC提示] 你掏出锯子破坏公物,下一发子弹伤害直接翻倍,对面直呼玩不起" << endl;
pause();
break;
}
}
}
}
// AI 回合逻辑
void aiTurn(Player& ai, Player& player, GameState& state) {
displayStatus(player, ai, state, false);
cout << ai.name << " 正在思考怎么弄死你..." << endl;
this_threadsleep_for(chronomilliseconds(1000));
if (ai.health <= 0 || player.health <= 0) return;
bool hasInfo = state.knownNextType;
bool nextIsReal = false;
// 计算剩余实弹概率
int remaining = state.chamber.size() - state.currentSlot;
if (remaining > 0) {
int realLeft = 0;
for(int i=state.currentSlot; i<state.chamber.size(); ++i) {
if(state.chamber[i]) realLeft++;
}
nextIsReal = (realLeft > (remaining/2));
}
// 使用道具逻辑
if (ai.hasItem(CIGARETTE) && ai.health < ai.maxHealth) {
ai.useItem(CIGARETTE);
ai.heal(1);
cout << ai.name << " 抽了根烟,恢复了1点生命。" << endl;
pause();
displayStatus(player, ai, state, false);
}
if (ai.hasItem(MAGNIFYING_GLASS) && !state.knownNextType) {
ai.useItem(MAGNIFYING_GLASS);
bool next = state.chamber[state.currentSlot];
cout << ai.name << " 使用了放大镜,偷窥了下一发子弹。" << endl;
state.knownNextType = true;
nextIsReal = next;
pause();
}
if (ai.hasItem(SAW) && nextIsReal) {
ai.useItem(SAW);
state.damageMultiplier = 2;
cout << ai.name << " 使用了锯子!准备给你来个大的!" << endl;
pause();
}
if (ai.hasItem(BEER) && !nextIsReal && !state.chamber.empty()) {
ai.useItem(BEER);
bool ejected = state.chamber[state.currentSlot];
state.currentSlot++;
cout << ai.name << " 喝了啤酒,退掉了一颗空弹。" << endl;
state.damageMultiplier = 1;
state.knownNextType = false;
pause();
}
// 射击决策
bool shootSelf = false;
if (state.knownNextType) {
if (!nextIsReal) {
shootSelf = true;
cout << ai.name << " 确信下一发是空弹,选择对自己开枪。" << endl;
} else {
shootSelf = false;
cout << ai.name << " 确信下一发是实弹,选择向你开枪。" << endl;
}
} else {
if (ai.health > player.health) {
shootSelf = false;
cout << ai.name << " 选择向你开枪。" << endl;
} else {
shootSelf = true;
cout << ai.name << " 冒险对自己开枪。" << endl;
}
}
pause();
bool isReal = shoot(ai, player, state, shootSelf);
if (!isReal && shootSelf) {
cout << ai.name << " 安然无恙,继续行动!" << endl;
pause();
aiTurn(ai, player, state);
}
}
// 分发道具
void distributeItems(Player& p1, Player& p2) {
int itemsForP1 = randomInt(1, 2);
int itemsForP2 = randomInt(1, 2);
for(int i=0; i<itemsForP1; ++i) {
Item it = static_cast<Item>(randomInt(0, ITEM_COUNT-1));
p1.addItem(it);
}
for(int i=0; i<itemsForP2; ++i) {
Item it = static_cast<Item>(randomInt(0, ITEM_COUNT-1));
p2.addItem(it);
}
}
int main() {
srand(time(0));
cout << "欢迎进入恶魔轮盘赌!" << endl;
cout << "请选择模式: 1. PVP (双人乱斗) 2. PVE (挑战恶魔)" << endl;
int mode = getIntInput("选择: ", 1, 2);
string p1Name, p2Name;
cout << "请输入你的名字: ";
cin >> p1Name;
Player p1(p1Name, 4);
Player* p2Ptr;
Player aiPlayer("恶魔", 4);
if (mode == 1) {
cout << "请输入对手的名字: ";
cin >> p2Name;
p2Ptr = new Player(p2Name, 4);
} else {
p2Ptr = &aiPlayer;
}
Player& p2 = *p2Ptr;
bool isP1Turn = true;
int round = 1;
while (p1.health > 0 && p2.health > 0) {
cout << "\n=== 第 " << round << " 轮 ===" << endl;
int real = randomInt(2, 4);
int fake = randomInt(2, 4);
GameState state;
loadChamber(state, real, fake);
distributeItems(p1, p2);
while (state.currentSlot < state.chamber.size() && p1.health > 0 && p2.health > 0) {
if (isP1Turn) {
playerTurn(p1, p2, state);
isP1Turn = false;
} else {
if (mode == 1) {
playerTurn(p2, p1, state);
} else {
aiTurn(p2, p1, state);
}
isP1Turn = true;
}
}
if (p1.health > 0 && p2.health > 0) {
cout << "本轮结束,双方存活。准备下一轮..." << endl;
pause();
round++;
}
}
cout << "\n========================================" << endl;
if (p1.health > 0) {
cout << "[MC死亡提示] " << p2.name << " 被 " << p1.name << " 物理超度,游戏结束," << p1.name << " 获得了本局的恶魔轮盘赌冠军" << endl;
} else {
cout << "[MC死亡提示] " << p2.name << " 请 " << p1.name << " 吃了好多颗花生米,其高兴得死了,游戏结束," << p2.name << " 获得了本局的恶魔轮盘赌冠军" << endl;
}
cout << "========================================" << endl;
if (mode == 1) delete p2Ptr;
return 0;
}
全部评论 1
NB
4天前 来自 浙江
0























有帮助,赞一个