《地牢探险者:深渊回响》(C++游戏,爆肝7.8个小时,全文14591字)(求一个免费的三连)

核心设定与背景

游戏背景设定在一个被遗忘的古老地牢中,玩家扮演一名勇敢的探险者,不慎闯入这片充满危险与宝藏的地下世界。地牢由多个神秘区域组成,从阴暗潮湿的洞穴到布满灰尘的大厅,每个区域都隐藏着未知的危险和机遇。玩家的终极目标是穿越 5x5 的地牢地图,找到位于右下角的神秘出口,成功逃离这个危险之地。

核心游戏系统

  1. 角色成长系统

    • 玩家拥有生命值、攻击力、防御力等核心属性,通过战斗获得经验值升级
    • 每次升级会全面提升各项属性(生命值 + 20、攻击力 + 3、防御力 + 2)
    • 升级系统提供清晰的成长反馈,让玩家感受到实力的提升
  2. 多样化敌人系统

    • 四种特色敌人:地精、兽人、骷髅兵和最终区域可能遇到的巨龙
    • 每种敌人都有独特的战斗机制:
      • 地精:10% 几率几率造成暴击,造成双倍伤害
      • 骷髅兵:20% 几率减免一半伤害
      • 巨龙(BOSS):30% 几率使用火焰喷射,50% 几率减免伤害
    • 不同敌人提供不同数量的经验值奖励和独特战利品
  3. 物品与装备系统

    • 武器类:生锈的匕首、兽人战斧、长剑等,提供攻击力加成
    • 防具类:骨头碎片、龙鳞铠甲、皮甲、钢盾等,提供防御力加成
    • 消耗品:小型治疗药水(+20HP)、中型治疗药水(+50HP)
    • 完整的装备管理:可查看物品描述、使用消耗品、装备 / 卸下武器防具
  4. 地图与探索系统

    • 5x5 的网格地图,每个房间随机生成
    • 五种不同类型的房间描述,增强探索沉浸感
    • 小地图功能显示已探索区域、玩家位置和出口位置
    • 房间随机生成敌人(50% 几率)和物品(40% 几率)
  5. 回合制战斗系统

    • 清晰的战斗状态显示(双方生命值)
    • 玩家回合可选择:攻击、使用物品或查看状态
    • 敌人拥有独特攻击模式,战斗策略性强
    • 伤害计算考虑双方攻防属性,形成有趣的数值博弈

游戏流程与目标

  1. 玩家输入名字创建角色,从地牢入口开始冒险
  2. 通过 WASD 键在地图上移动,探索各个房间
  3. 与遇到的敌人战斗,获取经验值和战利品
  4. 管理背包物品,合理使用药水和装备
  5. 提升等级增强实力,为挑战更强大的敌人做准备
  6. 找到位于地图右下角的出口,成功逃离地牢

游戏特色

  • 随机性与重玩价值:每次游戏的地图布局、敌人分布和物品位置都是随机生成的
  • 策略深度:需要根据敌人类型选择合适的战斗策略和物品使用时机
  • 渐进式难度:随着探索深入,可能遇到更强大的敌人
  • 成就感:通过战斗升级、获取强力装备带来明确的成长体验
  • 简单易上手的操作:直观的菜单系统和明确的操作提示

一、基础操作

  • 角色移动:使用 W(上)、A(左)、S(下)、D(右)键控制方向
  • 确认操作:所有选择后按回车键确认
  • 数值输入:根据菜单选择时输入对应数字,移动时输入对应方向键

