diff --git a/Aincrad.cpp b/Aincrad.cpp new file mode 100644 index 0000000..dc694e3 --- /dev/null +++ b/Aincrad.cpp @@ -0,0 +1,262 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; + +class Character { +public: + string name; + int health; + int maxHealth; + int attack; + int defense; + + Character(string n, int h, int a, int d) : name(n), health(h), maxHealth(h), attack(a), defense(d) {} + + bool isAlive() { + return health > 0; + } +}; + +class Player : public Character { +public: + int potions; + vector weapons; + string currentWeapon; + int experience; + int level; + int maxExperience; + bool hasKingTreasure; + bool hasThornShield; + int baseAttack; + int weaponAttack; + + Player(string n) : Character(n, 100, 5, 10), potions(0), currentWeapon("短剑"), experience(0), level(1), maxExperience(100), hasKingTreasure(false), hasThornShield(false), baseAttack(5), weaponAttack(0) { + weapons.push_back("短剑"); + changeWeapon("短剑"); + } + + void changeWeapon(string weapon) { + if (find(weapons.begin(), weapons.end(), weapon) != weapons.end()) { + currentWeapon = weapon; + if (weapon == "短剑") { + weaponAttack = 20; + } + else if (weapon == "村好剑") { + weaponAttack = 40; + } + else if (weapon == "惠惠的爆裂魔法") { + weaponAttack = 80; + } + updateAttack(); + } + } + + void updateAttack() { + attack = baseAttack + weaponAttack; + } + + void gainExperience(int exp) { + experience += exp; + if (experience >= maxExperience) { + experience -= maxExperience; + levelUp(); + } + } + + void levelUp() { + level++; + maxExperience += 100; + baseAttack++; + health = maxHealth; + defense += 1; + updateAttack(); + cout << name << " 升级了!现在是等级 " << level << ",生命值完全恢复。" << endl; + } +}; + +class Enemy : public Character { +public: + Enemy(string n, int h, int a, int d) : Character(n, h, a, d) {} +}; + +void displayStatus(Character& character) { + cout << character.name << " - 生命值: " << character.health << "/" << character.maxHealth << ", 攻击力: " << character.attack << ", 防御力: " << character.defense << endl; +} + +void attack(Character& attacker, Character& defender) { + int damage = attacker.attack - defender.defense; + if (damage < 0) damage = 0; + defender.health -= damage; + cout << attacker.name << " 攻击 " << defender.name << " 造成 " << damage << " 点伤害!" << endl; + + if (defender.isAlive() && defender.name == "玩家" && ((Player&)defender).hasThornShield) { + attacker.health -= 10; + cout << attacker.name << " 因为荆棘护盾受到 10 点反伤!" << endl; + } +} + +void usePotion(Player& player) { + if (player.potions > 0) { + player.health += 50; + if (player.health > player.maxHealth) player.health = player.maxHealth; + player.potions--; + cout << player.name << " 使用了药丸,恢复了50点生命值!" << endl; + } + else { + cout << "你没有药丸了!" << endl; + } +} + +void battle(Player& player, Enemy& enemy, int& enemyCount, int floor) { + bool usedCurryStick = false; + while (player.isAlive() && enemy.isAlive()) { + displayStatus(player); + displayStatus(enemy); + + cout << "选择你的行动: (1) 攻击 (2) 使用药丸: "; + int choice; + cin >> choice; + + if (choice == 1) { + if (player.weapons.size() > 2 && player.weapons[2] == "咖喱棒" && !usedCurryStick) { + cout << "你有咖喱棒,是否使用?(1) 是 (2) 否: "; + int useCurry; + cin >> useCurry; + if (useCurry == 1) { + enemy.health = 0; + cout << player.name << " 使用咖喱棒秒杀了 " << enemy.name << "!" << endl; + usedCurryStick = true; + } + else { + attack(player, enemy); + if (enemy.isAlive()) { + attack(enemy, player); + } + } + } + else { + attack(player, enemy); + if (enemy.isAlive()) { + attack(enemy, player); + } + } + } + else if (choice == 2) { + usePotion(player); + } + + if (!player.isAlive()) { + cout << player.name << " 被击败了!" << endl; + } + else if (!enemy.isAlive()) { + cout << enemy.name << " 被击败了!" << endl; + enemyCount++; + + int experienceGained = (enemy.name == "大树守卫" || enemy.name == "金闪闪" || enemy.name == "宿傩") ? 200 : + (enemy.name == "精英怪物") ? 80 : 40; + player.gainExperience(experienceGained); + + if (rand() % 100 < 75) { + player.potions++; + cout << "你获得了一颗药丸!" << endl; + } + + if (enemyCount == 5 && find(player.weapons.begin(), player.weapons.end(), "村好剑") == player.weapons.end()) { + player.weapons.push_back("村好剑"); + cout << "你获得了村好剑!" << endl; + } + + if (enemyCount % 10 == 0 && find(player.weapons.begin(), player.weapons.end(), "咖喱棒") == player.weapons.end()) { + player.weapons.push_back("咖喱棒"); + cout << "你获得了咖喱棒!" << endl; + } + + if (rand() % 20 == 0 && find(player.weapons.begin(), player.weapons.end(), "惠惠的爆裂魔法") == player.weapons.end()) { + player.weapons.push_back("惠惠的爆裂魔法"); + cout << "你获得了惠惠的爆裂魔法!" << endl; + } + + if (enemy.name == "大树守卫") { + player.hasThornShield = true; + player.defense += 20; + cout << "你击败了大树守卫,获得了荆棘护盾,防御力加20,敌人攻击时受到10点反伤!" << endl; + } + + if (enemy.name == "金闪闪") { + player.hasKingTreasure = true; + cout << "你击败了金闪闪,获得了技能——王的宝库!" << endl; + } + + cout << "你现在有 " << player.potions << " 颗药丸。" << endl; + } + } +} + +int main() { + srand(time(0)); + string playerName; + cout << "请输入你的角色名字: "; + cin >> playerName; + Player player(playerName); + + cout << "欢迎, " << player.name << "!" << endl; + + int enemyCount = 0; + int floor = 1; + while (player.isAlive() && floor <= 100) { + Enemy enemy("哥布林", 50 + floor, 15 + floor / 2, 5 + floor / 2); + if (floor % 10 == 0 && floor != 20 && floor != 50 && floor != 100) { + enemy = Enemy("精英怪物", 100 + floor * 2, 20 + floor / 2, 15 + floor / 2); + } + if (floor == 20) { + enemy = Enemy("大树守卫", 300, 30, 20); + } + if (floor == 50) { + enemy = Enemy("金闪闪", 500, 50, 30); + } + if (floor == 100) { + enemy = Enemy("宿傩", 1000, 70, 50); + } + + cout << "第 " << floor << " 层,你遇到了一只 " << enemy.name << "!" << endl; + battle(player, enemy, enemyCount, floor); + + if (player.isAlive()) { + cout << "是否更换武器?(1) 是 (2) 否: "; + int changeWeapon; + cin >> changeWeapon; + if (changeWeapon == 1) { + cout << "你拥有的武器有: "; + for (size_t i = 0; i < player.weapons.size(); ++i) { + cout << "(" << i + 1 << ") " << player.weapons[i] << " "; + } + cout << endl; + int weaponChoice; + cin >> weaponChoice; + if (weaponChoice > 0 && weaponChoice <= player.weapons.size()) { + player.changeWeapon(player.weapons[weaponChoice - 1]); + cout << "你现在装备的是 " << player.currentWeapon << "。" << endl; + } + else { + cout << "无效的选择。" << endl; + } + } + + floor++; + } + } + + if (player.isAlive()) { + cout << "恭喜 " << player.name << " 通关了所有楼层!" << endl; + } + else { + cout << player.name << " 在第 " << floor << " 层被击败了。" << endl; + } + + return 0; +} \ No newline at end of file