- BC20270056's blog
地下城(beta)
- 2025-4-14 12:58:58 @
#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;
}