二、主界面菜单(非战斗状态)

  1. 移动(输入 1)

    • 选择后提示输入方向(W/A/S/D)
    • 若撞击墙壁会提示 "不能向那个方向移动"
  2. 查看背包(输入 2)

    • 显示所有持有的物品列表及编号
    • 输入物品编号后可选择:
      • 1:使用该物品(仅对药水有效)
      • 2:装备为武器(仅对武器类物品有效)
      • 3:装备为防具(仅对防具类物品有效)
      • 0:取消操作
  3. 查看状态(输入 3)

    • 显示角色详细信息:等级、生命值、攻击力、防御力
    • 显示当前装备的武器和防具
    • 显示当前经验值及升级所需经验
  4. 查看小地图(输入 4)

    • 显示 5x5 网格地图
    • 标识说明:
      • P:玩家当前位置
      • E:出口位置
      • .:已探索过的房间
      • ?:未探索的房间
  5. 退出游戏(输入 5)

    • 直接结束游戏进程

三、战斗状态操作

遇到敌人时自动进入战斗模式,战斗菜单:

  1. 攻击(输入 1)

    • 对当前敌人发起普通攻击
    • 伤害值根据双方攻防属性计算
  2. 使用物品(输入 2)

    • 显示背包物品列表
    • 输入物品编号使用(通常用于使用治疗药水)
    • 输入 0 取消使用
  3. 查看状态(输入 3)

    • 战斗中查看自身属性状态
    • 不消耗回合数

四、特殊交互

  • 发现物品时

    • 输入 y(或 Y)拾取物品
    • 输入 n(或 N)放弃拾取
  • 游戏开始时

    • 输入玩家名称后按回车确认

所有操作均有明确的文字提示引导,新手可通过多次使用 "查看状态" 和 "查看小地图" 来熟悉游戏进度和自身状况。

编辑

这款游戏的战斗操作是怎样的?

游戏中可以获得哪些类型的物品?

这款游戏支持多人对战吗?

《地牢探险者:深渊回响》适合喜欢回合制战斗和地牢探索的玩家,游戏难度适中且具有良好的成长曲线,既适合休闲玩家体验探险乐趣,也能让核心玩家感受到策略战斗的挑战。每次冒险都是一次全新的体验,充满了未知与惊喜。

那么,废话不多说,不多说废话,废话多说了还是废话所以直接上代码:

#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <limits>

using namespace std;

// 前向声明
class Item;
class Enemy;
class Player;

// 物品类
class Item {
private:
    string name;
    string description;
    int attackBonus;
    int defenseBonus;
    int healthBonus;
    bool isPotion;

public:
    Item(string n, string d, int ab, int db, int hb, bool ip)
        : name(n), description(d), attackBonus(ab), defenseBonus(db), 
          healthBonus(hb), isPotion(ip) {}

    string getName() const { return name; }
    string getDescription() const { return description; }
    int getAttackBonus() const { return attackBonus; }
    int getDefenseBonus() const { return defenseBonus; }
    int getHealthBonus() const { return healthBonus; }
    bool isPotionItem() const { return isPotion; }
    
    void use(Player& player);
};

// 敌人基类
class Enemy {
protected:
    string name;
    int health;
    int maxHealth;
    int attack;
    int defense;
    int experienceReward;
    Item* loot;

public:
    Enemy(string n, int h, int a, int d, int exp, Item* l)
        : name(n), health(h), maxHealth(h), attack(a), defense(d), 
          experienceReward(exp), loot(l) {}

    virtual ~Enemy() {
        delete loot; // 释放战利品内存
    }

    string getName() const { return name; }
    int getHealth() const { return health; }
    int getMaxHealth() const { return maxHealth; }
    int getAttack() const { return attack; }
    int getDefense() const { return defense; }
    int getExperienceReward() const { return experienceReward; }
    Item* getLoot() const { return loot; }
    void setLoot(nullptr_t) { loot = nullptr; }

    // 声明为虚函数,允许派生类重写
    virtual void takeDamage(int damage) {
        if (damage > 0) {
            health -= damage;
            if (health < 0) health = 0;
        }
    }

    bool isAlive() const { return health > 0; }
    
    virtual int attackPlayer(Player& player);
    virtual void display() const;
};

