• 个人简介

    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