#include #include #include #include #include

using namespace std;

// ========= 数据结构定义 ========= struct Item { string name; string effect; // "heal", "mp", "bomb" int value; };

struct Equipment { string name; int atkBonus = 0; int defBonus = 0; };

// ========= 英雄类 ========= class Hero { public: string name = "勇者"; int hp = 100, mp = 50, atk = 10, def = 5; int level = 1, exp = 0, gold = 50; int maxHp = 100, maxMp = 50; vector inventory; Equipment weapon = {"木剑", 2, 0}; Equipment armor = {"布甲", 0, 1};

int getTotalAtk() { return atk + weapon.atkBonus; }
int getTotalDef() { return def + armor.defBonus; }

void showStatus() {
    cout << "\n[" << name << "] HP: " << hp << "/" << maxHp
         << " | MP: " << mp << "/" << maxMp
         << " | ATK: " << getTotalAtk()
         << " | DEF: " << getTotalDef()
         << " | LVL: " << level << " | EXP: " << exp << " | GOLD: " << gold << endl;
}

void levelUp() {
    level++;
    maxHp += 20;
    maxMp += 10;
    atk += 3;
    def += 2;
    hp = maxHp;
    mp = maxMp;
    exp = 0;
    cout << ">> 你升级了!当前等级:" << level << endl;
}

void gainExp(int amount) {
    exp += amount;
    int threshold = 30 + level * 10;
    if (exp >= threshold) {
        levelUp();
    }
}

void addItem(Item item) {
    inventory.push_back(item);
    cout << ">> 获得道具:" << item.name << endl;
}

void useItem(int index) {
    if (index < 0 || index >= inventory.size()) return;
    Item item = inventory[index];
    if (item.effect == "heal") {
        hp = min(maxHp, hp + item.value);
        cout << ">> 使用了" << item.name << ",回复HP:" << item.value << endl;
    } else if (item.effect == "mp") {
        mp = min(maxMp, mp + item.value);
        cout << ">> 使用了" << item.name << ",回复MP:" << item.value << endl;
    } else if (item.effect == "bomb") {
        cout << ">> 使用炸弹造成" << item.value << "点爆炸伤害(敌人减血逻辑未实现)" << endl;
    }
    inventory.erase(inventory.begin() + index);
}

};

// ========= 技能系统 ========= enum SkillType { ATTACK, HEAL };

struct Skill { string name; SkillType type; int cost; int power; string description; };

vector skillList = { {"烈焰斩", ATTACK, 15, 30, "消耗15MP造成高伤害"}, {"治疗术", HEAL, 10, 25, "回复25点HP"}, {"电击", ATTACK, 20, 40, "强力电击,单体伤害"} };

void showSkills() { cout << "可用技能:" << endl; for (int i = 0; i < skillList.size(); ++i) { cout << i + 1 << ". " << skillList[i].name << " - " << skillList[i].description << " (MP: " << skillList[i].cost << ")" << endl; } }

bool useSkill(int id, Hero& h, int& enemyHP) { if (id < 1 || id > skillList.size()) return false; Skill s = skillList[id - 1]; if (h.mp < s.cost) { cout << "MP不足!" << endl; return false; } h.mp -= s.cost; if (s.type == ATTACK) { int dmg = s.power + h.getTotalAtk(); enemyHP -= dmg; cout << ">> 你使用了[" << s.name << "],对敌人造成 " << dmg << " 点伤害!" << endl; } else if (s.type == HEAL) { h.hp = min(h.maxHp, h.hp + s.power); cout << ">> 你使用了[" << s.name << "],回复HP:" << s.power << endl; } return true; }

// ========= 怪物生成 ========= struct Enemy { string name; int hp, atk, def; bool isBoss = false; };

Enemy generateEnemy(int level, bool boss = false) { Enemy e; if (boss) { e.name = "BOSS 黑暗魔王"; e.hp = 150 + level * 10; e.atk = 20 + level * 2; e.def = 10 + level; e.isBoss = true; } else { e.name = "怪物 Lv." + to_string(level); e.hp = 50 + rand() % 20 + level * 5; e.atk = 8 + level * 2; e.def = 3 + level; } return e; }

// ========= 战斗系统 ========= void battle(Hero& h, Enemy e) { cout << ">> 遭遇敌人:" << e.name << " (HP: " << e.hp << ", ATK: " << e.atk << ", DEF: " << e.def << ")" << endl;

while (e.hp > 0 && h.hp > 0) {
    h.showStatus();
    cout << "你的行动:\n1. 普通攻击\n2. 使用技能\n3. 使用道具\n选择:";
    int choice;
    cin >> choice;

    if (choice == 1) {
        int dmg = h.getTotalAtk() - e.def + rand() % 5;
        dmg = max(1, dmg);
        e.hp -= dmg;
        cout << ">> 你攻击造成了 " << dmg << " 点伤害!" << endl;
    } else if (choice == 2) {
        showSkills();
        cout << "选择技能:";
        int sid;
        cin >> sid;
        useSkill(sid, h, e.hp);
    } else if (choice == 3) {
        if (h.inventory.empty()) {
            cout << ">> 没有道具可用。" << endl;
        } else {
            for (int i = 0; i < h.inventory.size(); ++i)
                cout << i + 1 << ". " << h.inventory[i].name << " ";
            cout << "\n选择道具编号:";
            int iid;
            cin >> iid;
            h.useItem(iid - 1);
        }
    }

    if (e.hp > 0) {
        int enemyDmg = e.atk - h.getTotalDef() + rand() % 5;
        enemyDmg = max(1, enemyDmg);
        h.hp -= enemyDmg;
        cout << ">> 敌人攻击你造成了 " << enemyDmg << " 点伤害!" << endl;
    }
}

if (h.hp <= 0) {
    cout << "你战败了……游戏结束。" << endl;
    exit(0);
} else {
    cout << ">> 击败敌人!获得经验与金币。" << endl;
    h.gainExp(20 + rand() % 15);
    h.gold += 10 + rand() % 10;
}

}

// ========= 随机事件 ========= void randomEvent(Hero& h) { int roll = rand() % 3; if (roll == 0) { Item potion = {"治疗药水", "heal", 30}; h.addItem(potion); } else if (roll == 1) { Item mpPotion = {"魔法水晶", "mp", 20}; h.addItem(mpPotion); } else { int trap = rand() % 15 + 5; h.hp -= trap; cout << "你踩到了陷阱,受到 " << trap << " 点伤害!" << endl; } }

// ========= 主程序 ========= int main() { srand(time(0)); Hero hero; cout << "请输入你的名字:"; getline(cin, hero.name);

for (int floor = 1; floor <= 10; floor++) {
    cout << "\n========= 地下城第 " << floor << " 层 =========" << endl;

    if (floor == 5 || floor == 10) {
        Enemy boss = generateEnemy(hero.level + 2, true);
        battle(hero, boss);
    } else {
        int eventType = rand() % 2;
        if (eventType == 0) {
            Enemy m = generateEnemy(hero.level);
            battle(hero, m);
        } else {
            randomEvent(hero);
        }
    }
}

cout << "\n恭喜你通关地下城!你是终极勇者!" << endl;
return 0;

}