#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <ctime>

class CatGirl {
private:
    std::string name;
    int happiness;
    int hunger;
    int energy;
    int affection; // 亲密度
    int magic_power; // 魔法力量
    int coding_skill; // 编程技能
    int contest_wins; // 比赛胜利次数
    int algorithm_skill; // 算法能力
    int data_structure_skill; // 数据结构能力
    int system_skill; // 系统编程能力
    int web_skill; // 前端/后端能力

public:
    CatGirl(std::string n) : name(n), happiness(50), hunger(50), energy(50), affection(0), magic_power(0), coding_skill(0), contest_wins(0), 
                            algorithm_skill(0), data_structure_skill(0), system_skill(0), web_skill(0) {}

    void feed() {
        if (hunger > 0) {
            hunger -= 20;
            if (hunger < 0) hunger = 0;
            happiness += 10;
            if (happiness > 100) happiness = 100;
            affection += 2;
            std::cout << name << "开心地吃完了食物!\n";
        } else {
            std::cout << name << "现在不饿哦。\n";
        }
    }

    void play() {
        if (energy >= 20) {
            energy -= 20;
            happiness += 15;
            if (happiness > 100) happiness = 100;
            hunger += 10;
            if (hunger > 100) hunger = 100;
            affection += 5;
            std::cout << "你和" << name << "愉快地玩耍了一番!\n";
        } else {
            std::cout << name << "太累了,需要休息一下。\n";
        }
    }

    void rest() {
        energy += 30;
        if (energy > 100) energy = 100;
        hunger += 5;
        if (hunger > 100) hunger = 100;
        std::cout << name << "舒服地伸了个懒腰,恢复了一些精力。\n";
    }

    void code() {
        if (coding_skill < 100) {
            coding_skill += 10;
            if (coding_skill > 100) coding_skill = 100;
            happiness += 5;
            if (happiness > 100) happiness = 100;
            affection += 3;
            std::cout << name << "努力地学习编程!\n";
        } else {
            std::cout << name << "的编程技能已经达到了顶峰!\n";
        }
    }

    void contest(int contest_type) {
        switch(contest_type) {
            case 1: // 算法竞赛
                if (algorithm_skill >= 30) {
                    int win_chance = rand() % 100;
                    if (win_chance < algorithm_skill) {
                        contest_wins++;
                        happiness += 20;
                        algorithm_skill += 5;
                        std::cout << name << "在算法竞赛中大获全胜!\n";
                    } else {
                        happiness -= 10;
                        std::cout << name << "在算法竞赛中遭遇挫折,心情低落。\n";
                    }
                } else {
                    std::cout << name << "的算法技能不足,无法参加算法竞赛。\n";
                }
                break;
                
            case 2: // 数据结构竞赛
                if (data_structure_skill >= 30) {
                    int win_chance = rand() % 100;
                    if (win_chance < data_structure_skill) {
                        contest_wins++;
                        happiness += 20;
                        data_structure_skill += 5;
                        std::cout << name << "在数据结构竞赛中大获全胜!\n";
                    } else {
                        happiness -= 10;
                        std::cout << name << "在数据结构竞赛中遭遇挫折,心情低落。\n";
                    }
                } else {
                    std::cout << name << "的数据结构技能不足,无法参加数据结构竞赛。\n";
                }
                break;
                
            case 3: // 系统编程竞赛
                if (system_skill >= 30) {
                    int win_chance = rand() % 100;
                    if (win_chance < system_skill) {
                        contest_wins++;
                        happiness += 20;
                        system_skill += 5;
                        std::cout << name << "在系统编程竞赛中大获全胜!\n";
                    } else {
                        happiness -= 10;
                        std::cout << name << "在系统编程竞赛中遭遇挫折,心情低落。\n";
                    }
                } else {
                    std::cout << name << "的系统编程技能不足,无法参加系统编程竞赛。\n";
                }
                break;
                
            case 4: // 网络开发竞赛
                if (web_skill >= 30) {
                    int win_chance = rand() % 100;
                    if (win_chance < web_skill) {
                        contest_wins++;
                        happiness += 20;
                        web_skill += 5;
                        std::cout << name << "在网络开发竞赛中大获全胜!\n";
                    } else {
                        happiness -= 10;
                        std::cout << name << "在网络开发竞赛中遭遇挫折,心情低落。\n";
                    }
                } else {
                    std::cout << name << "的网络开发技能不足,无法参加网络开发竞赛。\n";
                }
                break;
                
            default:
                std::cout << "无效的比赛类型。\n";
                break;
        }
    }

