-
个人简介
副作用:药丸轮盘赌
1.12 Beta更新公告 增加商城中心(测试中) 增加难度选择(测试中) 增加联机大厅(测试中) 增加存档功能(测试中)1.12正式版更新预告 增加难度选择 增加商城和兑换码 增加存档功能 增加双人模式 丰富剧情根据用户反馈药剂师太强势了,所以将在1.12正式版削弱 如有编译问题请洛谷私信或线下找我//1.12 Beta(未完成)(测试版)(QZ计划) #include <iostream> #include <cstdlib> #include <ctime> #include <vector> #include <string> #include <algorithm> #include <windows.h> using namespace std; // 游戏常量 const int INITIAL_HEALTH = 6; const int MAX_PILLS = 8; const int MAX_ITEMS = 20; // 药丸类型 enum PillType { RED, // 红色药丸 - 剧毒 BLUE, // 蓝色药丸 - 治疗 YELLOW, // 黄色药丸 - 伤害+特殊 GREEN, // 绿色药丸 - 强力治疗 PURPLE, // 紫色药丸 - 特殊效果 BLACK, // 黑色药丸 - 剧毒 WHITE, // 白色药丸 - 治疗 RAINBOW, // 彩虹药丸 - 特殊 GOLDEN, // 金色药丸 - 无尽模式钥匙 COUNT // 药丸类型总数 }; // 道具类型 enum ItemType { ANTIDOTE, // 解毒剂 - 免疫下一次毒药 EMETIC, // 催吐药 - 吐出一颗已服药丸 MICROSCOPE, // 显微镜 - 查看所有药丸 MAGNIFIER, // 放大镜 - 查看下一颗药丸 FILTER, // 过滤器 - 移除当前药丸 STABILIZER, // 稳定剂 - 将下一颗变为治疗 SHIELD, // 护盾 - 抵挡下一次伤害 MIRROR, // 镜子 - 反弹效果给对手 DILUTER, // 稀释剂 - 减半药效 AMPLIFIER, // 放大器 - 加倍药效 REVERSER, // 逆转剂 - 反转药效 DUPLICATOR, // 复制器 - 复制当前药丸 SHUFFLER, // 洗牌器 - 重新洗牌 TRANSMUTER, // 转化器 - 改变药丸类型 SYRINGE, // 注射器 - 跳过当前药丸 HOLSTER, // 枪套 - 跳过对手回合 LUCKY_CHARM, // 幸运符 - 增加好药几率 CURSED_ITEM, // 诅咒物 - 增加毒药几率 TIME_WARP, // 时间扭曲 - 重做回合 PULVERIZER // 粉碎器 - 摧毁同类型药丸 }; // 药丸结构体 struct Pill { PillType type; string name; string description; int healthEffect; bool isSpecial; bool isPoisonous; }; // 道具结构体 struct Item { ItemType type; string name; string description; }; // 玩家结构体 struct Player { string name; int health; vector<Item> items; int specialEffect; // 特殊效果标记 }; // 游戏状态 struct GameState { int round; vector<Pill> pillBottle; int currentPillIndex; Player player; Player opponent; bool endlessMode; bool goldenPillUsed; int poisonCount; // 毒药计数 }; // 初始化药丸 vector<Pill> initializePills() { vector<Pill> pills = { {RED, "红色药丸", "鲜红如血,散发着甜腻气味", -3, false, true}, {BLUE, "蓝色药丸", "晶莹剔透,表面有细微裂纹", 1, false, false}, {YELLOW, "黄色药丸", "发出微弱荧光,触感油腻", -2, true, true}, {GREEN, "绿色药丸", "薄荷香气,表面有螺旋纹路", 3, false, false}, {PURPLE, "紫色药丸", "不规则形状,偶尔轻微震动", 0, true, false}, {BLACK, "黑色药丸", "吸收周围光线,摸起来冰凉", -4, false, true}, {WHITE, "白色药丸", "纯白无瑕,散发着牛奶香气", 2, false, false}, {RAINBOW,"彩虹药丸", "色彩不断变化,温度忽冷忽热", 0, true, false}, {GOLDEN, "金色药丸", "散发着神秘光芒,表面有奇异纹路", 0, true, false} }; return pills; } // 初始化道具 vector<Item> initializeItems() { vector<Item> items = { {ANTIDOTE, "解毒剂", "免疫下一次毒药效果"}, {EMETIC, "催吐药", "吐出一颗已服用的药丸"}, {MICROSCOPE, "显微镜", "查看药瓶中所有药丸"}, {MAGNIFIER, "放大镜", "查看下一颗药丸"}, {FILTER, "过滤器", "移除当前药丸"}, {STABILIZER, "稳定剂", "将下一颗药丸变为治疗药"}, {SHIELD, "护盾", "抵挡下一次伤害"}, {MIRROR, "镜子", "将效果反弹给对手"}, {DILUTER, "稀释剂", "减半下一颗药丸的效果"}, {AMPLIFIER, "放大器", "加倍下一颗药丸的效果"}, {REVERSER, "逆转剂", "反转下一颗药丸的效果"}, {DUPLICATOR, "复制器", "复制当前药丸放入药瓶"}, {SHUFFLER, "洗牌器", "重新随机药丸顺序"}, {TRANSMUTER, "转化器", "改变当前药丸的类型"}, {SYRINGE, "注射器", "跳过当前药丸"}, {HOLSTER, "枪套", "跳过对手的下回合"}, {LUCKY_CHARM, "幸运符", "增加好药丸的几率"}, {CURSED_ITEM, "诅咒物", "增加毒药的几率"}, {TIME_WARP, "时间扭曲", "重新开始当前回合"}, {PULVERIZER, "粉碎器", "摧毁所有同类型药丸"} }; return items; } // 随机获取道具 Item getRandomItem() { static vector<Item> allItems = initializeItems(); int index = rand() % allItems.size(); return allItems[index]; } // 初始化游戏 GameState initializeGame(bool endless) { GameState game; game.round = 1; game.endlessMode = endless; game.goldenPillUsed = false; game.poisonCount = 0; // 初始化玩家 game.player.name = "玩家"; game.player.health = INITIAL_HEALTH; game.player.specialEffect = 0; // 初始化对手 game.opponent.name = "药剂师"; game.opponent.health = INITIAL_HEALTH; game.opponent.specialEffect = 0; // 初始化药瓶 vector<Pill> allPills = initializePills(); for (int i = 0; i < MAX_PILLS; i++) { int index = rand() % (allPills.size() - 1); // 不包括金色药丸 game.pillBottle.push_back(allPills[index]); if (allPills[index].isPoisonous) { game.poisonCount++; } } // 无尽模式开始时加入金色药丸 if (endless) { game.pillBottle.push_back(allPills[GOLDEN]); random_shuffle(game.pillBottle.begin(), game.pillBottle.end()); } game.currentPillIndex = 0; // 给玩家初始道具 for (int i = 0; i < 3; i++) { game.player.items.push_back(getRandomItem()); } // 给对手初始道具 for (int i = 0; i < 2; i++) { game.opponent.items.push_back(getRandomItem()); } return game; } // 显示游戏状态 void displayGameState(const GameState& game) { system("cls"); cout << "=== 副作用 - 第 " << game.round << " 回合 ===" << endl; cout << "[" << game.player.name << "] 生命: "; for (int i = 0; i < game.player.health; i++) cout << "O"; cout << endl; cout << "[" << game.opponent.name << "] 生命: "; for (int i = 0; i < game.opponent.health; i++) cout << "O"; cout << endl << endl; cout << "药瓶中剩余药丸: " << game.pillBottle.size() - game.currentPillIndex << endl; cout << "其中有毒药丸: " << game.poisonCount << "颗" << endl; } // 显示道具 void displayItems(const vector<Item>& items) { cout << "\n道具列表:" << endl; for (size_t i = 0; i < items.size(); i++) { cout << i+1 << ". " << items[i].name << " - " << items[i].description << endl; } } // 处理药丸效果 void applyPillEffect(GameState& game, Pill pill, bool isPlayer) { Player& target = isPlayer ? game.player : game.opponent; Player& other = isPlayer ? game.opponent : game.player; cout << "\n>>> " << (isPlayer ? "你" : "药剂师") << "服用了: " << pill.name << endl; cout << pill.description << endl; Sleep(2000); // 更新毒药计数 if (pill.isPoisonous) { game.poisonCount--; } // 检查护盾效果 if (target.specialEffect & (1 << SHIELD)) { if (pill.healthEffect < 0) { cout << (isPlayer ? "你的护盾" : "药剂师的护盾") << "抵挡了伤害!" << endl; target.specialEffect &= ~(1 << SHIELD); Sleep(1500); return; } } // 检查解毒剂效果 if (target.specialEffect & (1 << ANTIDOTE)) { if (pill.healthEffect < 0) { cout << (isPlayer ? "你的解毒剂" : "药剂师的解毒剂") << "中和了毒素!" << endl; pill.healthEffect /= 2; target.specialEffect &= ~(1 << ANTIDOTE); } } // 检查镜子效果 if (target.specialEffect & (1 << MIRROR)) { cout << (isPlayer ? "你的镜子" : "药剂师的镜子") << "反弹了效果!" << endl; target.specialEffect &= ~(1 << MIRROR); applyPillEffect(game, pill, !isPlayer); return; } // 应用药丸基础效果 if (pill.healthEffect != 0) { target.health += pill.healthEffect; if (pill.healthEffect > 0) { cout << (isPlayer ? "你" : "药剂师") << "恢复了 " << pill.healthEffect << " 点生命!" << endl; } else { cout << (isPlayer ? "你" : "药剂师") << "受到了 " << -pill.healthEffect << " 点伤害!" << endl; } } // 处理特殊药丸效果 if (pill.isSpecial) { switch(pill.type) { case YELLOW: cout << "你感到一阵眩晕,视线开始模糊..." << endl; target.specialEffect |= (1 << (rand() % 5 + 5)); // 随机负面效果 break; case PURPLE: cout << "周围的空间似乎扭曲了..." << endl; swap(target.health, other.health); cout << "你和药剂师的生命值交换了!" << endl; break; case RAINBOW: cout << "你看到了无数色彩在眼前旋转..." << endl; target.specialEffect = (1 << LUCKY_CHARM) | (1 << AMPLIFIER); cout << "你获得了幸运和强化的效果!" << endl; break; case GOLDEN: cout << "一股强大的能量流遍全身!" << endl; game.goldenPillUsed = true; game.endlessMode = true; cout << "无尽模式已激活!游戏将继续直到一方倒下!" << endl; break; default: break; } } // 确保生命值不会超过上限或低于0 target.health = min(max(target.health, 0), INITIAL_HEALTH * (game.endlessMode ? 2 : 1)); Sleep(2000); } // 使用道具 bool useItem(Player& user, Player& target, vector<Pill>& pillBottle, int& currentPillIndex, int& poisonCount) { if (user.items.empty()) { cout << user.name << "没有可用的道具!" << endl; return false; } cout << user.name << "选择使用道具:" << endl; displayItems(user.items); int choice; if (user.name == "玩家") { cin >> choice; } else { // AI简单逻辑:优先使用防御性道具 for (size_t i = 0; i < user.items.size(); i++) { if (user.items[i].type == ANTIDOTE || user.items[i].type == SHIELD) { choice = i + 1; break; } } if (choice < 1 || choice > static_cast<int>(user.items.size())) { choice = rand() % user.items.size() + 1; } Sleep(1500); } if (choice < 1 || choice > static_cast<int>(user.items.size())) { cout << "无效选择!" << endl; return false; } Item usedItem = user.items[choice-1]; user.items.erase(user.items.begin() + choice - 1); cout << user.name << "使用了: " << usedItem.name << endl; cout << usedItem.description << endl; Sleep(1500); switch(usedItem.type) { case ANTIDOTE: user.specialEffect |= (1 << ANTIDOTE); break; case EMETIC: if (user.health < INITIAL_HEALTH) { user.health += 1; cout << user.name << "吐出了一颗药丸,感觉好多了!" << endl; } else { cout << user.name << "想吐但吐不出来!" << endl; } break; case MICROSCOPE: cout << "药瓶中的药丸:" << endl; for (size_t i = currentPillIndex; i < pillBottle.size(); i++) { cout << i+1 << ". " << pillBottle[i].name << endl; } return false; // 不消耗回合 case MAGNIFIER: if (currentPillIndex + 1 < static_cast<int>(pillBottle.size())) { cout << "下一颗药丸是: " << pillBottle[currentPillIndex+1].name << endl; } else { cout << "这是最后一颗药丸了!" << endl; } break; case FILTER: if (currentPillIndex < static_cast<int>(pillBottle.size())) { cout << "移除了: " << pillBottle[currentPillIndex].name << endl; if (pillBottle[currentPillIndex].isPoisonous) { poisonCount--; } pillBottle.erase(pillBottle.begin() + currentPillIndex); } break; case STABILIZER: user.specialEffect |= (1 << STABILIZER); break; case SHIELD: user.specialEffect |= (1 << SHIELD); break; case MIRROR: user.specialEffect |= (1 << MIRROR); break; case DILUTER: user.specialEffect |= (1 << DILUTER); break; case AMPLIFIER: user.specialEffect |= (1 << AMPLIFIER); break; case REVERSER: user.specialEffect |= (1 << REVERSER); break; case DUPLICATOR: if (currentPillIndex < static_cast<int>(pillBottle.size())) { pillBottle.insert(pillBottle.begin() + currentPillIndex, pillBottle[currentPillIndex]); if (pillBottle[currentPillIndex].isPoisonous) { poisonCount++; } cout << "复制了: " << pillBottle[currentPillIndex].name << endl; } break; case SHUFFLER: random_shuffle(pillBottle.begin() + currentPillIndex, pillBottle.end()); cout << "药丸顺序被打乱了!" << endl; break; case TRANSMUTER: if (currentPillIndex < static_cast<int>(pillBottle.size())) { vector<Pill> allPills = initializePills(); bool wasPoisonous = pillBottle[currentPillIndex].isPoisonous; pillBottle[currentPillIndex] = allPills[rand() % allPills.size()]; if (wasPoisonous && !pillBottle[currentPillIndex].isPoisonous) { poisonCount--; } else if (!wasPoisonous && pillBottle[currentPillIndex].isPoisonous) { poisonCount++; } cout << "药丸变成了: " << pillBottle[currentPillIndex].name << endl; } break; case SYRINGE: cout << "跳过了当前药丸!" << endl; currentPillIndex++; break; case HOLSTER: cout << target.name << "的下回合将被跳过!" << endl; target.specialEffect |= (1 << HOLSTER); break; case LUCKY_CHARM: user.specialEffect |= (1 << LUCKY_CHARM); break; case CURSED_ITEM: target.specialEffect |= (1 << CURSED_ITEM); break; case TIME_WARP: cout << "时间倒流了!" << endl; return false; // 重新开始回合 case PULVERIZER: if (currentPillIndex < static_cast<int>(pillBottle.size())) { PillType typeToDestroy = pillBottle[currentPillIndex].type; int destroyedPoisons = 0; for (auto it = pillBottle.begin() + currentPillIndex; it != pillBottle.end(); ) { if (it->type == typeToDestroy) { if (it->isPoisonous) destroyedPoisons++; cout << "摧毁了: " << it->name << endl; it = pillBottle.erase(it); } else { ++it; } } poisonCount -= destroyedPoisons; } break; } return true; } // 玩家回合 void playerTurn(GameState& game) { bool turnEnded = false; while (!turnEnded) { displayGameState(game); if (game.currentPillIndex >= static_cast<int>(game.pillBottle.size())) { cout << "药瓶已经空了!" << endl; break; } cout << "\n当前药丸: " << game.pillBottle[game.currentPillIndex].name << endl; cout << "描述: " << game.pillBottle[game.currentPillIndex].description << endl; cout << "1. 服用这颗药丸" << endl; cout << "2. 使用道具(按0退出)" << endl; cout << "3. 查看道具说明" << endl; int choice; cin >> choice; if (choice == 1) { // 服用当前药丸 Pill currentPill = game.pillBottle[game.currentPillIndex]; applyPillEffect(game, currentPill, true); game.currentPillIndex++; turnEnded = true; } else if (choice == 2) { // 使用道具 if (useItem(game.player, game.opponent, game.pillBottle, game.currentPillIndex, game.poisonCount)) { turnEnded = true; } Sleep(1500); } else if (choice == 3) { displayItems(game.player.items); system("pause"); } else { cout << "无效选择!" << endl; Sleep(1000); } } // 回合结束时获得新道具 if (turnEnded && game.player.items.size() < 5) { game.player.items.push_back(getRandomItem()); } } // 对手回合 void opponentTurn(GameState& game) { displayGameState(game); // 检查是否被跳过回合 if (game.opponent.specialEffect & (1 << HOLSTER)) { cout << "\n药剂师被跳过回合!" << endl; game.opponent.specialEffect &= ~(1 << HOLSTER); Sleep(1500); return; } cout << "\n药剂师的回合..." << endl; Sleep(1500); // 简单AI逻辑 bool usedItem = false; // 有道具且随机决定使用道具 if (!game.opponent.items.empty() && rand() % 3 != 0) { usedItem = useItem(game.opponent, game.player, game.pillBottle, game.currentPillIndex, game.poisonCount); } // 如果没用道具且药瓶不为空,服药 if (!usedItem && game.currentPillIndex < static_cast<int>(game.pillBottle.size())) { Pill currentPill = game.pillBottle[game.currentPillIndex]; applyPillEffect(game, currentPill, false); game.currentPillIndex++; } // 对手回合结束时获得新道具 if (game.opponent.items.size() < 3) { game.opponent.items.push_back(getRandomItem()); } } // 主游戏循环 void gameLoop(bool endlessMode) { GameState game = initializeGame(endlessMode); // 开场剧情 cout << "=== 副作用 - 剧情===" << endl; cout << "你走进一家昏暗的药店,柜台后站着一位穿着白大褂的古怪药剂师。\n"; cout << "'啊,新来的病人!'他咯咯笑着,'让我们玩个游戏吧...'\n"; cout << "他拿出一个装满各色药丸的瓶子,'每人轮流服药,看看谁的运气更好!'\n"; if (endlessMode) { cout << "'不过这次...我们玩个更大的!'药剂师神秘地笑着,放入一颗金色药丸...\n"; } system("pause"); while (true) { // 检查游戏结束条件 if (game.player.health <= 0 && game.opponent.health <= 0) { cout << "你们双双倒下...平局!\n"; break; } else if (game.player.health <= 0) { cout << "你倒下了...药剂师站在你面前咯咯笑。'看来我的药方更有效!'\n"; break; } else if (game.opponent.health <= 0) { if (game.endlessMode && !game.goldenPillUsed) { cout << "药剂师瘫倒在地!但就在你以为胜利时...\n"; cout << "他突然狂笑起来,掏出一颗金色药丸吞下!'游戏才刚开始!'\n"; game.opponent.health = INITIAL_HEALTH * 2; game.round++; game.goldenPillUsed = true; continue; } else { cout << "药剂师瘫倒在地!你赢得了这场危险的游戏!\n"; break; } } // 检查是否需要重新装填药瓶 if (game.currentPillIndex >= static_cast<int>(game.pillBottle.size())) { cout << "药瓶空了...重新装填!" << endl; vector<Pill> allPills = initializePills(); game.pillBottle.clear(); game.poisonCount = 0;for (int i = 0; i < MAX_PILLS; i++) { int index = rand() % (allPills.size() - 1); // 不包括金色药丸 game.pillBottle.push_back(allPills[index]); if (allPills[index].isPoisonous) { game.poisonCount++; } }
// 无尽模式每3轮加入一颗金色药丸 if (game.endlessMode && game.round % 3 == 0) { game.pillBottle.push_back(allPills[GOLDEN]); }
random_shuffle(game.pillBottle.begin(), game.pillBottle.end()); game.currentPillIndex = 0; Sleep(2000);
} // 玩家回合 playerTurn(game); // 对手回合 if (game.opponent.health > 0 && game.currentPillIndex < static_cast<int>(game.pillBottle.size())) { opponentTurn(game); } game.round++; // 无尽模式难度提升 if (game.endlessMode && game.round % 5 == 0) { cout << "\n你感觉药剂变得更加强烈了...\n"; game.opponent.health += 1; Sleep(1500); } } } // 主菜单 void mainMenu() { while (true) { system("cls"); cout << "=== 副作用 - 药丸轮盘赌 1.12 Beta===" << endl; cout << "1. 开始游戏" << endl; cout << "2. 无尽模式" << endl; cout << "3. 游戏说明" << endl; cout << "4. 商城中心" << endl; cout << "5. 难度选择" << endl; cout << "6. 联机大厅" << endl; cout << "7. 退出" << endl; int choice; cin >> choice; if (choice == 1) { gameLoop(false); system("pause"); } else if (choice == 2) { cout << "\n警告: 无尽模式会越来越难,直到你倒下!\n"; cout << "药剂师会强化,道具也会随着游戏进度越来越少!\n"; cout << "确定要开始吗? (y/n): "; char confirm; cin >> confirm; if (confirm == 'y' || confirm == 'Y') { gameLoop(true); system("pause"); } } else if (choice == 3) { cout << "\n=== 副作用 - 游戏说明 ===" << endl; cout << "1. 轮流服用药瓶中的药丸,有些治疗,有些有毒" << endl; cout << "2. 界面会显示剩余毒药数量,但不会告诉你具体哪颗" << endl; cout << "3. 使用道具来获得优势,每回合会获得新道具" << endl; cout << "4. 无尽模式中,找到金色药丸可解锁真正挑战" << endl; cout << "5. 合理使用道具组合是获胜关键" << endl; cout << "6. @bjlqz_leo出品/. @qfcwyh2运营/. @bjzzr审核/." << endl; cout << "7. 每周更新/." << endl; system("pause"); } else if (choice == 4){ int leo; cout << "欢迎来到leo的商城" << endl; cout << "当前可购买:" << endl; cout << "1. 幸运星\n" << "类型:" << "游戏内道具\n" << "效果:" << "幸运值+100%" << "\n" << "免费获得" << endl; cout << "2. 手机\n" << "类型:" << "游戏内道具\n" << "效果:" << "买通裁判使对手受伤+50%" << "\n" << "一键三连获得" << endl; cout << "买什么?" << endl; cin >> leo; if (leo == 1 || leo == 2){ cout << "购买成功!\n" << "正在返回主页..." << endl; } else{ cout << "无效选择!" << endl; } system("pause"); } else if (choice == 5){ cout << "由于此版本为测试阶段,尚未完善该功能!"<< endl; cout << "正在返回主页..." << endl; system("pause"); } else if (choice == 6){ int baocuo; cout << "公告:" << endl << "欢迎来到联机大厅!" << endl; cout << "由于此服务器非常小(只有一个房间),断连是常有的事,请耐心等待!" << endl; cout << "正在连接房间..." << endl; Sleep(10000); srand(time(NULL)); baocuo = (rand() % 2) + 1; if (baocuo == 1){ cout << "连接成功!" << endl; Sleep(5000); cout << "正在加入!" << endl; Sleep(5000); cout << "Error:无法加入房间1" << endl; Sleep(5000); cout << "正在上报错误" << endl; Sleep(5000); cout << "正在返回主页..." << endl; } else if (baocuo == 2){ cout << "找不到服务器IP地址,请检查是否有误" << endl; Sleep(5000); cout << "正在上报错误" << endl; Sleep(5000); cout << "正在返回主页..." << endl; } system("pause"); } else if (choice == 7) { break; } } } string lianjigongneng(string lianji,string room){ ; } int main() { srand(static_cast<unsigned>(time(0))); mainMenu(); return 0; }#include <iostream> #include <string> #include <vector> #include <map> #include <random> #include <ctime> #include <algorithm> // 兼容C++11,关闭安全警告(Windows平台) #pragma warning(disable: 4996) using namespace std; // 游戏核心属性结构体(隐藏属性,影响结局判定) struct GameAttributes { int sanity; // 理智(0-10):过度消耗会触发精神类结局 int courage; // 勇气(0-10):过低会触发逃避类结局,过高会触发鲁莽类结局 int caution; // 谨慎(0-10):影响线索收集和危险规避 int empathy; // 共情(0-10):影响与NPC的关系走向 int clue; // 线索(0-10):决定解谜完整度,直接影响真相类结局// C++11 构造函数初始化 GameAttributes() : sanity(5), courage(5), caution(5), empathy(5), clue(5) {}
}; // 关键选择标记结构体(记录核心选择,影响结局分支) struct ChoiceFlags { bool trust_npc; // 是否信任神秘NPC(flag1) bool check_trap; // 是否检查可疑陷阱(flag2) bool save_stranger; // 是否拯救陌生幸存者(flag3) bool burn_evidence; // 是否烧毁关键证据(flag4)ChoiceFlags() : trust_npc(false), check_trap(false), save_stranger(false), burn_evidence(false) {}
}; // 游戏全局状态 GameAttributes player_attr; ChoiceFlags choice_flags; int story_stage = 0; // 剧情阶段(0-4,对应4个核心选择节点) bool game_running = true; // C++11 随机数生成(替代rand(),更均匀) int get_random_int(int min, int max) { static mt19937 rng(static_cast<unsigned int>(time(nullptr))); uniform_int_distribution<int> dist(min, max); return dist(rng); } // 属性修改函数 void modify_attribute(string attr_name, int value) { if (attr_name == "sanity") { player_attr.sanity += value; player_attr.sanity = max(0, min(10, player_attr.sanity)); // 限制在0-10 } else if (attr_name == "courage") { player_attr.courage += value; player_attr.courage = max(0, min(10, player_attr.courage)); } else if (attr_name == "caution") { player_attr.caution += value; player_attr.caution = max(0, min(10, player_attr.caution)); } else if (attr_name == "empathy") { player_attr.empathy += value; player_attr.empathy = max(0, min(10, player_attr.empathy)); } else if (attr_name == "clue") { player_attr.clue += value; player_attr.clue = max(0, min(10, player_attr.clue)); } } // 剧情打印函数(模拟文字叙事节奏) void print_story(const string& content) { for (char c : content) { // C++11 范围for循环 cout << c; // 简单延时,营造阅读氛围 if (c == '.' || c == '!' || c == '?') { for (int i = 0; i < 100000000; i++); } } cout << endl << endl; } // 阶段0:游戏开局 + 第一个核心选择 void story_stage_0() { print_story("【悬疑游戏:雾影山庄】"); print_story("你在一辆破旧的出租车上醒来,头痛欲裂。司机告诉你,你是受雇来雾影山庄调查一桩失踪案的侦探。"); print_story("3天前,山庄主人林老爷离奇失踪,家中只留下一封残缺的遗书和满地的诡异符号。"); print_story("出租车停在山庄大门前,大门虚掩着,里面弥漫着一股潮湿的霉味。司机催促你下车:\"我可不敢在这门口多待,天黑前一定要离开!\""); print_story("此时,你面前有三个选择:"); cout << "1. 直接推开大门进入山庄,不做任何准备" << endl; cout << "2. 先在山庄门口观察10分钟,检查周围是否有异常痕迹" << endl; cout << "3. 回头询问司机更多关于山庄的传闻,收集额外信息" << endl; cout << "请输入你的选择(1/2/3):";int choice; cin >> choice; cout << endl;
switch (choice) { case 1: print_story("你深吸一口气,直接推开大门。木门发出"吱呀"的刺耳声响,仿佛在控诉你的闯入。"); modify_attribute("courage", 2); modify_attribute("caution", -1); choice_flags.check_trap = false; break; case 2: print_story("你蹲在山庄围墙边,仔细观察四周。你发现墙角有一串新鲜的脚印,还有一根带有血迹的银针,这让你对山庄的危险有了初步认知。"); modify_attribute("caution", 2); modify_attribute("clue", 1); choice_flags.check_trap = true; break; case 3: print_story("你回头拉住司机,司机犹豫片刻,告诉你:"这山庄十年前就死过人,说是女主人被林老爷害死在阁楼里,从此就常有怪事发生!"说完便匆忙开车离去。"); modify_attribute("sanity", -1); modify_attribute("clue", 2); modify_attribute("empathy", 1); choice_flags.check_trap = false; break; default: print_story("你犹豫不决,浪费了几分钟时间,最终还是硬着头皮推开了大门。"); modify_attribute("courage", 1); modify_attribute("caution", -1); choice_flags.check_trap = false; break; }
story_stage = 1;
} // 阶段1:山庄大厅 + 第二个核心选择 void story_stage_1() { print_story("你进入山庄大厅,光线昏暗,只有屋顶的一盏煤油灯在随风晃动,映得墙上的影子忽明忽暗。"); print_story("大厅中央站着一个身穿黑色风衣的男人,他背对着你,听到脚步声后缓缓转身。他的脸上有一道长长的刀疤,眼神锐利如鹰。"); print_story("\"你就是来调查林老爷失踪案的侦探?\"男人开口,声音沙哑,\"我是林老爷的私人保镖,赵武。这山庄里不安全,你最好尽快离开。\""); print_story("此时,你注意到他的袖口沾着一丝泥土,而大厅的地板却是干净的。同时,你看到楼梯口有一个女人的身影一闪而过。"); print_story("你有四个选择:"); cout << "1. 完全信任赵武,听从他的建议,立刻离开山庄" << endl; cout << "2. 质疑赵武的身份,要求他出示身份证明,并追问女人的去向" << endl; cout << "3. 假装信任赵武,向他打听林老爷的日常行踪,暗中观察他的反应" << endl; cout << "4. 无视赵武,直接冲向楼梯口,去寻找那个女人的踪迹" << endl; cout << "请输入你的选择(1/2/3/4):";int choice; cin >> choice; cout << endl;
switch (choice) { case 1: print_story("你觉得赵武虽然外表凶悍,但语气诚恳,便选择相信他。你跟着他走出山庄大门,回头望去,山庄仿佛一头蛰伏的巨兽,在雾气中若隐若现。"); modify_attribute("empathy", 2); modify_attribute("courage", -1); choice_flags.trust_npc = true; break; case 2: print_story("你盯着赵武的袖口,冷声质问道:"你袖口的泥土是哪里来的?楼梯口的女人是谁?请出示你的身份证明!"赵武的眼神瞬间变得冰冷,身体紧绷,似乎在戒备什么。"); modify_attribute("caution", 2); modify_attribute("courage", 1); modify_attribute("clue", 1); choice_flags.trust_npc = false; break; case 3: print_story("你露出微笑,对赵武说:"赵先生,麻烦你跟我说说林老爷失踪前的日常,这样我能更快找到他。"在赵武讲述的过程中,你注意到他在提到"阁楼"二字时,眼神躲闪了一下。"); modify_attribute("caution", 1); modify_attribute("empathy", 1); modify_attribute("clue", 2); choice_flags.trust_npc = false; break; case 4: print_story("你没有理会赵武的话,猛地冲向楼梯口。赵武大喊一声:"别去!"想要阻拦你,却被你巧妙躲开。你冲上楼梯,只看到一扇紧闭的房门,门上挂着一把生锈的锁。"); modify_attribute("courage", 2); modify_attribute("caution", -1); modify_attribute("clue", 1); choice_flags.trust_npc = false; break; default: print_story("你愣在原地,不知道该如何抉择。赵武见状,再次催促你离开,你最终还是半信半疑地跟着他走到了大厅门口。"); modify_attribute("empathy", 1); modify_attribute("courage", 0); choice_flags.trust_npc = true; break; }
story_stage = 2;
} // 阶段2:阁楼线索 + 第三个核心选择 void story_stage_2() { print_story("无论你是否信任赵武,最终你还是找到了进入阁楼的方法。阁楼里布满灰尘,堆放着许多旧物,墙角放着一个破旧的木箱,上面贴着一张泛黄的照片。"); print_story("照片上是林老爷和一个女人的合影,女人笑容温婉,正是十年前失踪的山庄女主人。木箱旁边,躺着一个浑身是伤的陌生女人,她气息微弱,看到你后,艰难地伸出手:\"救...救我...林老爷...他还活着...\""); print_story("此时,你听到阁楼楼下传来脚步声,赵武的声音越来越近:\"我看你往哪里跑!\""); print_story("你发现木箱里有林老爷的完整遗书,还有一把手枪和一瓶解药(可以救活女人)。你有三个选择:"); cout << "1. 优先拯救陌生女人,给她注射解药,再想办法带她逃离阁楼" << endl; cout << "2. 优先拿走木箱里的遗书和手枪,放弃拯救女人,独自逃离阁楼" << endl; cout << "3. 既拿走遗书和手枪,又尝试带着女人一起逃离阁楼" << endl; cout << "请输入你的选择(1/2/3):";int choice; cin >> choice; cout << endl;
switch (choice) { case 1: print_story("你毫不犹豫地拿起解药,给女人注射进去。女人的气息逐渐平稳,她告诉你:"赵武想要霸占山庄的财产,把林老爷囚禁在了地下室!"就在此时,赵武冲上了阁楼。"); modify_attribute("empathy", 3); modify_attribute("courage", 1); modify_attribute("clue", 1); choice_flags.save_stranger = true; break; case 2: print_story("你看了一眼奄奄一息的女人,咬了咬牙,拿起遗书和手枪,从阁楼的后窗跳了下去。你落地时崴了脚,但好在成功摆脱了赵武的追捕,女人的呼救声在你身后渐渐消失。"); modify_attribute("caution", 1); modify_attribute("courage", 1); modify_attribute("empathy", -2); choice_flags.save_stranger = false; break; case 3: print_story("你快速拿起遗书和手枪,然后背起女人,试图从后窗逃离。女人的体重超出了你的预期,你落地时动作迟缓,被赶来的赵武发现,他举着一把砍刀,挡住了你的去路。"); modify_attribute("courage", 2); modify_attribute("empathy", 2); modify_attribute("caution", -1); choice_flags.save_stranger = true; break; default: print_story("你犹豫不决,既想救女人,又想拿走线索。就在你纠结的时候,赵武已经冲上阁楼,将你和女人团团围住。"); modify_attribute("empathy", 1); modify_attribute("courage", -1); choice_flags.save_stranger = true; break; }
story_stage = 3;
} // 阶段3:地下室真相 + 第四个核心选择 void story_stage_3() { print_story("根据线索(或女人的指引),你找到了山庄的地下室。地下室里阴暗潮湿,散发着一股刺鼻的消毒水味。"); print_story("你看到林老爷被铁链锁在墙壁上,脸色苍白,神情萎靡。他的面前放着一个燃烧的火盆,里面烧着一些纸张,正是山庄的财产转让协议。"); print_story("赵武站在火盆旁,看到你后,疯狂地大笑起来:\"既然你都找到了这里,那就别想活着离开!这山庄的财产,以后就是我的了!\""); print_story("此时,你发现火盆旁边有一个煤气罐,手枪里只有3发子弹,女人(若存活)可以帮你牵制赵武。你有三个选择:"); cout << "1. 烧毁火盆旁的所有证据(包括遗书),假装妥协,趁机偷袭赵武" << endl; cout << "2. 用手枪威慑赵武,要求他释放林老爷,然后带着林老爷和女人(若存活)安全离开" << endl; cout << "3. 引爆煤气罐,与赵武同归于尽,保护林老爷和遗书(真相不被掩盖)" << endl; cout << "请输入你的选择(1/2/3):";int choice; cin >> choice; cout << endl;
switch (choice) { case 1: print_story("你当着赵武的面,将遗书扔进火盆里,假装害怕地说:"我不会泄露这里的秘密,求你放我走。"赵武放松警惕的瞬间,你突然掏出藏好的武器(或发动女人牵制),偷袭了他。"); modify_attribute("caution", 2); modify_attribute("sanity", -1); choice_flags.burn_evidence = true; break; case 2: print_story("你举起手枪,对准赵武的胸口,厉声说道:"放了林老爷,否则我开枪了!"赵武看着你坚定的眼神,又看了看手枪,犹豫片刻后,缓缓解开了林老爷身上的铁链。"); modify_attribute("courage", 2); modify_attribute("clue", 1); choice_flags.burn_evidence = false; break; case 3: print_story("你知道自己不一定能打过赵武,也不一定能带着所有人安全离开。你悄悄打开煤气罐的阀门,然后将一根燃烧的火柴扔向煤气罐。"我就算死,也要揭露你的罪行!""); modify_attribute("courage", 3); modify_attribute("sanity", -2); modify_attribute("empathy", 1); choice_flags.burn_evidence = false; break; default: print_story("你紧张得手忙脚乱,手枪不慎掉在地上。赵武见状,立刻冲了上来,与你扭打在一起。混乱中,你不知道该如何是好。"); modify_attribute("courage", -1); modify_attribute("sanity", -1); choice_flags.burn_evidence = true; break; }
story_stage = 4;
} // 核心函数:计算结局编号(1-100) int calculate_end_number() { // 1. 计算属性总分(0-50),映射为0-69(70个档位) int total_attr = player_attr.sanity + player_attr.courage + player_attr.caution + player_attr.empathy + player_attr.clue; int attr_grade = min(69, max(0, total_attr * 69 / 50)); // 归一化到0-69// 2. 计算关键选择标记得分(0-19),4个flag组合出16种,扩展为0-19 int flag_grade = 0; if (choice_flags.trust_npc) flag_grade += 5; if (choice_flags.check_trap) flag_grade += 5; if (choice_flags.save_stranger) flag_grade += 5; if (choice_flags.burn_evidence) flag_grade += 5; flag_grade = min(19, max(0, flag_grade)); // 归一化到0-19
// 3. 随机因子(0-9),10个档位 int random_grade = get_random_int(0, 9);
// 4. 计算最终结局编号(1-100):attr_grade(0-69) + flag_grade(0-19) + random_grade(0-9) + 1 int end_number = attr_grade + flag_grade + random_grade + 1; // 确保结局编号在1-100之间 end_number = min(100, max(1, end_number));
return end_number;
} // 结局描述函数:返回100种结局的详细描述 string get_end_description(int end_num) { // 按结局类型分类,确保100种结局各有差异 vector<string> end_descriptions(101); // 索引1-100// 1-20:逃生类结局(成功逃离山庄,结果不同) end_descriptions[1] = "【结局1:狼狈逃生】你独自逃离雾影山庄,什么线索都没带走,也没救任何人。从此你再也不敢提及这个山庄,夜夜被噩梦缠身。"; end_descriptions[2] = "【结局2:侥幸逃生】你带着残缺的线索逃离山庄,赵武没有追来。你将线索交给警方,但因证据不足,赵武逍遥法外。"; end_descriptions[3] = "【结局3:带人行生】你带着陌生女人逃离山庄,林老爷不幸遇害。你帮女人养好伤,她告诉你部分真相,你们一起过上了隐姓埋名的生活。"; end_descriptions[4] = "【结局4:全员逃生】你成功带着林老爷和女人逃离山庄,警方根据你的线索,将赵武抓捕归案,正义得到伸张。"; end_descriptions[5] = "【结局5:负伤逃生】你在逃离过程中被赵武砍伤,落下终身残疾。但你成功将真相公之于众,成为了人们口中的英雄。"; end_descriptions[6] = "【结局6:懦弱逃生】你在赵武的威胁下,跪地求饶,赵武不屑于杀你,将你赶出山庄。你从此声名狼藉,再也无法从事侦探行业。"; end_descriptions[7] = "【结局7:机智逃生】你利用阁楼的陷阱,将赵武困住,然后从容逃离山庄,还带走了全部线索,成功协助警方破案。"; end_descriptions[8] = "【结局8:惊险逃生】你从山庄后窗跳下,摔断了腿,被路过的村民救下。你在医院躺了三个月,醒来后,雾影山庄已经被大火烧毁。"; end_descriptions[9] = "【结局9:遗忘逃生】你逃离山庄后,因过度惊吓失去了关于山庄的所有记忆,过上了平淡无奇的普通人生活,再也没有想起过那段经历。"; end_descriptions[10] = "【结局10:愧疚逃生】你独自逃离山庄,女人和林老爷都被赵武杀害。你余生都活在愧疚中,不断捐款行善,试图弥补自己的过错。"; end_descriptions[11] = "【结局11:结伴逃生】你和赵武达成协议,平分林老爷的财产,然后一起逃离山庄。你们从此分道扬镳,再也没有联系。"; end_descriptions[12] = "【结局12:秘密逃生】你发现林老爷才是幕后真凶,赵武只是被利用。你带着这个秘密逃离山庄,林老爷和赵武最终自相残杀,同归于尽。"; end_descriptions[13] = "【结局13:带证逃生】你带着完整的遗书和财产协议逃离山庄,将林老爷和赵武的罪行一并揭露,两人都被警方抓捕。"; end_descriptions[14] = "【结局14:被迫逃生】你被女人胁迫,带着她逃离山庄。后来你发现,女人是山庄女主人的妹妹,她的目标是为姐姐复仇。"; end_descriptions[15] = "【结局15:幸运逃生】你在逃离过程中,遇到了前来巡查的警察,赵武当场被抓获。你因协助破案,获得了一笔丰厚的奖金。"; end_descriptions[16] = "【结局16:遗憾逃生】你成功逃离山庄,但林老爷在逃离过程中因伤势过重去世。你将他的遗体带回,帮他举办了一场简单的葬礼。"; end_descriptions[17] = "【结局17:恐惧逃生】你逃离山庄后,患上了严重的恐惧症,不敢再进入任何老旧的建筑,甚至不敢在晚上出门。"; end_descriptions[18] = "【结局18:荣耀逃生】你成功破获案件,成为了当地有名的侦探,许多人慕名而来,请你帮忙调查各种悬案。"; end_descriptions[19] = "【结局19:低调逃生】你成功破案后,拒绝了所有采访和奖励,选择低调地离开当地,继续过着漂泊的侦探生活。"; end_descriptions[20] = "【结局20:意外逃生】山庄突然发生地震,墙体坍塌,赵武被埋在废墟下。你趁机带着林老爷和女人逃离,山庄从此被埋在地下,成为永恒的秘密。";
// 21-40:牺牲类结局(自身或他人牺牲,结果不同) end_descriptions[21] = "【结局21:自我牺牲】你为了保护林老爷和女人,主动吸引赵武的注意力,最终被赵武杀害。他们两人成功逃离,将你的事迹流传后世。"; end_descriptions[22] = "【结局22:女人牺牲】女人为了保护你和林老爷,主动与赵武同归于尽。你带着林老爷逃离,余生都在缅怀这个勇敢的女人。"; end_descriptions[23] = "【结局23:林老爷牺牲】林老爷为了让你和女人逃离,引爆了随身携带的炸药,与赵武同归于尽。你带着女人,帮林老爷完成了遗愿。"; end_descriptions[24] = "【结局24:无意义牺牲】你冲动地与赵武正面硬刚,最终被赵武杀害,林老爷和女人也没能逃脱,所有人都死在了山庄里。"; end_descriptions[25] = "【结局25:壮烈牺牲】你引爆煤气罐,与赵武同归于尽。警方后来在废墟中发现了遗书,揭露了所有真相,你被追认为烈士。"; end_descriptions[26] = "【结局26:遗憾牺牲】你在与赵武的搏斗中,身受重伤,临终前将线索交给女人,让她带着林老爷逃离。你在山庄里闭上了眼睛,再也没有醒来。"; end_descriptions[27] = "【结局27:被迫牺牲】你被赵武抓住,他以林老爷和女人的性命要挟你,让你自行了断。为了保护他们,你选择了自杀。"; end_descriptions[28] = "【结局28:误杀牺牲】你在混乱中,不慎被女人误伤,最终不治身亡。女人和林老爷成功逃离,却永远活在误杀你的愧疚中。"; end_descriptions[29] = "【结局29:交换牺牲】你与赵武达成交换协议,用自己的性命换取林老爷和女人的自由。赵武遵守承诺,放他们离开,你则被赵武杀害。"; end_descriptions[30] = "【结局30:意外牺牲】山庄的阁楼突然坍塌,你为了保护遗书,被埋在废墟下。林老爷和女人成功逃离,遗书最终被公之于众。"; end_descriptions[31] = "【结局31:懦弱牺牲】你在赵武的威胁下,选择出卖林老爷和女人,试图换取自己的性命。但赵武出尔反尔,最终将你也一并杀害。"; end_descriptions[32] = "【结局32:勇敢牺牲】你手持手枪,与赵武展开殊死搏斗,虽然最终不敌赵武,但为林老爷和女人争取了足够的逃生时间。"; end_descriptions[33] = "【结局33:理智牺牲】你知道自己无法战胜赵武,便选择将线索藏在身上,然后故意被赵武杀害。警方后来在你的尸体上发现了线索,破获了案件。"; end_descriptions[34] = "【结局34:共情牺牲】你看到女人和林老爷的悲惨遭遇,决定牺牲自己,帮他们报仇。你设计将赵武引入陷阱,与他同归于尽。"; end_descriptions[35] = "【结局35:谨慎牺牲】你提前在山庄布置了陷阱,但在触发陷阱时,不慎被波及,最终与赵武一起死于陷阱之中。"; end_descriptions[36] = "【结局36:鲁莽牺牲】你没有做好任何准备,就直接冲向赵武,想要与他硬拼,最终被赵武轻松杀害,毫无价值。"; end_descriptions[37] = "【结局37:神秘牺牲】你在与赵武的搏斗中,突然被一股神秘力量带走,从此消失得无影无踪。林老爷和女人成功逃离,再也没有你的消息。"; end_descriptions[38] = "【结局38:荣誉牺牲】你成功保护了林老爷和所有线索,自己却因伤势过重去世。林老爷为你修建了一座墓碑,每年都会去祭拜你。"; end_descriptions[39] = "【结局39:无名牺牲】你死后,没有人知道你的事迹,林老爷和女人为了躲避追杀,选择隐姓埋名,你的名字从此被遗忘在历史的长河中。"; end_descriptions[40] = "【结局40:双重牺牲】你和赵武都身受重伤,在临死前,你们互相道出了自己的苦衷。最终,两人都死在了山庄的地下室里,成为了永恒的秘密。";
// 41-60:真相类结局(揭露不同程度的真相,结果不同) end_descriptions[41] = "【结局41:揭露全部真相】你带着完整的线索和证人,将林老爷和赵武的罪行全部揭露,两人都受到了法律的严惩,山庄的秘密也公之于众。"; end_descriptions[42] = "【结局42:揭露部分真相】你只找到了部分线索,只能揭露赵武的罪行,林老爷的秘密则永远被掩盖,他从此过上了逍遥自在的生活。"; end_descriptions[43] = "【结局43:揭露虚假真相】你被林老爷欺骗,将虚假的线索交给警方,赵武成为了替罪羊,林老爷则霸占了山庄的所有财产。"; end_descriptions[44] = "【结局44:自我揭露真相】你在临死前,将自己记录的真相刻在墙上。多年后,有人发现了这面墙,山庄的秘密才得以重见天日。"; end_descriptions[45] = "【结局45:通过媒体揭露真相】你将真相告诉了媒体,媒体对其进行了大肆报道。赵武和林老爷成为了人人喊打的过街老鼠,最终被迫自首。"; end_descriptions[46] = "【结局46:私下揭露真相】你没有将真相公之于众,而是私下告诉了林老爷的家人。林老爷的家人为他举办了葬礼,然后将赵武告上了法庭。"; end_descriptions[47] = "【结局47:遗憾揭露真相】你成功揭露了所有真相,但林老爷和女人都已经去世,再也无法看到正义得到伸张的那一刻。"; end_descriptions[48] = "【结局48:惊险揭露真相】你在赵武的追杀下,一路逃亡,最终在警局门口将真相和盘托出。赵武当场被警方抓获,无法再对你下手。"; end_descriptions[49] = "【结局49:机智揭露真相】你将真相藏在一本小说中,以小说的形式将其公之于众。人们都以为是虚构的故事,只有你知道,这是真实发生的事情。"; end_descriptions[50] = "【结局50:被迫揭露真相】你被赵武抓住,在严刑拷打下,被迫说出了真相。但赵武担心你泄露更多信息,最终还是将你杀害。"; end_descriptions[51] = "【结局51:荣耀揭露真相】你因揭露山庄的秘密,成为了当地的名人,被邀请参加各种访谈节目,你的侦探事业也达到了顶峰。"; end_descriptions[52] = "【结局52:低调揭露真相】你揭露真相后,拒绝了所有的荣誉和奖励,选择默默离开,继续过着自己的平淡生活。"; end_descriptions[53] = "【结局53:恐惧揭露真相】你虽然揭露了真相,但也因此受到了赵武同伙的威胁。你从此过上了提心吊胆的生活,不敢再轻易相信任何人。"; end_descriptions[54] = "【结局54:愧疚揭露真相】你为了揭露真相,不惜牺牲了女人的性命。虽然最终正义得到了伸张,但你余生都活在愧疚之中。"; end_descriptions[55] = "【结局55:理智揭露真相】你冷静地分析所有线索,制定了详细的计划,最终一步步将真相揭露,没有造成任何人员伤亡。"; end_descriptions[56] = "【结局56:鲁莽揭露真相】你没有制定任何计划,就直接上门找赵武对质,最终被赵武杀害,真相也随之被掩盖。"; end_descriptions[57] = "【结局57:共情揭露真相】你因为同情女人的遭遇,下定决心揭露所有真相。你花费了数年时间,终于将赵武和林老爷绳之以法。"; end_descriptions[58] = "【结局58:谨慎揭露真相】你提前收集了所有证据,并联系了警方。在警方的协助下,你成功揭露了真相,将赵武和林老爷一网打尽。"; end_descriptions[59] = "【结局59:神秘揭露真相】一股神秘力量帮助你找到了所有线索,你轻松地揭露了真相。但这股神秘力量的身份,你永远也无法得知。"; end_descriptions[60] = "【结局60:永恒揭露真相】你将真相刻在一块石碑上,埋在山庄的门口。多年后,山庄被开发成旅游景点,石碑被人发现,真相从此永远流传。";
// 61-80:黑化/堕落类结局(自身或他人黑化,结果不同) end_descriptions[61] = "【结局61:侦探黑化】你发现山庄的财产数额巨大,便动了贪念。你杀害了赵武、林老爷和女人,霸占了所有财产,从此成为了一名黑道大佬。"; end_descriptions[62] = "【结局62:被迫黑化】你被警方诬陷,成为了山庄案件的替罪羊。你被迫走上犯罪道路,从此开始了对警方的报复。"; end_descriptions[63] = "【结局63:愧疚黑化】你因为没能保护好女人和林老爷,内心充满了愧疚。你开始变得极端,只要是有罪的人,你都会毫不犹豫地将其杀害。"; end_descriptions[64] = "【结局64:权力黑化】你利用山庄的秘密,威胁林老爷和赵武,成为了他们的幕后操控者。你从此掌握了巨大的权力,呼风唤雨。"; end_descriptions[65] = "【结局65:金钱黑化】你接受了林老爷的贿赂,帮他掩盖了所有真相。你拿着这笔钱,过上了奢侈的生活,但永远也无法心安理得。"; end_descriptions[66] = "【结局66:恐惧黑化】你被山庄的恐怖经历吓破了胆,开始变得冷血无情。你不再相信任何人,只要有人威胁到你,你就会将其除掉。"; end_descriptions[67] = "【结局67:女人黑化】女人为了给姐姐复仇,变得极端疯狂。她杀害了林老爷和赵武,然后也将你杀害,最终自己也选择了自杀。"; end_descriptions[68] = "【结局68:林老爷黑化】林老爷其实没有被囚禁,他才是幕后真凶。他利用你和赵武的争斗,坐收渔翁之利,最终霸占了所有财产。"; end_descriptions[69] = "【结局69:赵武黑化】赵武没有被抓获,他逃了出去,然后开始疯狂报复你。你从此过上了颠沛流离的生活,永远无法摆脱他的追杀。"; end_descriptions[70] = "【结局70:全员黑化】你、赵武、林老爷和女人,都因为山庄的秘密而变得黑化。你们互相算计,互相残杀,最终没有一个人能活下来。"; end_descriptions[71] = "【结局71:轻度黑化】你为了生存,说了一些善意的谎言,掩盖了部分真相。你虽然活了下来,但内心始终有一道无法抹去的伤疤。"; end_descriptions[72] = "【结局72:重度黑化】你彻底抛弃了自己的良知,为了达到目的,不择手段。你杀害了所有知道真相的人,从此成为了一个冷血的杀手。"; end_descriptions[73] = "【结局73:短暂黑化】你在一时冲动下,黑化杀害了赵武。但事后你非常后悔,选择了向警方自首,接受法律的制裁。"; end_descriptions[74] = "【结局74:伪装黑化】你假装黑化,加入赵武的团伙,然后暗中收集证据,最终将他们一网打尽。你也因此付出了巨大的代价。"; end_descriptions[75] = "【结局75:被逼黑化】你和你的家人被赵武威胁,为了保护家人,你不得不选择黑化,帮赵武掩盖真相,做一些伤天害理的事情。"; end_descriptions[76] = "【结局76:利益黑化】你和赵武达成合作,一起霸占山庄的财产。你们表面上是合作伙伴,暗地里却互相提防,最终还是会自相残杀。"; end_descriptions[77] = "【结局77:情感黑化】你爱上了女人,但女人却被赵武杀害。你为了给女人报仇,变得极端疯狂,开始了无差别的报复行动。"; end_descriptions[78] = "【结局78:理智黑化】你冷静地分析了所有利弊,认为黑化是唯一的生存之道。你从此变得冷酷无情,但却能在残酷的世界中活得很好。"; end_descriptions[79] = "【结局79:神秘黑化】一股神秘力量控制了你的心智,让你变得黑化。你杀害了所有知道真相的人,然后成为了这股神秘力量的傀儡。"; end_descriptions[80] = "【结局80:永恒黑化】你永远活在山庄的阴影中,内心充满了黑暗。你再也无法找回曾经的自己,只能在黑暗中不断沉沦,直到生命的尽头。";
// 81-100:神秘/超自然类结局(涉及超自然力量,结果不同) end_descriptions[81] = "【结局81:山庄诅咒】你发现雾影山庄被下了诅咒,所有进入山庄的人都无法活着离开。你最终也被诅咒吞噬,成为了山庄的一部分。"; end_descriptions[82] = "【结局82:女鬼救赎】山庄女主人的鬼魂出现,她没有伤害你,反而帮你逃离了山庄,并消除了你关于山庄的所有痛苦记忆。"; end_descriptions[83] = "【结局83:女鬼索命】山庄女主人的鬼魂认为你是赵武的同伙,对你展开了追杀。你最终被女鬼杀害,成为了她的又一个牺牲品。"; end_descriptions[84] = "【结局84:时空穿越】你在山庄的阁楼里,意外触发了时空穿越装置,回到了十年前。你试图阻止女主人的死亡,却发现一切都是命中注定。"; end_descriptions[85] = "【结局85:平行世界】你逃离山庄后,发现自己来到了一个平行世界。在这个世界里,林老爷没有失踪,女主人也没有死亡,一切都是那么美好。"; end_descriptions[86] = "【结局86:神秘救援】在你即将被赵武杀害的时候,一群神秘人出现,将你救走。他们告诉你,他们是专门处理超自然事件的组织。"; end_descriptions[87] = "【结局87:获得超能力】你在山庄里,意外获得了预知未来的超能力。你利用这个能力,成功逃离山庄,并成为了一名拯救世界的英雄。"; end_descriptions[88] = "【结局88:变成鬼魂】你被赵武杀害后,灵魂无法离开山庄,只能成为一名孤魂野鬼,永远徘徊在山庄的各个角落。"; end_descriptions[89] = "【结局89:解除诅咒】你找到了解除山庄诅咒的方法,成功将女主人的鬼魂超度。山庄从此恢复平静,再也没有怪事发生。"; end_descriptions[90] = "【结局90:被诅咒附身】你被山庄的诅咒附身,从此变得半人半鬼。你既无法活着离开山庄,也无法彻底死去,只能永远被困在这里。"; end_descriptions[91] = "【结局91:神秘契约】你与山庄的女主人签订了契约,用自己的十年寿命换取逃离山庄的机会。你成功逃离,但十年后,你还是会被召回山庄。"; end_descriptions[92] = "【结局92:超自然目击】你在山庄里,目击了一场超自然事件,看到了外星人造访地球的证据。你试图将这个证据公之于众,却没有人相信你。"; end_descriptions[93] = "【结局93:神秘消失】你在调查山庄的过程中,突然神秘消失。警方对你展开了大规模的搜索,却始终没有找到你的任何踪迹。"; end_descriptions[94] = "【结局94:鬼魂合作】你与山庄女主人的鬼魂达成合作,帮她复仇,她则帮你获得山庄的财产。你们联手将赵武和林老爷杀害,达成了各自的目的。"; end_descriptions[95] = "【结局95:时空循环】你被困在了一个时空循环中,每天都在重复进入山庄的那一天。你尝试了各种方法,却始终无法打破这个循环。"; end_descriptions[96] = "【结局96:超自然保护】一股超自然力量一直在暗中保护你,帮你化解了各种危险。你成功逃离山庄,却永远不知道这股力量的来源。"; end_descriptions[97] = "【结局97:成为新的山庄主人】你解除了山庄的诅咒,成为了新的山庄主人。你在这里过上了平静的生活,守护着山庄的秘密。"; end_descriptions[98] = "【结局98:与鬼魂为伴】你选择留在山庄,与女主人的鬼魂为伴。你们互相陪伴,不再感到孤独,山庄也从此变得温暖起来。"; end_descriptions[99] = "【结局99:超自然真相】你发现山庄的失踪案其实是外星人人为的,他们将林老爷抓走,进行外星实验。你最终也被外星人抓走,再也没有回来。"; end_descriptions[100] = "【结局100:终极解脱】你在山庄里,找到了人生的真谛,放下了所有的执念。你选择自我了断,灵魂得到了终极解脱,再也不受世俗的束缚。";
return end_descriptions[end_num];
} // 游戏结束流程 void game_over() { print_story("======================================= 剧情结束 ======================================="); int end_num = calculate_end_number(); string end_desc = get_end_description(end_num); print_story(end_desc); print_story("你的结局编号:" + to_string(end_num) + "/100"); print_story("======================================================================================="); game_running = false; } // 游戏主循环 void game_loop() { print_story("欢迎进入悬疑剧情选择类游戏【雾影山庄】"); print_story("游戏规则:在每个剧情节点做出你的选择,你的选择将影响隐藏属性和最终结局"); print_story("游戏共有100种不同结局,看看你能触发哪一种!"); print_story("======================================= 游戏开始 ======================================="); cout << endl;while (game_running) { switch (story_stage) { case 0: story_stage_0(); break; case 1: story_stage_1(); break; case 2: story_stage_2(); break; case 3: story_stage_3(); break; case 4: game_over(); break; default: game_over(); break; } }
} // 主函数 int main() { game_loop(); return 0; }#include <iostream> #include <string> #include <vector> #include <algorithm> // 兼容C++11,关闭Windows安全警告 #pragma warning(disable: 4996) using namespace std; // 简化版游戏核心属性(仅保留2个关键隐藏属性) struct GameAttributes { int sanity; // 理智(0-10):影响精神状态和结局走向 int clue; // 线索(0-10):决定解谜完整度,影响真相类结局// C++11 构造函数初始化 GameAttributes() : sanity(5), clue(5) {}
}; // 简化版关键选择标记(仅保留2个核心标记) struct ChoiceFlags { bool trust_npc; // 是否信任神秘保镖赵武 bool save_stranger; // 是否拯救陌生受伤女人ChoiceFlags() : trust_npc(false), save_stranger(false) {}
}; // 游戏全局状态 GameAttributes player_attr; ChoiceFlags choice_flags; int story_stage = 0; // 剧情阶段(0-3,对应3个核心选择节点+结局阶段) bool game_running = true; // 属性修改函数(限制数值在0-10之间) void modify_attribute(string attr_name, int value) { if (attr_name == "sanity") { player_attr.sanity += value; player_attr.sanity = max(0, min(10, player_attr.sanity)); } else if (attr_name == "clue") { player_attr.clue += value; player_attr.clue = max(0, min(10, player_attr.clue)); } } // 剧情打印函数(营造阅读节奏) void print_story(const string& content) { for (char c : content) { // C++11 范围for循环 cout << c; // 句末标点简单延时,增强沉浸感 if (c == '.' || c == '!' || c == '?') { for (int i = 0; i < 50000000; i++); } } cout << endl << endl; } // 阶段0:游戏开局 + 第一个核心选择(山庄入口) void story_stage_0() { print_story("【悬疑游戏:雾影山庄(精简版)】"); print_story("你是一名私家侦探,受雇调查雾影山庄林老爷离奇失踪案。"); print_story("出租车停在山庄大门前,门虚掩着,弥漫着潮湿霉味,司机催促你尽快下车,不愿多待。"); print_story("你的第一个选择:"); cout << "1. 直接推门进入山庄,快速展开调查" << endl; cout << "2. 在门口观察片刻,收集周边痕迹后再进入" << endl; cout << "请输入你的选择(1/2):";int choice; cin >> choice; cout << endl;
switch (choice) { case 1: print_story("你直接推开大门,木门发出刺耳的“吱呀”声,山庄内一片昏暗,寒意扑面而来。"); modify_attribute("sanity", -1); // 贸然进入降低理智 break; case 2: print_story("你蹲在围墙边观察,发现墙角有新鲜脚印和带血银针,提前知晓山庄暗藏危险。"); modify_attribute("clue", 2); // 观察收集线索 modify_attribute("sanity", 1); // 谨慎行为提升理智 break; default: print_story("你犹豫不决,最终还是硬着头皮推开大门,浪费了些许时间。"); modify_attribute("sanity", 0); break; }
story_stage = 1;
} // 阶段1:山庄大厅 + 第二个核心选择(面对神秘保镖) void story_stage_1() { print_story("你进入山庄大厅,煤油灯随风晃动,墙上影子忽明忽暗。"); print_story("一名脸上带刀疤的黑衣男人转身看来,自称林老爷的保镖赵武,劝你尽快离开,说山庄不安全。"); print_story("你注意到他袖口沾着泥土,而大厅地板一尘不染,楼梯口有女人身影一闪而过。"); print_story("你的第二个选择:"); cout << "1. 信任赵武,听从建议立刻离开山庄" << endl; cout << "2. 质疑赵武,追问泥土来源和女人去向" << endl; cout << "3. 假装信任,暗中打听林老爷行踪" << endl; cout << "请输入你的选择(1/2/3):";int choice; cin >> choice; cout << endl;
switch (choice) { case 1: print_story("你选择信任赵武,跟着他走出山庄。回头望去,山庄在雾气中像一头蛰伏的巨兽。"); choice_flags.trust_npc = true; modify_attribute("sanity", 1); modify_attribute("clue", -1); // 提前离开丢失线索 break; case 2: print_story("你冷声质疑赵武的疑点,他眼神瞬间冰冷,身体紧绷,显然有所隐瞒。"); choice_flags.trust_npc = false; modify_attribute("clue", 2); modify_attribute("sanity", 0); break; case 3: print_story("你假装信任赵武,在他讲述时,发现他提到“阁楼”二字时眼神躲闪,暗藏玄机。"); choice_flags.trust_npc = false; modify_attribute("clue", 3); modify_attribute("sanity", 1); break; default: print_story("你愣在原地,赵武再次催促,你半信半疑地走到大厅门口,最终还是决定留下调查。"); choice_flags.trust_npc = true; modify_attribute("clue", 1); break; }
story_stage = 2;
} // 阶段2:阁楼线索 + 第三个核心选择(是否拯救陌生女人) void story_stage_2() { print_story("无论你是否信任赵武,最终都找到了进入阁楼的方法。"); print_story("阁楼里布满灰尘,木箱上贴着林老爷和十年前失踪女主人的合影,木箱旁躺着一名浑身是伤的陌生女人,气息微弱地向你求救。"); print_story("楼下传来赵武的脚步声,越来越近,你发现木箱里有林老爷的完整遗书和一瓶解药。"); print_story("你的第三个选择:"); cout << "1. 优先拯救女人,给她注射解药后再想办法逃离" << endl; cout << "2. 放弃女人,拿走遗书独自逃离阁楼" << endl; cout << "请输入你的选择(1/2):";int choice; cin >> choice; cout << endl;
switch (choice) { case 1: print_story("你立刻给女人注射解药,她气息平稳后告诉你:赵武想霸占财产,林老爷被囚禁在地下室!此时,赵武冲上了阁楼。"); choice_flags.save_stranger = true; modify_attribute("sanity", 2); // 救人提升理智 modify_attribute("clue", 1); // 女人提供线索 break; case 2: print_story("你咬咬牙,拿起遗书从后窗跳下,落地崴脚但成功脱身,女人的呼救声在你身后渐渐消失。"); choice_flags.save_stranger = false; modify_attribute("sanity", -2); // 见死不救降低理智 modify_attribute("clue", 1); // 拿到遗书获得线索 break; default: print_story("你犹豫不决,赵武已冲上阁楼,将你和女人团团围住,陷入绝境。"); choice_flags.save_stranger = true; modify_attribute("sanity", -1); break; }
story_stage = 3;
} // 核心函数:计算结局编号(1-10) int calculate_end_number() { // 1. 属性总分(0-20)映射为0-5(6个档位) int total_attr = player_attr.sanity + player_attr.clue; int attr_grade = min(5, max(0, total_attr * 5 / 20));// 2. 选择标记得分(0-3)(2个flag组合4种情况,映射0-3) int flag_grade = 0; if (choice_flags.trust_npc) flag_grade += 2; if (choice_flags.save_stranger) flag_grade += 1; flag_grade = min(3, max(0, flag_grade));
// 3. 计算结局编号(1-10),确保不超出范围 int end_number = attr_grade + flag_grade + 1; end_number = min(10, max(1, end_number));
return end_number;
} // 结局描述函数:返回10种精简版结局 string get_end_description(int end_num) { vector<string> end_descriptions(11); // 索引1-10// 逃生类结局(1-3) end_descriptions[1] = "【结局1:狼狈逃生(最差)】你独自逃离山庄,线索丢失,也未救人,从此夜夜被噩梦缠身,不敢再提雾影山庄。"; end_descriptions[2] = "【结局2:普通逃生】你带着残缺线索逃离,赵武逍遥法外,你因证据不足,无法为林老爷伸冤,侦探声名受损。"; end_descriptions[3] = "【结局3:圆满逃生(最佳)】你带着女人和林老爷成功逃离,警方根据线索抓捕赵武,正义得到伸张,你成为知名侦探。";
// 真相类结局(4-6) end_descriptions[4] = "【结局4:部分真相】你只揭露了赵武的罪行,林老爷的隐秘(杀害女主人)被掩盖,他从此隐姓埋名,安享晚年。"; end_descriptions[5] = "【结局5:完整真相】你带着遗书和女人的证词,将林老爷(杀妻)和赵武(谋财)的罪行全部揭露,两人均被严惩。"; end_descriptions[6] = "【结局6:虚假真相】你被林老爷欺骗,将虚假线索交给警方,赵武成为替罪羊,林老爷霸占山庄财产,逍遥法外。";
// 牺牲类结局(7-8) end_descriptions[7] = "【结局7:自我牺牲】你为保护女人和林老爷,主动吸引赵武注意力,最终被杀害,他们成功逃生,你的事迹被流传后世。"; end_descriptions[8] = "【结局8:他人牺牲】女人为掩护你和林老爷,与赵武同归于尽,你带着林老爷逃离,余生都在缅怀这个勇敢的女人。";
// 超自然类结局(9-10) end_descriptions[9] = "【结局9:女鬼救赎】山庄女主人鬼魂出现,帮你击退赵武,消除了你关于山庄的痛苦记忆,你从此过上平淡生活。"; end_descriptions[10] = "【结局10:山庄诅咒】你发现山庄被女主人诅咒,所有知晓真相的人都无法离开,你最终被诅咒吞噬,成为山庄的一部分。";
return end_descriptions[end_num];
} // 游戏结束流程 void game_over() { print_story("======================================= 剧情结束 ======================================="); int end_num = calculate_end_number(); string end_desc = get_end_description(end_num); print_story(end_desc); print_story("你的结局编号:" + to_string(end_num) + "/10"); print_story("======================================================================================="); game_running = false; } // 游戏主循环 void game_loop() { print_story("欢迎进入悬疑剧情选择类游戏【雾影山庄(精简版)】"); print_story("游戏规则:每个剧情节点做出选择,影响隐藏属性和最终结局(共10种)"); print_story("======================================= 游戏开始 ======================================="); cout << endl;while (game_running) { switch (story_stage) { case 0: story_stage_0(); break; case 1: story_stage_1(); break; case 2: story_stage_2(); break; case 3: game_over(); break; default: game_over(); break; } }
} // 主函数(程序入口) int main() { game_loop(); return 0; }TM的这人抄我主页,一模一样,连我名字都没改!!!
-
通过的题目
-
最近活动
This person is lazy and didn't join any contests or homework. -
最近编写的题解
题目标签
- 聪明人游戏
- 2
- 贪心
- 1
- 深搜 广搜
- 1
- 广搜
- 1
- 大沥2021
- 1