// 玩家类
class Player {
private:
    string name;
    int health;
    int maxHealth;
    int attack;
    int defense;
    int level;
    int experience;
    int experienceToNextLevel;
    vector<Item*> inventory;
    Item* equippedWeapon;
    Item* equippedArmor;

public:
    Player(string n) 
        : name(n), health(100), maxHealth(100), attack(10), defense(5),
          level(1), experience(0), experienceToNextLevel(100),
          equippedWeapon(nullptr), equippedArmor(nullptr) {}

    ~Player() {
        for (Item* item : inventory) {
            delete item;
        }
        delete equippedWeapon;
        delete equippedArmor;
    }

    string getName() const { return name; }
    int getHealth() const { return health; }
    int getMaxHealth() const { return maxHealth; }
    int getAttack() const { 
        int total = attack;
        if (equippedWeapon) total += equippedWeapon->getAttackBonus();
        return total;
    }
    int getDefense() const { 
        int total = defense;
        if (equippedArmor) total += equippedArmor->getDefenseBonus();
        return total;
    }
    int getLevel() const { return level; }
    int getExperience() const { return experience; }
    int getExperienceToNextLevel() const { return experienceToNextLevel; }

    void takeDamage(int damage) {
        int damageTaken = max(0, damage - getDefense() / 2);
        health -= damageTaken;
        if (health < 0) health = 0;
        cout << name << "受到了" << damageTaken << "点伤害!" << endl;
    }

    void heal(int amount) {
        health += amount;
        if (health > maxHealth) health = maxHealth;
        cout << name << "恢复了" << amount << "点生命值!" << endl;
    }

    void addExperience(int amount) {
        cout << "获得了" << amount << "点经验值!" << endl;
        experience += amount;
        
        while (experience >= experienceToNextLevel) {
            levelUp();
        }
    }

    void levelUp() {
        level++;
        experience -= experienceToNextLevel;
        experienceToNextLevel = static_cast<int>(experienceToNextLevel * 1.5);
        
        maxHealth += 20;
        health = maxHealth;
        attack += 3;
        defense += 2;
        
        cout << endl << "恭喜! " << name << "升级到了" << level << "级!" << endl;
        cout << "属性提升: 生命值+" << 20 << ", 攻击力+" << 3 << ", 防御力+" << 2 << endl << endl;
    }

    bool isAlive() const { return health > 0; }

    void addItem(Item* item) {
        inventory.push_back(item);
        cout << "获得了" << item->getName() << "!" << endl;
    }

    void displayInventory() const {
        if (inventory.empty()) {
            cout << "你的背包是空的。" << endl;
            return;
        }
        
        cout << "===== 背包 (" << inventory.size() << ") =====" << endl;
        for (size_t i = 0; i < inventory.size(); i++) {
            cout << i+1 << ". " << inventory[i]->getName() << " - " << inventory[i]->getDescription() << endl;
        }
        cout << "==================================" << endl;
    }

    void useItem(int index) {
        if (index < 1 || index > static_cast<int>(inventory.size())) {
            cout << "无效的物品编号!" << endl;
            return;
        }
        
        Item* item = inventory[index-1];
        item->use(*this);
        
        // 如果是消耗品,使用后移除
        if (item->isPotionItem()) {
            inventory.erase(inventory.begin() + index - 1);
            delete item;
        }
    }

    void equipWeapon(int index) {
        if (index < 1 || index > static_cast<int>(inventory.size())) {
            cout << "无效的物品编号!" << endl;
            return;
        }
        
        Item* item = inventory[index-1];
        if (item->getAttackBonus() <= 0) {
            cout << "这不是武器,不能装备!" << endl;
            return;
        }
        
        // 如果已经装备了武器,放回背包
        if (equippedWeapon) {
            inventory.push_back(equippedWeapon);
        }
        
        equippedWeapon = item;
        inventory.erase(inventory.begin() + index - 1);
        cout << "装备了" << item->getName() << "!" << endl;
    }

