You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

262 lines
8.7 KiB

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <algorithm>
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<string> 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;
}