C++RPG游戏《传说》2.0.0.6更新

作者将部分不合理的地方进行修改,且加入了自动战斗系统和清空背包系统

本游戏版本为2.0.0.6版本,更新新功能,暂时作者没有发现什么bug,把进入”传说之海“后的等级上限改为500,且更换地图后等级上限不变

下次版本更新时间预订为2月23日,下次更新会更新新地图和新装备,以及新功能,请大家敬请期待!

下载链接:https://2010829.lanzoue.com/irfK62nyk01g
密码:8mcg

代码如下:

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <vector>
#include <string>
#include <ctime>
#include <fstream>
#include <algorithm>
#include <sstream>

// 设置控制台颜色和背景
void setConsoleColorAndBackground(int color, int background) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, background | color);
}

// 开始界面
void startMenu() {
    setConsoleColorAndBackground(6, 0); // 金黄色文字,黑色背景
    std::string floatingIsland[] = {
        "          __..--''``---....___   _.._",
        "     __..-'  `-.     ``---...__.-'   `-_",
        "   .'           `.           :        `-.",
        "  :               ``.__.     :          `.",
        "  :           _..---...  `-.;           :",
        "  :       _..-''        `-.:           :",
        "   `._..-'                `:           :",
        "     `-.__.-'``---...__..-'           :",
        "        ``---..__..-'                  :",
        "            ``---..__.-'``---...___..-'"
    };

    for (const auto& line : floatingIsland) {
        std::cout << line << std::endl;
    }

    std::cout << "\t\t传说2.0.0.6" << std::endl; // 修改版本号
    std::cout << "主要制作人:山岚   制作团队:喵星人工作室" << std::endl;
    std::cout << "\t\t按回车进入游戏" << std::endl;
    while (_getch() != 13); // 等待回车键
}

// 加载界面
void loadingScreen() {
    setConsoleColorAndBackground(6, 0); // 金黄色文字,黑色背景
    for (int i = 0; i <= 100; ++i) {
        system("cls");
        std::cout << i << "/100" << std::endl;
        Sleep(50); // 5 秒内从 0 到 100
    }
    system("cls");
}

// 敌人类
class Enemy {
public:
    std::string name;
    int hp;
    int attack;

    Enemy(const std::string& n, int h, int a) : name(n), hp(h), attack(a) {}
};

// 生成随机敌人
Enemy generateRandomEnemy(const std::string& currentMap) {
    std::vector<Enemy> enemies;
    if (currentMap == "虚空领域") {
        enemies = {
            Enemy("虚空令使", 40000, 2500),
            Enemy("虚空凋零", 2800000, 8000),
            Enemy("虚空", 3450000, 50000),
            Enemy("神之使徒", 500000, 24000)
        };
    }
    else if (currentMap == "传说之海") {
        int randNum = rand() % 100;
        if (randNum < 1) {
            enemies.push_back(Enemy("神之海王", 50000000, 50000));
        }
        else if (randNum < 11) {
            enemies.push_back(Enemy("海洋领主", 29800000, 32000));
        }
        else if (randNum < 31) {
            enemies.push_back(Enemy("海怪", 15000000, 28000));
        }
        else if (randNum < 61) {
            enemies.push_back(Enemy("变异海盗王", 10000000, 28000));
        }
        else {
            enemies.push_back(Enemy("海盗王", 5800000, 20000));
        }
    }
    else {
        enemies = {
            Enemy("神之令使", 15000, 2300),
            Enemy("毁灭者", 15000, 12000),
            Enemy("神之雕塑", 32000, 4500),
            Enemy("地狱使徒", 18000, 2300),
            Enemy("地狱魔神", 45000, 9800),
            Enemy("神之地狱亚魔", 230000, 17200)
        };
        int index = rand() % enemies.size();
        if (enemies[index].name == "神之地狱亚魔" && rand() % 100 != 0) { // 1% 的概率遇到神之地狱亚魔
            index = rand() % (enemies.size() - 1); // 重新随机选择其他敌人
        }
        return enemies[index];
    }
    int index = rand() % enemies.size();
    return enemies[index];
}

