#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <windows.h>
using namespace std;

void clear() {
    system("cls");
}

void wait() {
    cout << "\n按回车继续...";
    cin.get();
    cin.get();
}

void slow(string text, int ms = 18) {
    for (int i = 0; i < text.length(); i++) {
        cout << text[i];
        Sleep(ms);
    }
}

void scare() {
    vector<string> sc;
    sc.push_back("\n【⚠️ 一阵寒意从背后爬上脊椎……】\n");
    sc.push_back("\n【⚠️ 你听见很轻的呼吸声,就在你身后】\n");
    sc.push_back("\n【⚠️ 灯光忽然暗了一瞬,像有东西从旁边走过】\n");
    sc.push_back("\n【⚠️ 远处传来关门声,可这里只有你】\n");
    sc.push_back("\n【⚠️ 你感觉有人在看你,可你不敢回头】\n");
    slow(sc[rand() % sc.size()]);
}

// ========== 带障碍 + 操作的追逐战 ==========
void chaseGame(string monster, int level) {
    int speed = 800 - level * 150;
    int hp = 3;

    clear();
    slow("\n\n\t\t⚠️  " + monster + " 发现你了!\n");
    slow("\n\t\t快速按 1/2/3 躲避障碍!\n");
    Sleep(1500);

    vector<string> obs;
    obs.push_back("桌子挡路!按 1 躲开");
    obs.push_back("铁门关上!按 2 翻越");
    obs.push_back("地面裂缝!按 3 跳过");

    for (int i = 0; i < 5; ++i) {
        clear();
        slow("\n\n=====================================\n");
        slow("\t\t" + monster + " 正在追来!\n");
        slow("=====================================\n");

        string o = obs[rand() % obs.size()];
        slow("\n\t\t障碍:");
        slow(o);
        slow("\n\n\t\t输入 1/2/3:");

        int c;
        cin >> c;

        int ans = rand() % 3 + 1;
        if (c != ans) {
            hp--;
            slow("\n\t\t❌ 躲错了!剩余生命:");
            char buf[10];
            itoa(hp, buf, 10);
            slow(buf);
            Sleep(800);
        } else {
            slow("\n\t\t✅ 躲开了!");
            Sleep(400);
        }

        if (hp <= 0) {
            clear();
            slow("\n\n\t\t💀 你被抓住了……游戏结束。\n");
            wait();
            exit(0);
        }
    }

    clear();
    slow("\n\n\t\t✅ 你逃进了安全区域!\n");
    Sleep(1500);
}

void section(string title) {
    clear();
    slow("=======================================================\n", 20);
    slow("         " + title + "\n", 25);
    slow("=======================================================\n", 20);
    wait();
}

// ====================== 关卡1 ======================
bool level1() {
    section("第1关:704宿舍");

    slow("凌晨十二点,宿舍安静得能听见心跳。\n");
    slow("你是新来的住户,而上一任女孩,凭空消失了。\n");
    slow("门突然反锁,月光染成暗红。\n");
    slow("桌上,留着她的笔记。\n\n");
    wait();

    slow("【704宿舍生存规则】\n");
    slow("1. 夜里十点后,绝对不要照镜子。\n");
    slow("2. 只能睡下铺,上铺保持空床。\n");
    slow("3. 门外有人哼歌,不要回应,不要靠近。\n");
    slow("4. 衣柜出现白裙,不要触碰。\n");
    slow("5. 凌晨00:30必须给窗台多肉浇冷水。\n");
    slow("6. 挂钟停在12点,立刻撕掉钟面。\n");
    slow("7. 白裙是钥匙,必须拿起。\n");
    slow("8. 上铺有脚步声,千万不要抬头。\n");
    slow("9. 规则1是假的,必须照镜子。\n");
    slow("10. 不要打开书桌最下面的抽屉。\n");
    wait();

    section("探索:书桌");
    slow("你打开抽屉,发现一张病历。\n");
    slow("患者林晓,害怕倒影,频繁失眠。\n");
    slow("诊断:长期照镜,意识被倒影同化。\n");
    wait();

    section("探索:衣柜");
    slow("衣柜里,真的挂着一条白裙。\n");
    slow("口袋里一张纸条:\n");
    slow("「字迹癫狂的,全是假规则。」\n");
    wait();

    section("探索:窗台");
    slow("日历上,每一天都圈着00:30。\n");
    slow("一行小字:水是唯一的屏障,不浇必死。\n");
    wait();

    scare();
    chaseGame("白裙鬼影", 1);

    section("最终判断");
    int a, b, c;
    bool ok = true;

    cout << "1. 假规则序号:"; cin >> a;
    if (a != 7 && a != 9 && a != 10) ok = false;

    cout << "2. 必须做:1=浇多肉 2=照镜子:"; cin >> b;
    if (b != 1) ok = false;

    cout << "3. 林晓消失原因:1=信假规则 2=没关门:"; cin >> c;
    if (c != 1) ok = false;

    if (!ok) {
        section("你违反规则,被倒影带走……");
        return false;
    }

    section("你活过了第一夜。");
    return true;
}

