C++RPG游戏《传说》

本游戏时作者耗时7天编辑而成的rpg游戏,在这5天之内本作者测试了很多遍,诞生了很多的测试版本,而本次上传的是最新的正式版(测试版太多上传不过来),本游戏是作者原创,如有问题请私信作者进行改善。

本版本为1.9.5.5版本(开始界面的图案是“浮空岛屿”,只是作者首次正式使用符号制作图标,该技术不是很成熟,不要在意这些细节),拥有存档功能,请不要删除,如果删除则存档丢失(存档文件名为savegame.txt),目前共有十几件装备,等级上限为200(当等级为200时,进入地图“传说之海”,等级上限提升为1000,离开“传说之海”等级上限恢复为200,但当前等级不会改变),击败2个怪物提升一级,玩家基础血量为20000,攻击力为2100,每提升一级血量和攻击力都会提升一些;目前共有3个地图,基础地图为“使命之地”,当等级提升为50级后解锁地图“虚空领域”,当等级为200级后解锁地图“传说之海”,这两个地图的怪物很强,玩家很容易被击败。

注意:玩家被击败后删除存档!

下载链接:https://2010829.lanzoue.com/iwfJk2nxes7i
密码:d7br

代码如下:

#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传说1.9.5.5" << 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;
    }

    // 装备武器
    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. 购买道具" << 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 {
                    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;
                }
            }
        }
    }

    // 升级技能
    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;
}

// 地图选择
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 = 1000; // 传说之海的等级上限为1000
    }
    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:
            battle(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、付费专栏及课程。

余额充值