// 玩家类
class Player {
public:
    int level = 1;
    int hp = 20000; // 当前生命值
    int maxHp = 20000; // 生命值上限
    int attack = 2100; // 当前攻击力
    int magicDamage = 0; // 魔法附加伤害
    int physicalDamage = 0; // 物理附加伤害
    std::string armor; // 当前护甲
    std::string weapon; // 当前武器
    std::vector<std::string> backpack; // 背包
    int healthPotions = 0; // 回血药数量
    int bigHealthPotions = 0; // 大补药数量
    int legendCoins = 0; // 传说币数量
    std::string currentMap = "使命之地"; // 当前地图
    int normalAttackLevel = 1; // 普通攻击等级
    int heavyAttackLevel = 1; // 重击攻击等级
    int ultimateSkillLevel = 1; // 终极技能等级
    int normalAttackCost = 500; // 普通攻击升级费用
    int heavyAttackCost = 500; // 重击攻击升级费用
    int ultimateSkillCost = 500; // 终极技能升级费用
    int defeatedEnemies = 0; // 击败敌人数量
    int maxLevel = 200; // 当前等级上限,默认为200

    // 装备护甲
    void equipArmor(const std::string& armorName) {
        if (!armor.empty()) {
            // 脱掉旧护甲并放回背包
            removeStatsFromArmor(armor);
            backpack.push_back(armor);
        }
        armor = armorName;
        addStatsFromArmor(armorName);
        std::cout << "你装备了 " << armor << std::endl;
        if (hp == maxHp) { // 如果装备护甲前血量已满,则自动回满
            hp = maxHp;
        }
    }

    // 装备武器
    void equipWeapon(const std::string& weaponName) {
        if (!weapon.empty()) {
            // 脱掉旧武器并放回背包
            removeStatsFromWeapon(weapon);
            backpack.push_back(weapon);
        }
        weapon = weaponName;
        addStatsFromWeapon(weaponName);
        std::cout << "你装备了 " << weapon << std::endl;
    }

    // 根据护甲添加属性
    void addStatsFromArmor(const std::string& armorName) {
        if (armorName == "创世铠甲") {
            maxHp += 50000;
            physicalDamage += 1000;
        }
        else if (armorName == "战神圣衣") {
            maxHp += 48000;
            magicDamage += 1000;
        }
        else if (armorName == "青铜法袍") {
            maxHp += 28000;
            magicDamage += 430;
        }
        else if (armorName == "朱红护甲") {
            maxHp += 20000;
            physicalDamage += 250;
        }
        else if (armorName == "灭世战甲") {
            maxHp += 80000;
            physicalDamage += 5000;
            magicDamage += 5000;
        }
        else if (armorName == "虚空魔神铠") {
            maxHp += 100000;
            magicDamage += 10000;
            physicalDamage += 10000;
        }
        else if (armorName == "神圣之护铠") {
            maxHp += 1000000;
            physicalDamage += 25000;
            magicDamage += 25000;
            if (weapon == "神圣之神剑") {
                maxHp += 500000;
                attack += 50000;
                physicalDamage += 25000;
                magicDamage += 25000;
            }
        }
        if (hp > maxHp) {
            hp = maxHp;
        }
    }

    // 移除护甲属性
    void removeStatsFromArmor(const std::string& armorName) {
        if (armorName == "创世铠甲") {
            maxHp -= 50000;
            physicalDamage -= 1000;
        }
        else if (armorName == "战神圣衣") {
            maxHp -= 48000;
            magicDamage -= 1000;
        }
        else if (armorName == "青铜法袍") {
            maxHp -= 28000;
            magicDamage -= 430;
        }
        else if (armorName == "朱红护甲") {
            maxHp -= 20000;
            physicalDamage -= 250;
        }
        else if (armorName == "灭世战甲") {
            maxHp -= 80000;
            physicalDamage -= 5000;
            magicDamage -= 5000;
        }
        else if (armorName == "虚空魔神铠") {
            maxHp -= 100000;
            magicDamage -= 10000;
            physicalDamage -= 10000;
        }
        else if (armorName == "神圣之护铠") {
            maxHp -= 1000000;
            physicalDamage -= 25000;
            magicDamage -= 25000;
            if (weapon == "神圣之神剑") {
                maxHp -= 500000;
                attack -= 50000;
                physicalDamage -= 25000;
                magicDamage -= 25000;
            }
        }
        if (hp > maxHp) {
            hp = maxHp;
        }
    }

