//DSES原创水印
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
// 玩家全局状态
int hp = 100;
int food = 5;
int water = 5;
int weapon = 1;
bool hasPartner = false;
bool trustPartner = true;
int day = 1;
// 函数声明
void GameStart();
int Scene1();
int Scene2(int pre);
int Scene3(int pre);
int Scene4(int pre);
int Scene5(int pre);
int Scene6(int pre);
int Scene7(int pre);
int Scene8(int pre);
void ShowEnd(int id);
void ShowStatus();
int GetChoice(int minC, int maxC);
void ClearScreen();
int main()
{
srand((unsigned int)time(NULL));
cout << "=============================================\n";
cout << " 末日余生 - 长篇抉择游戏 \n";
cout << "=============================================\n";
cout << "背景:一场致命病毒席卷全球,城市沦为死城。\n";
cout << "丧尸横行、资源匮乏、人心叵测,你必须不断做出选择,努力活下去。\n";
cout << "每一个选择,都将改变你的命运。\n\n";
cout << "按下回车键开始游戏...\n";
cin.get();
ClearScreen();
GameStart();
cout << "\n游戏结束,按下回车键退出...\n";
cin.ignore();
cin.get();
return 0;
}
// 跨平台清屏
void ClearScreen()
{
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
// 通用选择输入(防错输入)
int GetChoice(int minC, int maxC)
{
int op;
while (true)
{
cout << "请输入选择(" << minC << "-" << maxC << "):";
if (cin >> op && op >= minC && op <= maxC)
{
cin.ignore(1024, '\n');
return op;
}
cin.clear();
cin.ignore(1024, '\n');
cout << "输入无效,请重新选择!\n";
}
}
// 显示玩家当前状态
void ShowStatus()
{
cout << "\n---------- 当前状态 ----------\n";
cout << "生存天数:第" << day << "天\n";
cout << "生命值:" << hp << " | 食物:" << food << " | 水源:" << water << "\n";
cout << "武器强度:" << weapon << "(0=无 1=小刀 2=铁棍 3=枪械)\n";
cout << "队友:" << (hasPartner ? "有" : "无") << "\n";
cout << "-----------------------------\n\n";
}
// 游戏主流程
void GameStart()
{
int s1 = Scene1();
int s2 = Scene2(s1);
int s3 = Scene3(s2);
int s4 = Scene4(s3);
int s5 = Scene5(s4);
int s6 = Scene6(s5);
int s7 = Scene7(s6);
int s8 = Scene8(s7);
ShowEnd(s8);
}
// 场景1:苏醒初始抉择
int Scene1()
{
ClearScreen();
day = 1;
cout << "【第1天】\n";
cout << "你在一栋倒塌的写字楼废墟中醒来,头部隐隐作痛。\n";
cout << "四周死寂,远处不断传来丧尸低沉的嘶吼。\n";
cout << "你站起身,面前有三条路:\n";
cout << "1. 前往一楼便利店(物资多,丧尸密集)\n";
cout << "2. 前往地下停车场(隐蔽,可能找到武器/车辆)\n";
cout << "3. 逃向城外荒野(安全,几乎无物资)\n\n";
int op = GetChoice(1, 3);
ShowStatus();
if (op == 1) return 1;
else if (op == 2) return 2;
return 3;
}
// 场景2:承接场景1分支
int Scene2(int pre)
{
ClearScreen();
day = 2;
cout << "【第2天】\n";
int op;
if (pre == 1)
{
cout << "你来到便利店,角落里蹲着两只丧尸。\n";
cout << "1. 悄悄绕路搜刮物资\n";
cout << "2. 捡木棍上前战斗\n";
cout << "3. 放弃物资立刻撤离\n\n";
op = GetChoice(1, 3);
if (op == 1)
{
food += 3; water += 3;
cout << "你拿到物资,悄悄离开。\n";
return 11;
}
else if (op == 2)
{
weapon = 2; hp -= 20;
cout << "缠斗击退丧尸,你也受了伤。\n";
return 12;
}
else
{
cout << "你放弃物资快速离开。\n";
return 13;
}
}
else if (pre == 2)
{
cout << "地下停车场昏暗,你捡到一把小刀,同时听到脚步声。\n";
cout << "1. 躲在车后观察来人\n";
cout << "2. 主动上前查看\n";
cout << "3. 拿上小刀立刻离开\n\n";
op = GetChoice(1, 3);
if (op == 1) return 21;
else if (op == 2)
{
hp -= 30;
cout << "双方发生冲突,你负伤离开。\n";
return 22;
}
else
{
weapon = 1;
cout << "你带走小刀,迅速撤离。\n";
return 23;
}
}
else
{
cout << "你逃到城外荒野,没有丧尸,但缺少食物水源。\n";
cout << "1. 在大树下露宿\n";
cout << "2. 冒险折返城市边缘找物资\n\n";
op = GetChoice(1, 2);
if (op == 1) return 31;
return 32;
}
ShowStatus();
return 0;
}
// 场景3
int Scene3(int pre)
{
ClearScreen();
day = 3;
cout << "【第3天】\n";
int op;
if (pre == 11 || pre == 12 || pre == 13)
{
cout << "你走到主干道,路边尸体旁似乎有闪光物品。\n";
cout << "1. 上前搜刮物品\n";
cout << "2. 绕道远离尸体\n\n";
op = GetChoice(1, 2);
if (op == 1)
{
weapon = 3;
cout << "你捡到一把手枪!\n";
return 111;
}
return 112;
}
else if (pre == 21)
{
cout << "你躲在车后,遇到一名幸存者,对方也发现了你。\n";
cout << "1. 主动搭话组队\n";
cout << "2. 沉默悄悄溜走\n\n";
op = GetChoice(1, 2);
if (op == 1)
{
hasPartner = true;
cout << "对方愿意和你结伴同行。\n";
return 211;
}
return 212;
}
else if (pre == 22 || pre == 23)
{
cout << "路边传来微弱的求救声。\n";
cout << "1. 前去营救\n";
cout << "2. 假装没听见继续赶路\n\n";
op = GetChoice(1, 2);
if (op == 1) return 231;
return 232;
}
else if (pre == 31)
{
cout << "荒野露宿一夜,饥渴感越来越强烈。\n";
cout << "1. 继续留在荒野\n";
cout << "2. 再次靠近城市探索\n\n";
op = GetChoice(1, 2);
if (op == 1) return 311;
return 312;
}
else if (pre == 32)
{
cout << "折返城市遭遇丧尸追击,你拼死逃脱,体力大减。\n";
hp -= 25;
return 321;
}
ShowStatus();
return 0;
}
// 场景4
int Scene4(int pre)
{
ClearScreen();
day = 4;
cout << "【第4天】\n";
int op;
if (pre == 111 || pre == 112)
{
cout << "你发现一栋封闭居民楼,适合长期驻守。\n";
cout << "1. 破门进入驻扎\n";
cout << "2. 继续寻找大型幸存者基地\n\n";
op = GetChoice(1, 2);
if (op == 1) return 401;
return 402;
}
else if (pre == 211)
{
cout << "你和队友同行,前方出现一间小木屋。\n";
cout << "1. 和队友一起探查木屋\n";
cout << "2. 绕开木屋不冒险\n\n";
op = GetChoice(1, 2);
if (op == 1) return 411;
return 412;
}
else if (pre == 212)
{
cout << "你独自前行,内心充满不安。\n";
cout << "1. 找房屋临时休息\n";
cout << "2. 连夜赶路不停歇\n\n";
op = GetChoice(1, 2);
if (op == 1) return 421;
return 422;
}
else if (pre == 231 || pre == 232 || pre == 321)
{
cout << "地上有别人遗留的物资包。\n";
cout << "1. 捡起物资\n";
cout << "2. 警惕陷阱放弃物资\n\n";
op = GetChoice(1, 2);
if (op == 1)
{
food += 2; water += 2;
return 431;
}
return 432;
}
else if (pre == 311 || pre == 312)
{
cout << "远处看到炊烟,疑似人类营地。\n";
cout << "1. 朝着炊烟前进\n";
cout << "2. 不敢靠近继续独行\n\n";
op = GetChoice(1, 2);
if (op == 1) return 441;
return 442;
}
ShowStatus();
return 0;
}
// 场景5
int Scene5(int pre)
{
ClearScreen();
day = 5;
cout << "【第5天】\n";
int op;
if (pre == 401)
{
cout << "你占领居民楼,物资渐渐不足。\n";
cout << "1. 定期外出搜集物资\n";
cout << "2. 固守楼内消耗现有资源\n\n";
op = GetChoice(1, 2);
if (op == 1) return 501;
return 502;
}
else if (pre == 402)
{
cout << "你找到大型幸存者基地,门口有守卫。\n";
cout << "1. 配合检查进入基地\n";
cout << "2. 不信任基地,在外观望\n\n";
op = GetChoice(1, 2);
if (op == 1) return 511;
return 512;
}
else if (pre == 411 || pre == 412)
{
cout << "队友提议分头搜集物资,效率更高。\n";
cout << "1. 同意分头行动\n";
cout << "2. 拒绝,坚持结伴\n\n";
op = GetChoice(1, 2);
if (op == 1) return 521;
return 522;
}
else if (pre == 421 || pre == 422 || pre == 431 || pre == 432)
{
cout << "丧尸越来越多,活动范围被压缩。\n";
cout << "1. 向城市中心突围\n";
cout << "2. 撤出城市前往山区\n\n";
op = GetChoice(1, 2);
if (op == 1) return 531;
return 532;
}
else if (pre == 441 || pre == 442)
{
cout << "小型幸存者团体邀请你加入。\n";
cout << "1. 加入队伍共同求生\n";
cout << "2. 婉拒继续独行\n\n";
op = GetChoice(1, 2);
if (op == 1)
{
hasPartner = true;
return 541;
}
return 542;
}
ShowStatus();
return 0;
}
// 场景6
int Scene6(int pre)
{
ClearScreen();
day = 6;
cout << "【第6天】\n";
int op;
if (pre == 501 || pre == 502)
{
cout << "独居生活危险又枯燥。\n";
cout << "1. 长期留守此地\n";
cout << "2. 收拾行李寻找同伴\n\n";
op = GetChoice(1, 2);
if (op == 1) return 601;
return 602;
}
else if (pre == 511)
{
cout << "你进入基地,可选择不同工作。\n";
cout << "1. 成为基地守卫\n";
cout << "2. 做普通劳工换物资\n\n";
op = GetChoice(1, 2);
if (op == 1) return 611;
return 612;
}
else if (pre == 512)
{
cout << "在基地外徘徊,夜里遭遇丧尸袭击。\n";
hp -= 35;
cout << "你勉强击退敌人,伤势加重。\n";
return 621;
}
else if (pre == 521 || pre == 522)
{
cout << "队友行为怪异,刻意回避你。\n";
cout << "1. 主动询问心事\n";
cout << "2. 保持距离暗中提防\n\n";
op = GetChoice(1, 2);
if (op == 1) return 631;
else
{
trustPartner = false;
return 632;
}
}
else if (pre == 531 || pre == 532)
{
cout << "前方出现岔路。\n";
cout << "1. 走大路(视野好)\n";
cout << "2. 走林间小路(隐蔽)\n\n";
op = GetChoice(1, 2);
if (op == 1) return 641;
return 642;
}
else if (pre == 541 || pre == 542)
{
cout << "小队物资紧张,内部出现矛盾。\n";
cout << "1. 调和矛盾维持团队\n";
cout << "2. 趁乱拿物资独自离开\n\n";
op = GetChoice(1, 2);
if (op == 1) return 651;
return 652;
}
ShowStatus();
return 0;
}
// 场景7
int Scene7(int pre)
{
ClearScreen();
day = 7;
cout << "【第7天】\n";
cout << "一路奔波,你来到命运的前置节点。\n";
ShowStatus();
return pre;
}
// 场景8 最终抉择
int Scene8(int pre)
{
ClearScreen();
day = 8;
cout << "【最终抉择 - 第8天】\n";
int op;
if (pre >= 601 && pre <= 602)
{
cout << "你长期独居,做出最终选择:\n";
cout << "1. 永久留守建筑\n";
cout << "2. 再次出发寻找希望\n\n";
op = GetChoice(1, 2);
if (op == 1) return 1;
return 2;
}
else if (pre >= 611 && pre <= 612)
{
cout << "基地高层独断专行,你选择:\n";
cout << "1. 顺从规则安稳生活\n";
cout << "2. 联合众人反抗不公\n\n";
op = GetChoice(1, 2);
if (op == 1) return 3;
return 4;
}
else if (pre == 621)
{
cout << "你伤势严重,体力濒临极限:\n";
cout << "1. 找山洞静待结局\n";
cout << "2. 拼尽余力继续求生\n\n";
op = GetChoice(1, 2);
if (op == 1) return 5;
return 6;
}
else if (pre >= 631 && pre <= 632)
{
cout << "你和队友走到分叉路口:\n";
cout << "1. 完全信任,生死与共\n";
cout << "2. 分道扬镳,各自求生\n\n";
op = GetChoice(1, 2);
if (op == 1) return 7;
return 8;
}
else if (pre >= 641 && pre <= 642)
{
cout << "你看到远方一片全新净土:\n";
cout << "1. 前往净土开始新生活\n";
cout << "2. 原地停下不再前行\n\n";
op = GetChoice(1, 2);
if (op == 1) return 9;
return 10;
}
else if (pre >= 651 && pre <= 652)
{
cout << "小型团队人心散尽:\n";
cout << "1. 尝试重新集结众人\n";
cout << "2. 接受现实孤身远行\n\n";
op = GetChoice(1, 2);
if (op == 1) return 11;
return 12;
}
ShowStatus();
return 0;
}
// 12种结局展示
void ShowEnd(int id)
{
ClearScreen();
cout << "==================== 最终结局 ====================\n\n";
switch (id)
{
case 1:
cout << "【结局1:孤岛隐士】\n";
cout << "你永久留守建筑,与世隔绝,在寂静中度过余生。\n";
break;
case 2:
cout << "【结局2:追光行者】\n";
cout << "你再次出发,历经艰险找到和平聚集地,迎来新生。\n";
break;
case 3:
cout << "【结局3:安稳囚徒】\n";
cout << "你顺从基地规则,衣食无忧却失去自由,平淡一生。\n";
break;
case 4:
cout << "【结局4:反抗先驱】\n";
cout << "你带领众人推翻独裁,成为基地所有人敬重的英雄。\n";
break;
case 5:
cout << "【结局5:安然落幕】\n";
cout << "伤势过重,你在山洞中平静离去,旅途就此结束。\n";
break;
case 6:
cout << "【结局6:绝境求生】\n";
cout << "凭最后意志前行,意外被救援队救下,命运眷顾了你。\n";
break;
case 7:
cout << "【结局7:生死之交】\n";
cout << "你与队友彼此信任、并肩同行,走完末日之路。\n";
break;
case 8:
cout << "【结局8:陌路独行】\n";
cout << "你与队友分离,习惯孤独,独自走向远方。\n";
break;
case 9:
cout << "【结局9:新生之地】\n";
cout << "你抵达净土,远离丧尸与争斗,开启全新人生。\n";
break;
case 10:
cout << "【结局10:止步于此】\n";
cout << "你看到希望却选择停留,守着眼前一方天地。\n";
break;
case 11:
cout << "【结局11:凝聚微光】\n";
cout << "你重新收拢人群,小小队伍在黑暗中艰难前行。\n";
break;
case 12:
cout << "【结局12:孑然一身】\n";
cout << "团队解散,你孤身走向未知,依旧坚持走下去。\n";
break;
}
cout<<"DSES原创";
cout << "\n==================================================\n";
}