    void study_algorithm() {
        if (algorithm_skill < 100) {
            algorithm_skill += 15;
            if (algorithm_skill > 100) algorithm_skill = 100;
            coding_skill += 5;
            if (coding_skill > 100) coding_skill = 100;
            happiness += 5;
            if (happiness > 100) happiness = 100;
            affection += 2;
            std::cout << name << "深入学习了算法知识!\n";
        } else {
            std::cout << name << "的算法能力已经达到了顶峰!\n";
        }
    }

    void study_data_structure() {
        if (data_structure_skill < 100) {
            data_structure_skill += 15;
            if (data_structure_skill > 100) data_structure_skill = 100;
            coding_skill += 5;
            if (coding_skill > 100) coding_skill = 100;
            happiness += 5;
            if (happiness > 100) happiness = 100;
            affection += 2;
            std::cout << name << "掌握了新的数据结构!\n";
        } else {
            std::cout << name << "的数据结构能力已经达到了顶峰!\n";
        }
    }

    void study_system() {
        if (system_skill < 100) {
            system_skill += 15;
            if (system_skill > 100) system_skill = 100;
            coding_skill += 5;
            if (coding_skill > 100) coding_skill = 100;
            happiness += 5;
            if (happiness > 100) happiness = 100;
            affection += 2;
            std::cout << name << "学习了系统编程知识!\n";
        } else {
            std::cout << name << "的系统编程能力已经达到了顶峰!\n";
        }
    }

    void study_web() {
        if (web_skill < 100) {
            web_skill += 15;
            if (web_skill > 100) web_skill = 100;
            coding_skill += 5;
            if (coding_skill > 100) coding_skill = 100;
            happiness += 5;
            if (happiness > 100) happiness = 100;
            affection += 2;
            std::cout << name << "掌握了前端/后端开发!\n";
        } else {
            std::cout << name << "的前端/后端能力已经达到了顶峰!\n";
        }
    }

    std::string get_mood_level(int value) {
        if (value >= 90) return "极乐";
        else if (value >= 80) return "愉悦";
        else if (value >= 70) return "开心";
        else if (value >= 60) return "平静";
        else if (value >= 50) return "一般";
        else if (value >= 40) return "低落";
        else if (value >= 30) return "沮丧";
        else if (value >= 20) return "悲伤";
        else if (value >= 10) return "痛苦";
        else return "绝望";
    }

    std::string get_hunger_level(int value) {
        if (value >= 90) return "极饿";
        else if (value >= 80) return "很饿";
        else if (value >= 70) return "饥饿";
        else if (value >= 60) return "微饿";
        else if (value >= 50) return "正常";
        else if (value >= 40) return "饱腹";
        else if (value >= 30) return "很饱";
        else if (value >= 20) return "极饱";
        else if (value >= 10) return "撑胀";
        else return "爆裂";
    }

    std::string get_energy_level(int value) {
        if (value >= 90) return "精力充沛";
        else if (value >= 80) return "活力四射";
        else if (value >= 70) return "精神饱满";
        else if (value >= 60) return "略有疲惫";
        else if (value >= 50) return "一般";
        else if (value >= 40) return "疲倦";
        else if (value >= 30) return "很累";
        else if (value >= 20) return "精疲力尽";
        else if (value >= 10) return "奄奄一息";
        else return "昏厥";
    }

    std::string get_affection_level(int value) {
        if (value >= 90) return "深爱";
        else if (value >= 80) return "挚爱";
        else if (value >= 70) return "喜爱";
        else if (value >= 60) return "亲近";
        else if (value >= 50) return "友好";
        else if (value >= 40) return "陌生";
        else if (value >= 30) return "疏远";
        else if (value >= 20) return "厌恶";
        else if (value >= 10) return "仇视";
        else return "恨之入骨";
    }

    std::string get_magic_level(int value) {
        if (value >= 90) return "神级";
        else if (value >= 80) return "宗师";
        else if (value >= 70) return "大师";
        else if (value >= 60) return "expert";
        else if (value >= 50) return "熟练";
        else if (value >= 40) return "入门";
        else if (value >= 30) return "初学";
        else if (value >= 20) return "萌新";
        else if (value >= 10) return "废柴";
        else return "无魔力";
    }

    std::string get_level(int value) {
        if (value >= 90) return "S级";
        else if (value >= 80) return "A级";
        else if (value >= 70) return "B级";
        else if (value >= 60) return "C级";
        else if (value >= 50) return "D级";
        else if (value >= 40) return "E级";
        else if (value >= 30) return "F级";
        else if (value >= 20) return "G级";
        else if (value >= 10) return "H级";
        else return "I级";
    }