    // 根据武器添加属性
    void addStatsFromWeapon(const std::string& weaponName) {
        if (weaponName == "创世神剑") {
            attack += 5000;
        }
        else if (weaponName == "天顶法杖") {
            attack += 4500;
            magicDamage += 1000;
        }
        else if (weaponName == "青铜法器") {
            attack += 2700;
            magicDamage += 500;
        }
        else if (weaponName == "赤红魔剑") {
            attack += 2700;
        }
        else if (weaponName == "灭世神剑") {
            attack += 8000;
            physicalDamage += 5000;
            magicDamage += 5000;
        }
        else if (weaponName == "虚空魔神剑") {
            attack += 20000;
            magicDamage += 20000;
            physicalDamage += 20000;
        }
        else if (weaponName == "神圣之神剑") {
            attack += 50000;
            physicalDamage += 25000;
            magicDamage += 25000;
            if (armor == "神圣之护铠") {
                maxHp += 500000;
                attack += 50000;
                physicalDamage += 25000;
                magicDamage += 25000;
            }
        }
    }

    // 移除武器属性
    void removeStatsFromWeapon(const std::string& weaponName) {
        if (weaponName == "创世神剑") {
            attack -= 5000;
        }
        else if (weaponName == "天顶法杖") {
            attack -= 4500;
            magicDamage -= 1000;
        }
        else if (weaponName == "青铜法器") {
            attack -= 2700;
            magicDamage -= 500;
        }
        else if (weaponName == "赤红魔剑") {
            attack -= 2700;
        }
        else if (weaponName == "灭世神剑") {
            attack -= 8000;
            physicalDamage -= 5000;
            magicDamage -= 5000;
        }
        else if (weaponName == "虚空魔神剑") {
            attack -= 20000;
            magicDamage -= 20000;
            physicalDamage -= 20000;
        }
        else if (weaponName == "神圣之神剑") {
            attack -= 50000;
            physicalDamage -= 25000;
            magicDamage -= 25000;
            if (armor == "神圣之护铠") {
                maxHp -= 500000;
                attack -= 50000;
                physicalDamage -= 25000;
                magicDamage -= 25000;
            }
        }
    }

    // 自动存档
    void autoSave() {
        std::ofstream saveFile("savegame.txt");
        if (saveFile.is_open()) {
            saveFile << level << " " << hp << " " << maxHp << " " << attack << " "
                << physicalDamage << " " << magicDamage << " "
                << armor << " " << weapon << " "
                << legendCoins << " " << healthPotions << " "
                << bigHealthPotions << " " << currentMap << " "
                << normalAttackLevel << " " << heavyAttackLevel << " "
                << ultimateSkillLevel << " " << defeatedEnemies << " " << maxLevel << std::endl;
            for (const auto& item : backpack) {
                saveFile << item << std::endl;
            }
            saveFile.close();
        }
    }

    // 删除存档
    void deleteSave() {
        std::remove("savegame.txt");
        std::cout << "已删除存档" << std::endl;
        Sleep(3000);
        exit(0);
    }

    // 使用回血药
    void useHealthPotion() {
        if (healthPotions > 0) {
            hp += 2000;
            if (hp > maxHp) {
                hp = maxHp;
            }
            healthPotions--;
            std::cout << "你使用了一个回血药,恢复了 2000 生命值。当前生命值: " << hp << "/" << maxHp << std::endl;
        }
        else {
            std::cout << "你没有回血药。" << std::endl;
        }
    }

    // 使用大补药
    void useBigHealthPotion() {
        if (bigHealthPotions > 0) {
            hp = maxHp;
            bigHealthPotions--;
            std::cout << "你使用了一个大补药,恢复了全部生命值。当前生命值: " << hp << "/" << maxHp << std::endl;
        }
        else {
            std::cout << "你没有大补药。" << std::endl;
        }
    }