    void equipArmor(int index) {
        if (index < 1 || index > static_cast<int>(inventory.size())) {
            cout << "无效的物品编号!" << endl;
            return;
        }
        
        Item* item = inventory[index-1];
        if (item->getDefenseBonus() <= 0) {
            cout << "这不是防具,不能装备!" << endl;
            return;
        }
        
        // 如果已经装备了防具,放回背包
        if (equippedArmor) {
            inventory.push_back(equippedArmor);
        }
        
        equippedArmor = item;
        inventory.erase(inventory.begin() + index - 1);
        cout << "装备了" << item->getName() << "!" << endl;
    }

    void displayStatus() const {
        cout << endl << "===== " << name << " 的状态 =====" << endl;
        cout << "等级: " << level << endl;
        cout << "生命值: " << health << "/" << maxHealth << endl;
        cout << "攻击力: " << getAttack() << (equippedWeapon ? " (+"+to_string(equippedWeapon->getAttackBonus())+")" : "") << endl;
        cout << "防御力: " << getDefense() << (equippedArmor ? " (+"+to_string(equippedArmor->getDefenseBonus())+")" : "") << endl;
        cout << "经验值: " << experience << "/" << experienceToNextLevel << endl;
        cout << "装备: " << endl;
        cout << "  武器: " << (equippedWeapon ? equippedWeapon->getName() : "无") << endl;
        cout << "  防具: " << (equippedArmor ? equippedArmor->getName() : "无") << endl;
        cout << "==============================" << endl << endl;
    }
};

// 实现Item的use方法
void Item::use(Player& player) {
    if (isPotion) {
        cout << "使用了" << name << "!" << endl;
        player.heal(healthBonus);
    } else {
        cout << name << "不能被直接使用,可以尝试装备它。" << endl;
    }
}

// 实现Enemy的攻击方法
int Enemy::attackPlayer(Player& player) {
    int damage = max(0, attack - player.getDefense() / 3);
    player.takeDamage(damage);
    return damage;
}

// 显示敌人信息
void Enemy::display() const {
    cout << name << " (生命值: " << health << "/" << maxHealth << ", 攻击力: " << attack << ", 防御力: " << defense << ")" << endl;
}

// 派生敌人类型
class Goblin : public Enemy {
public:
    Goblin() : Enemy("地精", 30, 8, 2, 20, 
        new Item("生锈的匕首", "一把生锈的匕首,攻击力+3", 3, 0, 0, false)) {}
    
    int attackPlayer(Player& player) override {
        // 地精有10%几率造成双倍伤害
        int damage = max(0, getAttack() - player.getDefense() / 3);
        if (rand() % 10 == 0) {
            damage *= 2;
            cout << "地精的暴击!" << endl;
        }
        player.takeDamage(damage);
        return damage;
    }
};

class Orc : public Enemy {
public:
    Orc() : Enemy("兽人", 60, 12, 5, 50, 
        new Item("兽人战斧", "一把沉重的战斧,攻击力+5", 5, 0, 0, false)) {}
};

class Skeleton : public Enemy {
public:
    Skeleton() : Enemy("骷髅兵", 40, 10, 3, 30, 
        new Item("骨头碎片", "可以用来制作简易武器,攻击力+2", 2, 0, 0, false)) {}
    
    // 正确重写基类的虚函数
    void takeDamage(int damage) override {
        // 骷髅兵有20%几率减免一半伤害
        if (rand() % 5 == 0) {
            damage /= 2;
            cout << "骷髅兵的骨头吸收了部分伤害!" << endl;
        }
        Enemy::takeDamage(damage);
    }
};

class Dragon : public Enemy {
public:
    Dragon() : Enemy("巨龙", 200, 25, 15, 500, 
        new Item("龙鳞铠甲", "由巨龙鳞片制成的铠甲,防御力+10", 0, 10, 0, false)) {}
    
    int attackPlayer(Player& player) override {
        // 巨龙有30%几率使用火焰喷射
        if (rand() % 10 < 3) {
            int fireDamage = getAttack() + 10;
            player.takeDamage(fireDamage);
            cout << "巨龙使用了火焰喷射!" << endl;
            return fireDamage;
        }
        return Enemy::attackPlayer(player);
    }
    