    void status() {
        std::cout << "\n=== " << name << " 的状态 ===\n";
        std::cout << " 心情: " << get_mood_level(happiness) << "\n";
        std::cout << " 饥饿: " << get_hunger_level(hunger) << "\n";
        std::cout << " 精力: " << get_energy_level(energy) << "\n";
        std::cout << " 亲密度: " << get_affection_level(affection) << "\n";
        std::cout << " 魔力: " << get_magic_level(magic_power) << "\n";
        std::cout << " 编程技能: " << get_level(coding_skill) << "\n";
        std::cout << " 比赛胜利: " << contest_wins << " 场\n";
        std::cout << " 算法能力: " << get_level(algorithm_skill) << "\n";
        std::cout << " 数据结构: " << get_level(data_structure_skill) << "\n";
        std::cout << " 系统编程: " << get_level(system_skill) << "\n";
        std::cout << " 网络开发: " << get_level(web_skill) << "\n";
        std::cout << "==================\n\n";
    }

    void event() {
        int event_type = rand() % 8;
        switch(event_type) {
            case 0:
                std::cout << name << "在角落里发现了一个小玩具。\n";
                happiness += 5;
                break;
            case 1:
                std::cout << name << "偷偷打翻了花瓶。\n";
                happiness -= 5;
                break;
            case 2:
                std::cout << name << "懒洋洋地晒着太阳。\n";
                energy += 5;
                break;
            case 3:
                std::cout << name << "突然学会了新的魔法技能!\n";
                magic_power += 15;
                break;
            case 4:
                std::cout << name << "害羞地蹭了蹭你的腿。\n";
                affection += 10;
                happiness += 5;
                break;
            case 5:
                std::cout << name << "在图书馆找到了一本编程书籍!\n";
                coding_skill += 15;
                break;
            case 6:
                std::cout << name << "阅读了算法导论!\n";
                algorithm_skill += 10;
                coding_skill += 5;
                break;
            case 7:
                std::cout << name << "学习了新的数据结构!\n";
                data_structure_skill += 10;
                coding_skill += 5;
                break;
        }
        if (happiness > 100) happiness = 100;
        if (happiness < 0) happiness = 0;
        if (energy > 100) energy = 100;
        if (energy < 0) energy = 0;
        if (affection > 100) affection = 100;
        if (magic_power > 100) magic_power = 100;
        if (coding_skill > 100) coding_skill = 100;
        if (algorithm_skill > 100) algorithm_skill = 100;
        if (data_structure_skill > 100) data_structure_skill = 100;
        if (system_skill > 100) system_skill = 100;
        if (web_skill > 100) web_skill = 100;
    }

    bool is_alive() {
        return happiness > 0 && hunger < 100;
    }

    // 隐藏结局检查
    std::string check_hidden_endings() {
        if (happiness >= 90 && affection >= 90) {
            return "true_love";
        } else if (magic_power >= 80 && affection >= 70) {
            return "magic_girl";
        } else if (happiness <= 10 && hunger >= 90) {
            return "abandoned";
        } else if (affection >= 100) {
            return "devotion";
        } else if (happiness >= 100 && energy >= 100 && hunger <= 10) {
            return "perfect";
        } else if (coding_skill >= 100 && contest_wins >= 5) {
            return "oier";
        } else if (algorithm_skill >= 100 && data_structure_skill >= 100 && system_skill >= 100 && web_skill >= 100) {
            return "master";
        }
        return "none";
    }

    std::string get_name() { return name; }
    int get_happiness() { return happiness; }
    int get_hunger() { return hunger; }
    int get_energy() { return energy; }
    int get_affection() { return affection; }
    int get_magic_power() { return magic_power; }
    int get_coding_skill() { return coding_skill; }
    int get_contest_wins() { return contest_wins; }
    int get_algorithm_skill() { return algorithm_skill; }
    int get_data_structure_skill() { return data_structure_skill; }
    int get_system_skill() { return system_skill; }
    int get_web_skill() { return web_skill; }
};