    // 商店
    void tradeEquipment() {
        std::cout << "1. 贩卖装备 2. 购买装备 3. 购买道具 4. 清空背包" << std::endl;
        int choice;
        std::cin >> choice;

        if (choice == 1) {
            std::cout << "你的背包:" << std::endl;
            for (size_t i = 0; i < backpack.size(); ++i) {
                std::cout << i + 1 << ". " << backpack[i] << std::endl;
            }
            std::cout << "输入要贩卖的装备编号 (0退出): ";
            int sellChoice;
            std::cin >> sellChoice;
            if (sellChoice > 0 && sellChoice <= static_cast<int>(backpack.size())) {
                std::string item = backpack[sellChoice - 1];
                int price = 0;
                if (item == "灭世战甲" || item == "灭世神剑") {
                    price = 15000;
                }
                else if (item == "虚空魔神铠" || item == "虚空魔神剑") {
                    price = 20000;
                }
                else if (item == "神圣之护铠" || item == "神圣之神剑") {
                    price = 50000; // 修改价格为50000
                }
                else {
                    price = 500;
                }
                legendCoins += price;
                backpack.erase(backpack.begin() + sellChoice - 1);
                std::cout << "你卖出了 " << item << ",获得了 " << price << " 传说币。当前传说币: " << legendCoins << std::endl;
            }
        }
        else if (choice == 2) {
            std::vector<std::string> availableItems = { "创世铠甲", "战神圣衣", "青铜法袍", "朱红护甲", "创世神剑", "天顶法杖", "青铜法器", "赤红魔剑" };
            std::cout << "可购买的装备:" << std::endl;
            for (size_t i = 0; i < availableItems.size(); ++i) {
                std::cout << i + 1 << ". " << availableItems[i] << " (1500 传说币)" << std::endl;
            }
            std::cout << "输入要购买的装备编号 (0退出): ";
            int buyChoice;
            std::cin >> buyChoice;
            if (buyChoice > 0 && buyChoice <= static_cast<int>(availableItems.size())) {
                std::string item = availableItems[buyChoice - 1];
                if (legendCoins >= 1500) {
                    legendCoins -= 1500;
                    backpack.push_back(item);
                    std::cout << "你购买了 " << item << ",花费了 1500 传说币。当前传说币: " << legendCoins << std::endl;
                }
                else {
                    std::cout << "传说币不足,无法购买。" << std::endl;
                }
            }
        }
        else if (choice == 3) {
            std::cout << "可购买的道具:" << std::endl;
            std::cout << "1. 回血药 (5传说币)" << std::endl;
            std::cout << "2. 大补药 (10传说币)" << std::endl;
            std::cout << "输入要购买的道具编号 (0退出): ";
            int buyChoice;
            std::cin >> buyChoice;
            if (buyChoice == 1) {
                if (legendCoins >= 5) {
                    legendCoins -= 5;
                    healthPotions += 1;
                    std::cout << "你购买了 1 个回血药,花费了 5 传说币。当前回血药数量: " << healthPotions << std::endl;
                }
                else {
                    std::cout << "传说币不足,无法购买。" << std::endl;
                }
            }
            else if (buyChoice == 2) {
                if (legendCoins >= 10) {
                    legendCoins -= 10;
                    bigHealthPotions += 1;
                    std::cout << "你购买了 1 个大补药,花费了 10 传说币。当前大补药数量: " << bigHealthPotions << std::endl;
                }
                else {
                    std::cout << "传说币不足,无法购买。" << std::endl;
                }
            }
        }
        else if (choice == 4) {
            if (backpack.empty()) {
                std::cout << "背包已为空,无需清空。" << std::endl;
                return;
            }

            int totalCoins = 0;
            for (const auto& item : backpack) {
                int price = 0;
                if (item == "灭世战甲" || item == "灭世神剑") {
                    price = 15000;
                }
                else if (item == "虚空魔神铠" || item == "虚空魔神剑") {
                    price = 20000;
                }
                else if (item == "神圣之护铠" || item == "神圣之神剑") {
                    price = 50000; // 修改价格为50000
                }
                else {
                    price = 500;
                }
                totalCoins += price;
            }

            std::cout << "你清空了背包,获得了 " << totalCoins << " 传说币。" << std::endl;
            legendCoins += totalCoins;
            backpack.clear();
        }
    }