    // 正确重写基类的虚函数
    void takeDamage(int damage) override {
        // 巨龙有50%几率减免少量伤害
        if (rand() % 2 == 0) {
            int reduced = damage - 5;
            if (reduced < 0) reduced = 0;
            cout << "巨龙的鳞甲减少了伤害!" << endl;
            Enemy::takeDamage(reduced);
        } else {
            Enemy::takeDamage(damage);
        }
    }
};

// 房间类,表示地图中的一个区域
class Room {
private:
    string description;
    bool hasEnemy;
    Enemy* enemy;
    bool hasItem;
    Item* item;
    bool visited;
    bool isExit;

public:
    Room(string desc, bool enemy, bool item, bool exit)
        : description(desc), hasEnemy(enemy), enemy(nullptr), 
          hasItem(item), item(nullptr), visited(false), isExit(exit) {
        
        // 随机生成敌人
        if (hasEnemy) {
            int enemyType = rand() % 4; // 包含巨龙的四种敌人
            switch (enemyType) {
                case 0: enemy = new Goblin(); break;
                case 1: enemy = new Orc(); break;
                case 2: enemy = new Skeleton(); break;
                case 3: enemy = new Dragon(); break;
                default: enemy = new Goblin();
            }
        }
        
        // 随机生成物品
        if (hasItem) {
            int itemType = rand() % 5;
            switch (itemType) {
                case 0: item = new Item("小型治疗药水", "恢复20点生命值", 0, 0, 20, true); break;
                case 1: item = new Item("中型治疗药水", "恢复50点生命值", 0, 0, 50, true); break;
                case 2: item = new Item("长剑", "一把锋利的长剑,攻击力+7", 7, 0, 0, false); break;
                case 3: item = new Item("皮甲", "由坚韧皮革制成的护甲,防御力+4", 0, 4, 0, false); break;
                case 4: item = new Item("钢盾", "坚固的钢盾,防御力+6", 0, 6, 0, false); break;
                default: item = new Item("小型治疗药水", "恢复20点生命值", 0, 0, 20, true);
            }
        }
    }

    ~Room() {
        delete enemy;
        delete item;
    }

    string getDescription() const { return description; }
    bool hasEnemyHere() const { return hasEnemy && enemy && enemy->isAlive(); }
    Enemy* getEnemy() const { return enemy; }
    void setEnemy(Enemy* e) { enemy = e; } // 添加setter方法
    bool hasItemHere() const { return hasItem && item; }
    Item* getItem() const { return item; }
    bool isVisited() const { return visited; }
    bool isExitRoom() const { return isExit; }

    void setVisited(bool v) { visited = v; }
    
    // 拾取物品
    void pickUpItem(Player& player) {
        if (hasItemHere()) {
            player.addItem(item);
            item = nullptr;
            hasItem = false;
        } else {
            cout << "这个房间里没有可以拾取的物品了。" << endl;
        }
    }
};