void show_ending(std::string ending_type, CatGirl& catgirl) {
    std::cout << "\n==========================================\n";
    std::cout << "?? 恭喜解锁隐藏结局! ??\n\n";
    
    if (ending_type == "true_love") {
        std::cout << "?? 真爱结局 ??\n";
        std::cout << catgirl.get_name() << "与你建立了深厚的情感纽带。\n";
        std::cout << "你们成为了最好的伙伴," << catgirl.get_name() << "会永远陪伴在你身边。\n";
        std::cout << "\"谢谢你一直以来的关爱,我会永远记得这份温暖。\" — " << catgirl.get_name() << "\n";
    } else if (ending_type == "magic_girl") {
        std::cout << "? 魔法少女结局 ?\n";
        std::cout << catgirl.get_name() << "觉醒了强大的魔法力量!\n";
        std::cout << "成为了一名守护世界的魔法少女,但依然记得你的恩情。\n";
        std::cout << "\"我将用这份力量保护重要的人!\" — " << catgirl.get_name() << "\n";
    } else if (ending_type == "abandoned") {
        std::cout << "?? 被遗弃结局 ??\n";
        std::cout << "由于长期忽视," << catgirl.get_name() << "伤心地离开了。\n";
        std::cout << "在某个雨夜,你听到窗外传来微弱的喵声,但再也没有见到她。\n";
        std::cout << "\"为什么...要这样对我呢...\" — " << catgirl.get_name() << "\n";
    } else if (ending_type == "devotion") {
        std::cout << "?? 虔诚结局 ??\n";
        std::cout << catgirl.get_name() << "对你产生了绝对的忠诚!\n";
        std::cout << "她成为了你最忠实的伙伴,无论你去哪里都会跟随。\n";
        std::cout << "\"无论何时何地,我都会在你身边守护你。\" — " << catgirl.get_name() << "\n";
    } else if (ending_type == "perfect") {
        std::cout << "?? 完美结局 ??\n";
        std::cout << "你将" << catgirl.get_name() << "照顾得无微不至!\n";
        std::cout << "她健康、快乐、充满活力,你们的关系达到了完美的平衡。\n";
        std::cout << "\"有你在身边,每一天都是幸福的时光。\" — " << catgirl.get_name() << "\n";
    } else if (ending_type == "oier") {
        std::cout << "?? OIer 终结 ??\n";
        std::cout << catgirl.get_name() << "成为了一名顶级的OI选手!\n";
        std::cout << "她赢得了5次全国比赛冠军,成为编程界的传奇!\n";
        std::cout << "\"我会继续努力,为编程世界贡献更多力量!\" — " << catgirl.get_name() << "\n";
    } else if (ending_type == "master") {
        std::cout << "?? 程序大师 终结 ??\n";
        std::cout << catgirl.get_name() << "成为了一名全能的程序大师!\n";
        std::cout << "她精通算法、数据结构、系统编程和前端/后端开发,成为技术界的传奇!\n";
        std::cout << "\"我会继续努力,为技术世界贡献更多力量!\" — " << catgirl.get_name() << "\n";
    }
    
    std::cout << "\n==========================================\n";
}

int main() {
    srand(time(0));
    std::string name;
    std::cout << "欢迎来到猫娘养成游戏(猫娘OIer版本)!\n";
    std::cout << "请输入你的猫娘名字: ";
    std::getline(std::cin, name);

    CatGirl catgirl(name);
    std::cout << "你好!我是" << name << ",喵~\n";

    while (catgirl.is_alive()) {
        std::cout << "\n请选择操作:\n";
        std::cout << "1. 喂食\n";
        std::cout << "2. 玩耍\n";
        std::cout << "3. 休息\n";
        std::cout << "4. 学习编程\n";
        std::cout << "5. 参加比赛\n";
        std::cout << "6. 学习算法\n";
        std::cout << "7. 学习数据结构\n";
        std::cout << "8. 学习系统编程\n";
        std::cout << "9. 学习前端/后端\n";
        std::cout << "10. 查看状态\n";
        std::cout << "11. 退出游戏\n";
        std::cout << "请输入选项 (1-11): ";

        int choice;
        std::cin >> choice;

        switch (choice) {
            case 1:
                catgirl.feed();
                break;
            case 2:
                catgirl.play();
                break;
            case 3:
                catgirl.rest();
                break;
            case 4:
                catgirl.code();
                break;
            case 5:
                std::cout << "\n请选择比赛类型:\n";
                std::cout << "1. 算法竞赛\n";
                std::cout << "2. 数据结构竞赛\n";
                std::cout << "3. 系统编程竞赛\n";
                std::cout << "4. 网络开发竞赛\n";
                std::cout << "请输入选项 (1-4): ";
                int contest_choice;
                std::cin >> contest_choice;
                catgirl.contest(contest_choice);
                break;
            case 6:
                catgirl.study_algorithm();
                break;
            case 7:
                catgirl.study_data_structure();
                break;
            case 8:
                catgirl.study_system();
                break;
            case 9:
                catgirl.study_web();
                break;
            case 10:
                catgirl.status();
                break;
            case 11:
                std::cout << "感谢游玩!再见!\n";
                return 0;
            default:
                std::cout << "无效选项,请重新选择。\n";
                continue;
        }

        catgirl.event();
        
        // 检查隐藏结局
        std::string ending = catgirl.check_hidden_endings();
        if (ending != "none") {
            show_ending(ending, catgirl);
            std::cout << "\n恭喜达成特殊结局!游戏继续...\n";
        }
        
        if (!catgirl.is_alive()) {
            std::cout << "\n" << name << "离你而去了...\n";
            std::cout << "游戏结束!\n";
        }
    }

    return 0;
}