    // 升级技能
    void upgradeSkill() {
        setConsoleColorAndBackground(6, 0); // 金黄色文字,黑色背景
        std::cout << "升级技能:" << std::endl;
        std::cout << "1. 普通攻击 (" << normalAttackLevel << "/20) 升级费用: " << normalAttackCost << " 传说币" << std::endl;
        std::cout << "2. 重击攻击 (" << heavyAttackLevel << "/20) 升级费用: " << heavyAttackCost << " 传说币" << std::endl;
        std::cout << "3. 终极技能 (" << ultimateSkillLevel << "/20) 升级费用: " << ultimateSkillCost << " 传说币" << std::endl;
        std::cout << "4. 返回" << std::endl;
        std::cout << "选择要升级的技能 (输入编号): ";
        int choice;
        std::cin >> choice;

        switch (choice) {
        case 1:
            if (legendCoins >= normalAttackCost && normalAttackLevel < 20) {
                legendCoins -= normalAttackCost;
                normalAttackLevel++;
                normalAttackCost += 50;
                std::cout << "普通攻击升级成功!当前等级: " << normalAttackLevel << std::endl;
            }
            else {
                std::cout << "传说币不足或已达到最大等级!" << std::endl;
            }
            break;
        case 2:
            if (legendCoins >= heavyAttackCost && heavyAttackLevel < 20) {
                legendCoins -= heavyAttackCost;
                heavyAttackLevel++;
                heavyAttackCost += 50;
                std::cout << "重击攻击升级成功!当前等级: " << heavyAttackLevel << std::endl;
            }
            else {
                std::cout << "传说币不足或已达到最大等级!" << std::endl;
            }
            break;
        case 3:
            if (legendCoins >= ultimateSkillCost && ultimateSkillLevel < 20) {
                legendCoins -= ultimateSkillCost;
                ultimateSkillLevel++;
                ultimateSkillCost += 50;
                std::cout << "终极技能升级成功!当前等级: " << ultimateSkillLevel << std::endl;
            }
            else {
                std::cout << "传说币不足或已达到最大等级!" << std::endl;
            }
            break;
        case 4:
            std::cout << "返回游戏主界面。" << std::endl;
            break;
        default:
            std::cout << "无效的选择,请重新输入。" << std::endl;
        }
        Sleep(1500); // 等待 1.5 秒
        system("cls"); // 刷新窗口
    }

    // 提升等级
    void levelUp() {
        defeatedEnemies++;
        if (defeatedEnemies % 2 == 0 && level < maxLevel) {
            level++;
            maxHp += 5000;
            attack += 3000;
            if (hp > maxHp) {
                hp = maxHp;
            }
            std::cout << "你击败了 2 个怪物,提升到了 " << level << " 级!" << std::endl;
        }
    }
};

// 击败敌人后获得装备和传说币
void getEquipmentAndCoins(Player& player, const std::string& enemyName) {
    int num = (enemyName == "虚空" || enemyName == "虚空凋零" || enemyName == "神之使徒") ? 5 : rand() % 5 + 1; // 1~5 个装备
    int potions = (enemyName == "虚空" || enemyName == "虚空凋零" || enemyName == "神之使徒") ? 50 : 10; // 回血药数量
    player.healthPotions += potions;
    player.legendCoins += 10; // 每击败一个怪物获得10个传说币
    std::cout << "你获得了 " << potions << " 个回血药,当前回血药数量: " << player.healthPotions << std::endl;
    std::cout << "你获得了 10 传说币,当前传说币: " << player.legendCoins << std::endl;
    for (int i = 0; i < num; ++i) {
        int randNum = rand() % 10000; // 使用10000作为基数,方便调整爆率
        if (randNum < 100) { // 1% 爆率
            player.backpack.push_back("创世铠甲");
            std::cout << "你获得了创世铠甲!" << std::endl;
        }
        else if (randNum < 200) { // 1% 爆率
            player.backpack.push_back("战神圣衣");
            std::cout << "你获得了战神圣衣!" << std::endl;
        }
        else if (randNum < 700) { // 5% 爆率
            player.backpack.push_back("青铜法袍");
            std::cout << "你获得了青铜法袍!" << std::endl;
        }
        else if (randNum < 1000) { // 3% 爆率
            player.backpack.push_back("朱红护甲");
            std::cout << "你获得了朱红护甲!" << std::endl;
        }
        else if (randNum < 1100) { // 0.1% 爆率
            player.backpack.push_back("灭世战甲");
            std::cout << "你获得了灭世战甲!" << std::endl;
        }

        randNum = rand() % 10000; // 使用10000作为基数,方便调整爆率
        if (randNum < 100) { // 1% 爆率
            player.backpack.push_back("创世神剑");
            std::cout << "你获得了创世神剑!" << std::endl;
        }
        else if (randNum < 200) { // 1% 爆率
            player.backpack.push_back("天顶法杖");
            std::cout << "你获得了天顶法杖!" << std::endl;
        }
        else if (randNum < 700) { // 5% 爆率
            player.backpack.push_back("青铜法器");
            std::cout << "你获得了青铜法器!" << std::endl;
        }
        else if (randNum < 1000) { // 3% 爆率
            player.backpack.push_back("赤红魔剑");
            std::cout << "你获得了赤红魔剑!" << std::endl;
        }
        else if (randNum < 1100) { // 0.1% 爆率
            player.backpack.push_back("灭世神剑");
            std::cout << "你获得了灭世神剑!" << std::endl;
        }
        else if (randNum < 1200) { // 0.1% 爆率
            player.backpack.push_back("虚空魔神剑");
            std::cout << "你获得了虚空魔神剑!" << std::endl;
        }
        else if (randNum < 1300) { // 0.1% 爆率
            player.backpack.push_back("虚空魔神铠");
            std::cout << "你获得了虚空魔神铠!" << std::endl;
        }

        if (player.currentMap == "传说之海" &&
            (enemyName == "海洋领主" || enemyName == "神之海王" || enemyName == "海怪" || enemyName == "变异海盗王")) {
            randNum = rand() % 100;
            if (randNum < 10) { // 10% 爆率
                player.backpack.push_back("神圣之护铠");
                std::cout << "你获得了神圣之护铠!" << std::endl;
            }
            else if (randNum < 20) { // 10% 爆率
                player.backpack.push_back("神圣之神剑");
                std::cout << "你获得了神圣之神剑!" << std::endl;
            }
        }
    }
    player.levelUp();
    player.autoSave(); // 自动存档
}