// 游戏地图类
class Map {
private:
    vector<vector<Room*>> grid;
    int width;
    int height;
    int playerX;
    int playerY;

public:
    Map(int w, int h) : width(w), height(h), playerX(0), playerY(0) {
        // 初始化地图
        grid.resize(height, vector<Room*>(width, nullptr));
        
        // 随机生成地图
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                // 50%几率有敌人,40%几率有物品
                bool hasEnemy = (rand() % 10 < 5);
                bool hasItem = (rand() % 10 < 4);
                bool isExit = (x == width - 1 && y == height - 1); // 出口在右下角
                
                // 生成房间描述
                string desc;
                vector<string> roomTypes = {
                    "一个阴暗潮湿的洞穴",
                    "一个布满灰尘的大厅",
                    "一条狭窄的走廊",
                    "一个宽敞的石室",
                    "一个神秘的密室"
                };
                
                desc = roomTypes[rand() % roomTypes.size()];
                
                if (isExit) {
                    desc = "一个宏伟的大厅,尽头有一扇发光的门——这是出口!";
                }
                
                grid[y][x] = new Room(desc, hasEnemy, hasItem, isExit);
            }
        }
        
        // 修复第465行问题:使用setter方法安全设置敌人指针为nullptr
        Enemy* startEnemy = grid[0][0]->getEnemy();
        delete startEnemy;  // 先删除原有敌人
        grid[0][0]->setEnemy(nullptr);  // 使用setter方法设置为nullptr
    }

    ~Map() {
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                delete grid[y][x];
            }
        }
    }

    Room* getCurrentRoom() const {
        return grid[playerY][playerX];
    }

    bool movePlayer(char direction) {
        int newX = playerX;
        int newY = playerY;
        
        switch (direction) {
            case 'w': newY--; break;
            case 's': newY++; break;
            case 'a': newX--; break;
            case 'd': newX++; break;
            default: return false;
        }
        
        // 检查是否在地图范围内
        if (newX >= 0 && newX < width && newY >= 0 && newY < height) {
            playerX = newX;
            playerY = newY;
            grid[playerY][playerX]->setVisited(true);
            return true;
        }
        
        return false;
    }

    void displayMiniMap() const {
        cout << endl << "===== 小地图 =====" << endl;
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                if (x == playerX && y == playerY) {
                    cout << "P "; // 玩家位置
                } else if (grid[y][x]->isExitRoom()) {
                    cout << "E "; // 出口
                } else if (grid[y][x]->isVisited()) {
                    cout << ". "; // 已访问
                } else {
                    cout << "? "; // 未访问
                }
            }
            cout << endl;
        }
        cout << "==================" << endl << endl;
    }
};

// 战斗系统
bool battle(Player& player, Enemy* enemy) {
    if (!enemy || !enemy->isAlive()) return true; // 防御性检查
    
    cout << endl << "一场战斗开始了! " << enemy->getName() << "向你发起了攻击!" << endl;
    
    while (player.isAlive() && enemy->isAlive()) {
        // 显示战斗状态
        cout << endl << "----- 战斗状态 -----" << endl;
        cout << player.getName() << ": " << player.getHealth() << "/" << player.getMaxHealth() << " HP" << endl;
        cout << enemy->getName() << ": " << enemy->getHealth() << "/" << enemy->getMaxHealth() << " HP" << endl;
        cout << "---------------------" << endl;
        
        // 玩家回合
        cout << endl << "你的回合! 请选择动作:" << endl;
        cout << "1. 攻击" << endl;
        cout << "2. 使用物品" << endl;
        cout << "3. 查看状态" << endl;
        
        int choice;
        // 处理无效输入
        while (!(cin >> choice)) {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "无效输入,请输入数字: ";
        }
        
        switch (choice) {
            case 1: {
                // 玩家攻击
                int damage = max(0, player.getAttack() - enemy->getDefense() / 3);
                enemy->takeDamage(damage);
                cout << "你对" << enemy->getName() << "造成了" << damage << "点伤害!" << endl;
                
                if (!enemy->isAlive()) {
                    cout << "你击败了" << enemy->getName() << "!" << endl;
                    player.addExperience(enemy->getExperienceReward());
                    
                    // 掉落物品
                    if (enemy->getLoot()) {
                        player.addItem(enemy->getLoot());
                        enemy->setLoot(nullptr); // 防止重复释放
                    }
                    return true;
                }
                break;
            }
            case 2: {
                // 使用物品
                player.displayInventory();
                cout << "请选择要使用的物品编号 (0取消): ";
                int itemChoice;
                cin >> itemChoice;
                
                if (itemChoice != 0) {
                    player.useItem(itemChoice);
                }
                break;
            }
            case 3: {
                // 查看状态
                player.displayStatus();
                break;
            }
            default:
                cout << "无效的选择,你浪费了一次攻击机会!" << endl;
        }
        
        // 敌人回合
        if (enemy->isAlive()) {
            cout << endl << enemy->getName() << "的回合!" << endl;
            enemy->attackPlayer(player);
            
            if (!player.isAlive()) {
                cout << "你被" << enemy->getName() << "击败了!" << endl;
                return false;
            }
        }
    }
    
    return player.isAlive();
}

