-
个人简介
https://www.cnblogs.com/ggc114514/p/18565009 1 2 //### 结局分类 // //Happy End // //1. 苟到最后:在家等待救援 ++ //2. 神仙眷侣:带妹子,选择一起执行任务 //3. 英雄不朽:留在基地,子弹 > 9 守住基地 ++ //4. 认清自己:带少年,满足条件和少年相爱 //5. 跨越物种的 gay:少年变异后安抚 // //Bad End //1 饿死 | 2 子弹不足被丧尸咬死 | 3 等待救援发疯 //7 被流浪狗咬死 | 8 被妹子偷袭 | 9 大厦笔记本结局 //10 加入其他基地单调度日 | 11 没子弹闯邻居家被咬 //12 被救援队击毙 |13 变异狩猎救援队 |14 营养仓失败 //15 看笔记被少年偷袭 |16 开枪杀少年被首领击杀 //17 杀少年被少年反杀 // //True End // //1. 一如既往:饼干 + 枪融合,丧尸变回人类 //2. 保持本我:被咬变异保留意识 //3. 幻觉:神仙眷侣其实是幻觉 //4. 停服:通关后领取特殊物品进入 //5. 姗姗来迟的死亡:少年死亡后世界崩塌 // //进阶通关:收集全部线索解锁 cg2,选择 1 杀光所有人 → tg3;选团结 → tg2,解锁进阶剧情结局。 //全部 BadEnd 打完解锁
swx=2尸王线。 #include #include #include #include #include#ifdef _WIN32 #include <conio.h> #else #include <unistd.h> #include <termios.h> #include <fcntl.h> #endif using namespace std;
// ===================== 跨平台工具函数 ===================== void clear_screen() { #ifdef _WIN32 system("cls"); #else system("clear"); #endif }
void sleep_ms(int ms) { timespec ts{}; ts.tv_sec = ms / 1000; ts.tv_nsec = (ms % 1000) * 1000000L; nanosleep(&ts, nullptr); }
// 跨平台:检测是否有按键按下(非阻塞) bool key_pressed() { #ifdef _WIN32 return _kbhit() != 0; #else fd_set fds; timeval tv{0,0}; FD_ZERO(&fds); FD_SET(STDIN_FILENO, &fds); return select(STDIN_FILENO+1, &fds, nullptr, nullptr, &tv) > 0; #endif }
// 读取按下的字符,清空缓冲区 void read_key() { #ifdef _WIN32 _getch(); #else struct termios old_t, new_t; tcgetattr(STDIN_FILENO, &old_t); new_t = old_t; new_t.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &new_t); char c; read(STDIN_FILENO, &c, 1); tcsetattr(STDIN_FILENO, TCSANOW, &old_t); #endif }
// ANSI颜色宏 #define COLOR_RESET "\033[0m" #define COLOR_RED "\033[31m" #define COLOR_GREEN "\033[32m" #define COLOR_YELLOW "\033[33m" #define COLOR_BLUE "\033[34m" #define COLOR_MAGENTA "\033[35m" #define COLOR_CYAN "\033[36m"
// ===================== 打字机逐字输出【支持按任意键跳过】 ===================== // text:文本,delay_ms:每个字延时 void type_print(const string& text, int delay_ms = 60) { for (size_t i = 0; i < text.size(); ++i) { if(key_pressed()) { // 有按键,直接打印剩下全部文字,清空输入缓冲 cout << text.substr(i); cout.flush(); read_key(); break; } cout << text[i]; cout.flush(); if(text[i] != '\n') { sleep_ms(delay_ms); } } }
// ===================== 游戏状态结构体 ===================== const int ITEM_MAX = 5; struct GameState { int trust; int favor; int hint; int chapter; bool game_over; int item[ITEM_MAX];
// 构造函数:初始化 GameState() { trust = 0; favor = 0; hint = 0; chapter = 1; game_over = false; memset(item, 0, sizeof(item)); }};
// 存档槽位 const int SAVE_SLOT_NUM = 3; const char* save_files[SAVE_SLOT_NUM] = { "save1.dat", "save2.dat", "save3.dat" };
// 道具名称 const char* itemNames[ITEM_MAX] = { "旧照片", "钥匙", "笔记", "徽章", "破碎吊坠" };
// 存档 bool save_game(const GameState& gs, int slot) { if(slot <0 || slot >= SAVE_SLOT_NUM) return false; FILE* fp = fopen(save_files[slot], "wb"); if (!fp) { cout << COLOR_RED "\n存档失败!无法写入文件\n" COLOR_RESET; return false; } fwrite(&gs, sizeof(GameState), 1, fp); fclose(fp); type_print(COLOR_GREEN "\n? 槽位" + to_string(slot+1) + "存档成功!\n" COLOR_RESET, 30); sleep_ms(1200); return true; }
// 读档 bool load_game(GameState& gs, int slot) { if(slot <0 || slot >= SAVE_SLOT_NUM) return false; FILE* fp = fopen(save_files[slot], "rb"); if (!fp) { type_print(COLOR_RED "\n? 槽位" + to_string(slot+1) + "无存档\n" COLOR_RESET,30); return false; } fread(&gs, sizeof(GameState), 1, fp); fclose(fp); type_print(COLOR_GREEN "\n? 槽位" + to_string(slot+1) + "读档成功!\n" COLOR_RESET,30); sleep_ms(1200); return true; }
// 背包查看 void show_inventory(const GameState& gs) { cout << COLOR_CYAN "\n===== 背包 =====\n" COLOR_RESET; bool empty = true; for(int i=0; i<ITEM_MAX; i++) { if(gs.item[i]==1) { type_print("- " + string(itemNames[i]) + "\n", 40); empty = false; } } if(empty) type_print("(空)\n",40); cout << COLOR_YELLOW "\n按回车继续..." COLOR_RESET; cin.get(); }
// 存档选择菜单 int save_select_menu(const GameState& gs) { clear_screen(); cout << COLOR_CYAN "===== 存档选择 =====" COLOR_RESET << endl; for(int i=0; i<SAVE_SLOT_NUM; i++) { FILE* fp = fopen(save_files[i], "rb"); if(fp) { fclose(fp); cout << i+1 << ". 槽位" << i+1 << "【已有存档】\n"; } else { cout << i+1 << ". 槽位" << i+1 << "【空】\n"; } } cout << "0. 返回\n"; cout << COLOR_YELLOW "请选择槽位:" COLOR_RESET; int sel; cin >> sel; cin.ignore(); return sel; }
// 读档入口 bool load_menu(GameState& gs) { int sel = save_select_menu(gs); if(sel ==0) return false; return load_game(gs, sel-1); } // 存档入口 bool save_menu(const GameState& gs) { int sel = save_select_menu(gs); if(sel ==0) return false; return save_game(gs, sel-1); }
// 主菜单 int main_menu(GameState& gs) { int sel; while(true) { clear_screen(); cout << COLOR_CYAN "===== 文字冒险游戏 =====\n" COLOR_RESET; cout << COLOR_YELLOW "提示:剧情播放时按任意键跳过打字动画\n" COLOR_RESET << endl; cout << "1. 开始新游戏\n"; cout << "2. 读取存档\n"; cout << "3. 退出游戏\n"; cout << COLOR_YELLOW "请输入选择:" COLOR_RESET; cin >> sel; cin.ignore();
if(sel == 1) { gs = GameState(); // 调用构造函数重置 return 1; } else if(sel ==2) { if(load_menu(gs)) return 1; } else if(sel ==3) { type_print(COLOR_MAGENTA "再见~\n" COLOR_RESET,60); return 0; } }}
// 第一章:相遇 void chapter1(GameState& gs) { int opt; clear_screen(); type_print(COLOR_CYAN "【第一章】陌生人站在路口看着你\n\n" COLOR_RESET, 70); cout << "1. 上前搭话\n"; cout << "2. 保持沉默\n"; cout << COLOR_YELLOW "你的选择:" COLOR_RESET; cin >> opt; cin.ignore();
if(opt ==1) { gs.trust +=1; gs.favor +=1; type_print(COLOR_GREEN "你主动开口,对方放松了一点(信任+1,好感+1)\n" COLOR_RESET,60); } else { type_print(COLOR_YELLOW "你选择沉默,气氛变得冷淡\n" COLOR_RESET,60); } sleep_ms(1500); gs.chapter = 2;}
// 第二章:废弃仓库 void chapter2(GameState& gs) { int opt; while(true) { clear_screen(); type_print(COLOR_CYAN "【第二章】废弃仓库\n\n" COLOR_RESET,70); cout << "1. 仔细搜索线索\n"; cout << "2. 快速离开仓库\n"; cout << "8. 查看背包\n"; cout << "9. 保存游戏\n"; cout << COLOR_YELLOW "你的选择:" COLOR_RESET; cin >> opt; cin.ignore();
if(opt == 1) { gs.hint = 1; gs.item[0] = 1; type_print(COLOR_GREEN "你找到了关键线索,获得【旧照片】!\n" COLOR_RESET,60); sleep_ms(1500); gs.chapter = 3; break; } else if(opt ==2) { gs.hint = 0; type_print(COLOR_YELLOW "你匆匆离开,错过了线索\n" COLOR_RESET,60); sleep_ms(1500); gs.chapter = 3; break; } else if(opt ==8) { show_inventory(gs); } else if(opt ==9) { save_menu(gs); } }}
// 第三章:小屋交谈 void chapter3(GameState& gs) { int opt; while(true) { clear_screen(); type_print(COLOR_CYAN "【第三章】小屋交谈\n\n" COLOR_RESET,70); cout << "1. 拿出旧照片和对方聊\n"; cout << "2. 安静倾听\n"; cout << "3. 直接追问秘密\n"; cout << "8. 查看背包\n"; cout << "9. 保存游戏\n"; cout << COLOR_YELLOW "你的选择:" COLOR_RESET; cin >> opt; cin.ignore();
if(opt == 1) { if(gs.item[0]==1) { gs.favor +=2; gs.item[1]=1; type_print(COLOR_GREEN "你拿出旧照片,对方动容,好感+2,获得【钥匙】\n" COLOR_RESET,60); } else { type_print(COLOR_YELLOW "你没有旧照片,这个选项无效\n" COLOR_RESET,60); sleep_ms(1200); continue; } sleep_ms(1500); gs.chapter =4; break; } else if(opt ==2) { gs.favor +=1; type_print(COLOR_GREEN "你安静倾听,好感+1\n" COLOR_RESET,60); sleep_ms(1500); gs.chapter =4; break; } else if(opt ==3) { gs.favor -=1; type_print(COLOR_RED "你不断追问,对方感到不适,好感-1\n" COLOR_RESET,60); sleep_ms(1500); gs.chapter =4; break; } else if(opt ==8) { show_inventory(gs); } else if(opt ==9) { save_menu(gs); } }}
// 第四章:地下室抉择 void chapter4(GameState& gs) { int opt; while(true) { clear_screen(); type_print(COLOR_CYAN "【第四章】地下室抉择\n\n" COLOR_RESET,70); cout << "1. 用钥匙打开暗门\n"; cout << "2. 劝说对方放弃执念\n"; cout << "3. 强行阻止\n"; cout << "8. 查看背包\n"; cout << "9. 保存游戏\n"; cout << COLOR_YELLOW "你的选择:" COLOR_RESET; cin >> opt; cin.ignore();
if(opt == 1) { if(gs.item[1]==1) { gs.trust +=3; type_print(COLOR_GREEN "钥匙转动,暗门缓缓开启,信任+3\n" COLOR_RESET,60); } else { type_print(COLOR_YELLOW "你没有钥匙!无法打开暗门\n" COLOR_RESET,60); sleep_ms(1200); continue; } sleep_ms(1500); gs.game_over = true; break; } else if(opt ==2) { gs.trust +=1; type_print(COLOR_GREEN "你耐心劝说,信任+1\n" COLOR_RESET,60); sleep_ms(1500); gs.game_over = true; break; } else if(opt ==3) { gs.trust -=2; type_print(COLOR_RED "激烈冲突爆发,信任-2\n" COLOR_RESET,60); sleep_ms(1500); gs.game_over = true; break; } else if(opt ==8) { show_inventory(gs); } else if(opt ==9) { save_menu(gs); } }}
// 结局判定 void show_ending(const GameState& gs) { clear_screen(); type_print(COLOR_MAGENTA "===== 故事结局 =====\n" COLOR_RESET,80); sleep_ms(1000);
if(gs.hint ==1 && gs.trust >=4 && gs.favor >=5 && gs.item[0]==1 && gs.item[1]==1) { type_print(COLOR_GREEN "? True End【真结局】\n",70); type_print("你集齐线索并获得信任,所有谜团解开,圆满真相。\n" COLOR_RESET,50); } else if(gs.trust >=4 && gs.favor >=5) { type_print(COLOR_CYAN "? Happy End【好结局】\n",70); type_print("虽然缺少关键道具,但彼此信任,平安离开。\n" COLOR_RESET,50); } else if(gs.trust >=2) { type_print(COLOR_YELLOW "?? Normal End【普通结局】\n",70); type_print("危机暂时平息,但心中仍留有遗憾。\n" COLOR_RESET,50); } else { type_print(COLOR_RED "?? Bad End【坏结局】\n",70); type_print("信任不足,悲剧发生,故事到此结束。\n" COLOR_RESET,50); } cout << "\n按回车退出"; cin.get();}
// 游戏主循环 void game_loop(GameState& gs) { while(!gs.game_over) { switch(gs.chapter) { case 1: chapter1(gs); break; case 2: chapter2(gs); break; case 3: chapter3(gs); break; case 4: chapter4(gs); break; default: gs.game_over = true; break; } } show_ending(gs); }
int main() { GameState state; int run = main_menu(state); if(run) { game_loop(state); } return 0; }
-
通过的题目
-
最近活动
题目标签
- GESP
- 7
- 2026模拟
- 2
- CSP-J
- 1
- 复赛T1
- 1
- 模拟
- 1
- 字符串
- 1
- GESP四级
- 1
- 结构体
- 1
- 排序稳定性
- 1