// 战斗界面
bool battle(Player& player, const std::string& currentMap) {
    setConsoleColorAndBackground(4, 0); // 血红色文字,黑色背景
    system("cls"); // 刷新窗口
    Enemy enemy = generateRandomEnemy(currentMap);
    std::cout << "你遭遇了 " << enemy.name << "!" << std::endl;
    while (player.hp > 0 && enemy.hp > 0) {
        std::cout << "你的生命值: " << player.hp << "/" << player.maxHp << " 敌人生命值: " << enemy.hp << std::endl;
        std::cout << "1. 普通攻击 2. 使用物品 3. 查看装备 4. 逃跑" << std::endl;
        int choice;
        std::cin >> choice;
        switch (choice) {
        case 1: {
            std::cout << "选择攻击方式:" << std::endl;
            std::cout << "1. 普通攻击" << std::endl;
            std::cout << "2. 重击攻击" << std::endl;
            std::cout << "3. 终极技能" << std::endl;
            int attackChoice;
            std::cin >> attackChoice;
            int playerDamage = player.attack + player.magicDamage + player.physicalDamage;
            switch (attackChoice) {
            case 1:
                enemy.hp -= playerDamage * player.normalAttackLevel;
                std::cout << "你对 " << enemy.name << " 造成了 " << playerDamage * player.normalAttackLevel << " 点伤害!" << std::endl;
                break;
            case 2:
                enemy.hp -= playerDamage * player.heavyAttackLevel * 2;
                std::cout << "你对 " << enemy.name << " 造成了 " << playerDamage * player.heavyAttackLevel * 2 << " 点伤害!" << std::endl;
                break;
            case 3:
                enemy.hp -= playerDamage * player.ultimateSkillLevel * 10;
                std::cout << "你对 " << enemy.name << " 造成了 " << playerDamage * player.ultimateSkillLevel * 10 << " 点伤害!" << std::endl;
                break;
            default:
                std::cout << "无效的攻击选择。" << std::endl;
                break;
            }
            if (enemy.hp > 0) {
                player.hp -= enemy.attack;
                std::cout << enemy.name << " 对你造成了 " << enemy.attack << " 点伤害!" << std::endl;
            }
            Sleep(1500); // 等待 1.5 秒
            system("cls"); // 刷新窗口
            break;
        }
        case 2: {
            std::cout << "选择使用物品:" << std::endl;
            std::cout << "1. 回血药" << std::endl;
            std::cout << "2. 大补药" << std::endl;
            int itemChoice;
            std::cin >> itemChoice;
            if (itemChoice == 1) {
                player.useHealthPotion();
            }
            else if (itemChoice == 2) {
                player.useBigHealthPotion();
            }
            break;
        }
        case 3:
            std::cout << "当前护甲: " << player.armor << std::endl;
            std::cout << "当前武器: " << player.weapon << std::endl;
            break;
        case 4: {
            int escapeChance = rand() % 100;
            if (escapeChance < 50) {
                std::cout << "你成功逃跑了!" << std::endl;
                setConsoleColorAndBackground(6, 0); // 变回金黄色文字
                return false;
            }
            else {
                std::cout << "你逃跑失败!" << std::endl;
                player.hp -= enemy.attack;
                std::cout << enemy.name << " 对你造成了 " << enemy.attack << " 点伤害!" << std::endl;
            }
            break;
        }
        default:
            std::cout << "无效的选择,请重新输入。" << std::endl;
        }
    }
    if (player.hp > 0) {
        std::cout << "你击败了 " << enemy.name << "!" << std::endl;
        getEquipmentAndCoins(player, enemy.name);
    }
    else {
        std::cout << "你被 " << enemy.name << " 击败了!" << std::endl;
        player.deleteSave(); // 删除存档
    }
    setConsoleColorAndBackground(6, 0); // 变回金黄色文字
    system("cls"); // 刷新窗口
    return player.hp > 0;
}