// ====================== 关卡2 ======================
bool level2() {
    section("第2关:午夜图书馆");

    slow("天色微亮,宿舍门终于打开。\n");
    slow("校园空无一人,只有图书馆还亮着灯。\n");
    slow("那是唯一能离开的路。\n\n");
    wait();

    slow("【图书馆规则】\n");
    slow("1. 23点后只能走东侧楼梯。\n");
    slow("2. 不要触碰红色封面的书。\n");
    slow("3. 管理员问话,不要回答。\n");
    slow("4. 看到漂浮的书,立刻蹲下闭眼。\n");
    slow("5. 绝对不要去四楼。\n");
    slow("6. 四楼藏着离开的钥匙。\n");
    wait();

    section("探索:书架");
    slow("书堆里夹着一张纸条:\n");
    slow("「规则5是陷阱,四楼才是生路。」\n");
    wait();

    section("探索:服务台");
    slow("管理员趴在桌上,头发遮脸。\n");
    slow("它没有动,却让你浑身发冷。\n");
    wait();

    section("探索:楼梯");
    slow("墙上全是划痕:\n");
    slow("「它们不想让我们上去。」\n");
    wait();

    scare();
    chaseGame("红书幽灵", 2);

    section("判断");
    int a,b; bool ok=true;
    cout << "1. 假规则:"; cin >>a; if(a!=5) ok=false;
    cout << "2. 必须去:1=四楼 2=地下室:"; cin>>b; if(b!=1) ok=false;

    if (!ok) {
        section("你被永远困在书架中。");
        return false;
    }

    section("你拿到了钥匙。");
    return true;
}

// ====================== 关卡3 ======================
bool level3() {
    section("第3关:末班电梯");

    slow("图书馆后门,只有一部老旧电梯。\n");
    slow("灯光闪烁,电流滋滋作响。\n");
    slow("这是通往地面的唯一希望。\n\n");
    wait();

    slow("【电梯规则】\n");
    slow("1. 显示666时,绝对不要进入。\n");
    slow("2. 独自不要按18层。\n");
    slow("3. 电梯里不要回头。\n");
    slow("4. 遇到红衣女,递出手机。\n");
    slow("5. 遇到任何人,都不要说话。\n");
    slow("6. 故障按紧急铃。\n");
    wait();

    section("探索:电梯口");
    slow("维修单写着:\n");
    slow("「紧急铃连接地下,会唤醒异常存在。」\n");
    wait();

    section("探索:电梯内");
    slow("镜子布满裂痕,角落有发黑痕迹。\n");
    slow("有人刻字:不要说话,不要回头,不要信它。\n");
    wait();

    scare();
    chaseGame("红衣女鬼", 3);

    section("判断");
    int a,b; bool ok=true;
    cout << "1. 假规则:"; cin>>a; if(a!=4&&a!=6) ok=false;
    cout << "2. 遇到红衣女:1=沉默 2=递手机:"; cin>>b; if(b!=1) ok=false;

    if (!ok) {
        section("电梯坠入无尽黑暗。");
        return false;
    }

    section("电梯抵达地面。");
    return true;
}

// ====================== 关卡4 ======================
bool level4() {
    section("最终关:学校后山");

    slow("所有大门紧闭,唯一出路:后山。\n");
    slow("凌晨两点,黑雾笼罩树林。\n");
    slow("进去的人,从未回来。\n\n");
    wait();

    slow("【后山规则】\n");
    slow("1. 凌晨两点后不要进树林。\n");
    slow("2. 看到石碑必须鞠躬。\n");
    slow("3. 不要捡地上的红绳。\n");
    slow("4. 有人喊名字,不要回头。\n");
    slow("5. 回头才能看见出口。\n");
    slow("6. 红绳是唯一护身符。\n");
    wait();

    section("探索:墓碑");
    slow("破旧墓碑刻着:\n");
    slow("不回头者,永困迷途。\n");
    wait();

    section("探索:布条");
    slow("布条写着:\n");
    slow("红绳驱邪,石碑是诅咒。出口在东方。\n");
    wait();

    section("探索:地面");
    slow("你看见一根红绳。\n");
    slow("你知道,必须捡起它。\n");
    wait();

    scare();
    chaseGame("无面黑影", 4);

    section("终极判断");
    int a,b,c; bool ok=true;
    cout << "1. 假规则:"; cin>>a; if(a!=1&&a!=2&&a!=3&&a!=4) ok=false;
    cout << "2. 必须:1=捡红绳+回头 2=不捡不回头:"; cin>>b; if(b!=1) ok=false;
    cout << "3. 出口:1=石碑后 2=树林东:"; cin>>c; if(c!=2) ok=false;

    if (!ok) {
        section("你成为了后山的一部分。");
        return false;
    }

    section("恭喜你,你活下来了!");
    slow("阳光穿透黑雾,你终于逃离了诅咒。\n");
    return true;
}

// ====================== 主程序 ======================
int main() {
    srand(time(0));
    clear();

    section("规则怪谈 · 四夜惊魂");
    slow("              操作追逐战完整版\n");
    wait();

    if (!level1()) return 0;
    if (!level2()) return 0;
    if (!level3()) return 0;
    level4();

    section("游戏结束");
    slow("            谢谢你玩到最后。\n");
    wait();
    return 0;
}