// 游戏主函数
void playGame() {
    srand(time(0));
    
    cout << "欢迎来到地牢探险者:深渊回响!" << endl;
    cout << "请输入你的名字: ";
    string playerName;
    cin >> playerName;
    
    Player player(playerName);
    Map map(5, 5); // 创建一个5x5的地图
    
    cout << endl << "你发现自己身处一个神秘的地牢入口。你的目标是找到出口并活着离开!" << endl;
    cout << "使用WASD键移动,输入命令来进行各种操作。" << endl;
    
    // 标记起始房间为已访问
    map.getCurrentRoom()->setVisited(true);
    
    while (player.isAlive()) {
        Room* currentRoom = map.getCurrentRoom();
        
        cout << endl << "===== 新的区域 =====" << endl;
        cout << currentRoom->getDescription() << endl;
        
        // 检查是否有敌人
        if (currentRoom->hasEnemyHere()) {
            Enemy* enemy = currentRoom->getEnemy();
            enemy->display();
            
            // 开始战斗
            bool victory = battle(player, enemy);
            if (!victory) {
                // 战斗失败,游戏结束
                break;
            }
        }
        
        // 检查是否是出口
        if (currentRoom->isExitRoom()) {
            cout << endl << "恭喜你找到了出口! 你成功逃离了地牢!" << endl;
            cout << "游戏结束。你的最终等级是: " << player.getLevel() << endl;
            break;
        }
        
        // 检查是否有物品
        if (currentRoom->hasItemHere()) {
            cout << endl << "你发现了一个物品: " << currentRoom->getItem()->getName() << endl;
            cout << "要拾取这个物品吗? (y/n): ";
            char choice;
            cin >> choice;
            
            if (choice == 'y' || choice == 'Y') {
                currentRoom->pickUpItem(player);
            }
        }
        
        // 显示可用命令
        cout << endl << "请选择下一步行动:" << endl;
        cout << "1. 移动 (WASD)" << endl;
        cout << "2. 查看背包" << endl;
        cout << "3. 查看状态" << endl;
        cout << "4. 查看小地图" << endl;
        cout << "5. 退出游戏" << endl;
        
        int choice;
        // 处理无效输入
        while (!(cin >> choice)) {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "无效输入,请输入数字: ";
        }
        
        switch (choice) {
            case 1: {
                cout << "请输入移动方向 (WASD): ";
                char direction;
                cin >> direction;
                
                if (map.movePlayer(direction)) {
                    cout << "你向" << direction << "方向移动了。" << endl;
                } else {
                    cout << "不能向那个方向移动,那里是墙壁!" << endl;
                }
                break;
            }
            case 2: {
                player.displayInventory();
                cout << "要使用物品吗? (输入编号,0取消): ";
                int itemChoice;
                cin >> itemChoice;
                
                if (itemChoice > 0) {
                    cout << "1. 使用 2. 装备为武器 3. 装备为防具: ";
                    int action;
                    cin >> action;
                    
                    switch (action) {
                        case 1: player.useItem(itemChoice); break;
                        case 2: player.equipWeapon(itemChoice); break;
                        case 3: player.equipArmor(itemChoice); break;
                        default: cout << "无效选择。" << endl;
                    }
                }
                break;
            }
            case 3:
                player.displayStatus();
                break;
            case 4:
                map.displayMiniMap();
                break;
            case 5:
                cout << "感谢游玩! 再见!" << endl;
                return;
            default:
                cout << "无效的选择,请重试。" << endl;
        }
    }
    
    // 如果玩家死亡
    if (!player.isAlive()) {
        cout << endl << "游戏结束。你的冒险到此为止。" << endl;
        cout << "你的最终等级是: " << player.getLevel() << endl;
    }
}

int main() {
    playGame();
    return 0;
}
    

本期内容由观众朋友们的三连赞助播出~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值