// 自动战斗逻辑
bool autoBattle(Player& player, const std::string& currentMap) {
    setConsoleColorAndBackground(4, 0); // 血红色文字,黑色背景
    system("cls"); // 刷新窗口
    Enemy enemy = generateRandomEnemy(currentMap);
    std::cout << "你遭遇了 " << enemy.name << "!" << std::endl;

    // 计算玩家和怪物的总伤害
    int playerTotalDamage = player.attack + player.magicDamage + player.physicalDamage;
    int enemyTotalDamage = enemy.attack;

    // 比较总伤害,判断胜利方
    if (playerTotalDamage >= enemyTotalDamage) {
        std::cout << "你击败了 " << enemy.name << "!" << std::endl;
        getEquipmentAndCoins(player, enemy.name); // 获得物品和传说币
        return true; // 玩家胜利
    }
    else {
        std::cout << "你被 " << enemy.name << " 击败了!" << std::endl;
        player.hp = 0; // 玩家血量归零
        player.deleteSave(); // 删除存档
        return false; // 玩家失败
    }
}

// 地图选择
void selectMap(Player& player) {
    std::cout << "选择地图:" << std::endl;
    std::cout << "1. 使命之地" << std::endl;
    if (player.level >= 50) {
        std::cout << "2. 虚空领域" << std::endl;
    }
    if (player.level >= 200) {
        std::cout << "3. 传说之海" << std::endl;
    }
    int choice;
    std::cin >> choice;
    if (choice == 1) {
        player.currentMap = "使命之地";
        player.maxLevel = 200; // 使命之地的等级上限为200
    }
    else if (choice == 2 && player.level >= 50) {
        player.currentMap = "虚空领域";
        player.maxLevel = 200; // 虚空领域的等级上限为200
    }
    else if (choice == 3 && player.level >= 200) {
        player.currentMap = "传说之海";
        player.maxLevel = 500; // 传说之海的等级上限为500
    }
    else {
        std::cout << "无效的选择,已自动选择使命之地。" << std::endl;
        player.currentMap = "使命之地";
        player.maxLevel = 200; // 默认选择使命之地,等级上限为200
    }
    std::cout << "当前地图:" << player.currentMap << ",等级上限:" << player.maxLevel << std::endl;
    player.autoSave(); // 自动存档
}

// 背包系统
void backpackSystem(Player& player) {
    setConsoleColorAndBackground(6, 0); // 金黄色文字,黑色背景
    std::cout << "你的背包:" << std::endl;
    for (size_t i = 0; i < player.backpack.size(); ++i) {
        std::cout << i + 1 << ". " << player.backpack[i] << std::endl;
    }
    std::cout << "选择要装备的物品 (输入编号, 0 退出): ";
    int choice;
    std::cin >> choice;
    if (choice > 0 && choice <= static_cast<int>(player.backpack.size())) {
        std::string item = player.backpack[choice - 1];
        if (item == "创世铠甲" || item == "战神圣衣" || item == "青铜法袍" || item == "朱红护甲" || item == "灭世战甲" || item == "虚空魔神铠" || item == "神圣之护铠") {
            player.equipArmor(item);
        }
        else if (item == "创世神剑" || item == "天顶法杖" || item == "青铜法器" || item == "赤红魔剑" || item == "灭世神剑" || item == "虚空魔神剑" || item == "神圣之神剑") {
            player.equipWeapon(item);
        }
        player.backpack.erase(player.backpack.begin() + choice - 1);
    }
}

// 加载存档
bool loadSave(Player& player) {
    std::ifstream saveFile("savegame.txt");
    if (!saveFile) {
        return false;
    }
    try {
        saveFile >> player.level >> player.hp >> player.maxHp >> player.attack
            >> player.physicalDamage >> player.magicDamage
            >> player.armor >> player.weapon
            >> player.legendCoins >> player.healthPotions
            >> player.bigHealthPotions >> player.currentMap
            >> player.normalAttackLevel >> player.heavyAttackLevel
            >> player.ultimateSkillLevel >> player.defeatedEnemies >> player.maxLevel;

        if (saveFile.fail()) {
            throw std::runtime_error("存档文件读取错误");
        }

        std::string item;
        player.backpack.clear();
        while (std::getline(saveFile >> std::ws, item) && !item.empty()) {
            player.backpack.push_back(item);
        }

        // 重新应用装备属性
        player.addStatsFromArmor(player.armor);
        player.addStatsFromWeapon(player.weapon);
    }
    catch (const std::exception& e) {
        std::cerr << "存档加载错误: " << e.what() << std::endl;
        return false;
    }
    return true;
}

// 游戏主循环
void gameLoop(Player& player) {
    setConsoleColorAndBackground(6, 0); // 金黄色文字,黑色背景

    // 加载存档
    if (loadSave(player)) {
        std::cout << "存档加载成功!" << std::endl;
    }
    else {
        std::cout << "未找到存档,将创建新游戏。" << std::endl;
    }
    system("cls"); // 刷新窗口

    while (true) {
        std::cout << "当前等级: " << player.level << "/" << player.maxLevel << std::endl;
        std::cout << "当前生命值: " << player.hp << "/" << player.maxHp << std::endl;
        std::cout << "当前攻击力: " << player.attack << std::endl;
        std::cout << "当前魔法附加伤害: " << player.magicDamage << std::endl;
        std::cout << "当前物理附加伤害: " << player.physicalDamage << std::endl;
        std::cout << "当前护甲: " << player.armor << std::endl;
        std::cout << "当前武器: " << player.weapon << std::endl;
        std::cout << "当前回血药数量: " << player.healthPotions << std::endl;
        std::cout << "当前大补药数量: " << player.bigHealthPotions << std::endl;
        std::cout << "当前传说币数量: " << player.legendCoins << std::endl;
        std::cout << "当前地图:" << player.currentMap << std::endl;
        std::cout << "1. 战斗 2. 背包 3. 选择地图 4. 商店 5. 升级技能 6. 退出游戏" << std::endl;
        int choice;
        std::cin >> choice;

        switch (choice) {
        case 1: {
            std::cout << "选择战斗方式:" << std::endl;
            std::cout << "1. 普通战斗" << std::endl;
            std::cout << "2. 自动战斗" << std::endl;
            int battleChoice;
            std::cin >> battleChoice;
            if (battleChoice == 1) {
                battle(player, player.currentMap);
            }
            else if (battleChoice == 2) {
                autoBattle(player, player.currentMap);
            }
            break;
        }
        case 2:
            backpackSystem(player);
            break;
        case 3:
            selectMap(player);
            break;
        case 4:
            player.tradeEquipment();
            break;
        case 5:
            player.upgradeSkill();
            break;
        case 6:
            player.autoSave(); // 自动存档
            return;
        default:
            std::cout << "无效的选择,请重新输入。" << std::endl;
        }

        // 检查护甲和武器显示是否正确
        bool needRefresh = false;
        std::vector<std::string> armors = { "创世铠甲", "战神圣衣", "青铜法袍", "朱红护甲", "灭世战甲", "虚空魔神铠", "神圣之护铠" };
        std::vector<std::string> weapons = { "创世神剑", "天顶法杖", "青铜法器", "赤红魔剑", "灭世神剑", "虚空魔神剑", "神圣之神剑" };
        if (std::find(armors.begin(), armors.end(), player.weapon) != armors.end()) {
            player.backpack.push_back(player.weapon);
            player.weapon.clear();
            needRefresh = true;
        }
        if (std::find(weapons.begin(), weapons.end(), player.armor) != weapons.end()) {
            player.backpack.push_back(player.armor);
            player.armor.clear();
            needRefresh = true;
        }
        if (needRefresh) {
            system("cls");
        }
        Sleep(1500); // 等待 1.5 秒
        system("cls"); // 刷新窗口
    }
}

int main() {
    srand(static_cast<unsigned int>(time(nullptr)));
    setConsoleColorAndBackground(6, 0); // 设置控制台默认颜色和背景
    startMenu();
    loadingScreen();

    Player player;
    gameLoop(player);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值