问题标题: 小游戏

0
0
郭宸熹
郭宸熹
修练者
修练者

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <thread>    // 跨平台延时所需头文件
#include <chrono>    // 时间单位所需头文件

using namespace std;

// ===================== 全局常量定义 =====================
const int MAX_NAME_LEN = 20;
const int MAX_SKILL = 6;
const int MAX_ITEM = 30;
const int MAX_MONSTER = 15;
const int MAX_TASK = 8;
const int MAP_SIZE = 10;
const int SAVE_OK = 1;
const int SAVE_FAIL = 0;

// ===================== 结构体定义 =====================
// 技能结构体
struct Skill
{
    char skillName[MAX_NAME_LEN];
    int damage;        // 技能伤害
    int mpCost;        // 蓝量消耗
    int type;          // 0普攻 1火系 2冰系 3毒系 4治疗
    int unlockLevel;   // 解锁等级
    bool isUnlock;     // 是否解锁
};

// 物品结构体
struct Item
{
    char itemName[MAX_NAME_LEN];
    int type;          // 1回血 2回蓝 3攻击buff 4防御buff 5材料 6装备
    int value;         // 效果数值
    int price;         // 购买价格
    int count;         // 拥有数量
    bool isEquip;      // 是否可装备
};

// 怪物结构体
struct Monster
{
    char monName[MAX_NAME_LEN];
    int hp;
    int maxHp;
    int attack;
    int defense;
    int exp;
    int gold;
    int level;
    bool isBoss;
    int dropItem;      // 掉落物品下标
};

// 任务结构体
struct Task
{
    char taskName[MAX_NAME_LEN];
    char taskDesc[100];
    int needKill;      // 需要击杀怪物数量
    int nowKill;       // 当前击杀数量
    int targetMon;     // 目标怪物下标
    int rewardExp;
    int rewardGold;
    bool isFinish;
    bool isAccept;
};

// 玩家结构体
struct Player
{
    char name[MAX_NAME_LEN];
    int level;
    int hp;
    int maxHp;
    int mp;
    int maxMp;
    int attack;
    int defense;
    int exp;
    int needExp;
    int gold;
    int positionX;
    int positionY;
    int buffAtk;
    int buffDef;
    int buffRound;
    Skill skill[MAX_SKILL];
    Item bag[MAX_ITEM];
    Task task[MAX_TASK];
};

// 地图格子类型
enum GridType
{
    GRID_EMPTY,
    GRID_MONSTER,
    GRID_TREASURE,
    GRID_SHOP,
    GRID_SAVE,
    GRID_BOSS,
    GRID_TRAP
};

// 地图结构体
struct GameMap
{
    GridType grid[MAP_SIZE][MAP_SIZE];
    int monIndex[MAP_SIZE][MAP_SIZE];
    bool isExplore[MAP_SIZE][MAP_SIZE];
};

// ===================== 全局变量 =====================
Player hero;
Monster monsterList[MAX_MONSTER];
GameMap worldMap;
bool gameRun = true;
int gameDay = 1;

// ===================== 函数声明 =====================
// 初始化函数
void InitGame();
void InitPlayer();
void InitSkill();
void InitItem();
void InitMonster();
void InitTask();
void InitMap();

// 界面函数
void ShowStartMenu();
void ShowMainMenu();
void ShowPlayerInfo();
void ShowBag();
void ShowSkillList();
void ShowTaskList();
void ShowShop();
void ShowMap();
void ClearScreen();
void SleepTime(int ms);

// 战斗函数
void Battle(int monID);
void PlayerAttack(int monID);
void PlayerUseSkill(int monID);
void PlayerUseItem();
void MonsterAttack(int monID);
void CalculateDamage(int atk, int def, int& hurt);
void BossBattle();

// 养成函数
void LevelUp();
void RecoverHPMP();
void AddBuff(int atk, int def, int round);
void ClearBuff();

// 地图探索
void MovePlayer(int dir);
void RandomEvent();
void OpenTreasure();
void StepTrap();

// 任务**
void AcceptTask(int tid);
void SubmitTask(int tid);
void UpdateTaskKill(int monID);

// 物品操作
void UseItem(int id);
void BuyItem(int id);
void DropItem(int id);

// 存档读档
int SaveGame();
int LoadGame();

// 随机工具
int RandomInt(int min, int max);
bool RandomBool(int rate);

// ===================== 函数实现开始 =====================
void ClearScreen()
{
    system("cls");
}

// 跨平台延时函数(修复核心)
void SleepTime(int ms)
{
    // 替换Windows专属Sleep,支持Linux/macOS/Windows全平台
    std::this_thread::sleep_for(std::chrono::milliseconds(ms));
}

int RandomInt(int min, int max)
{
    return rand() % (max - min + 1) + min;
}

bool RandomBool(int rate)
{
    int r = RandomInt(1, 100);
    return r <= rate;
}

void InitSkill()
{
    // 初始技能1 普通攻击
    strcpy(hero.skill[0].skillName, "普通打击");
    hero.skill[0].damage = 10;
    hero.skill[0].mpCost = 0;
    hero.skill[0].type = 0;
    hero.skill[0].unlockLevel = 1;
    hero.skill[0].isUnlock = true;

    // 技能2 烈火斩
    strcpy(hero.skill[1].skillName, "烈火斩");
    hero.skill[1].damage = 25;
    hero.skill[1].mpCost = 15;
    hero.skill[1].type = 1;
    hero.skill[1].unlockLevel = 3;
    hero.skill[1].isUnlock = false;

    // 技能3 冰霜护盾
    strcpy(hero.skill[2].skillName, "冰霜护盾");
    hero.skill[2].damage = 18;
    hero.skill[2].mpCost = 12;
    hero.skill[2].type = 2;
    hero.skill[2].unlockLevel = 5;
    hero.skill[2].isUnlock = false;

    // 技能4 剧毒突袭
    strcpy(hero.skill[3].skillName, "剧毒突袭");
    hero.skill[3].damage = 35;
    hero.skill[3].mpCost = 22;
    hero.skill[3].type = 3;
    hero.skill[3].unlockLevel = 8;
    hero.skill[3].isUnlock = false;

    // 技能5 清心治愈
    strcpy(hero.skill[4].skillName, "清心治愈");
    hero.skill[4].damage = 40;
    hero.skill[4].mpCost = 30;
    hero.skill[4].type = 4;
    hero.skill[4].unlockLevel = 10;
    hero.skill[4].isUnlock = false;

    // 技能6 万剑归宗
    strcpy(hero.skill[5].skillName, "万剑归宗");
    hero.skill[5].damage = 80;
    hero.skill[5].mpCost = 50;
    hero.skill[5].type = 1;
    hero.skill[5].unlockLevel = 15;
    hero.skill[5].isUnlock = false;
}

void InitItem()
{
    // 清空背包
    for (int i = 0; i < MAX_ITEM; i++)
    {
        hero.bag[i].count = 0;
        hero.bag[i].isEquip = false;
    }

    // 物品1 小红药
    strcpy(hero.bag[0].itemName, "低级回血丹");
    hero.bag[0].type = 1;
    hero.bag[0].value = 30;
    hero.bag[0].price = 15;
    hero.bag[0].count = 5;

    // 物品2 小蓝药
    strcpy(hero.bag[1].itemName, "低级回蓝丹");
    hero.bag[1].type = 2;
    hero.bag[1].value = 20;
    hero.bag[1].price = 12;
    hero.bag[1].count = 5;

    // 物品3 力量药剂
    strcpy(hero.bag[2].itemName, "力量增幅药剂");
    hero.bag[2].type = 3;
    hero.bag[2].value = 8;
    hero.bag[2].price = 35;
    hero.bag[2].count = 2;

    // 物品4 防御药剂
    strcpy(hero.bag[3].itemName, "铁皮防御药剂");
    hero.bag[3].type = 4;
    hero.bag[3].value = 6;
    hero.bag[3].price = 32;
    hero.bag[3].count = 2;

    // 物品5 中级血药
    strcpy(hero.bag[4].itemName, "中级回血丹");
    hero.bag[4].type = 1;
    hero.bag[4].value = 80;
    hero.bag[4].price = 45;
    hero.bag[4].count = 0;

    // 物品6 高级血药
    strcpy(hero.bag[5].itemName, "高级回血丹");
    hero.bag[5].type = 1;
    hero.bag[5].value = 150;
    hero.bag[5].price = 88;
    hero.bag[5].count = 0;

    // 物品7 玄铁矿石
    strcpy(hero.bag[6].itemName, "玄铁矿石");
    hero.bag[6].type = 5;
    hero.bag[6].value = 0;
    hero.bag[6].price = 25;
    hero.bag[6].count = 0;

    // 物品8 精钢甲
    strcpy(hero.bag[7].itemName, "精钢护甲");
    hero.bag[7].type = 6;
    hero.bag[7].value = 12;
    hero.bag[7].price = 120;
    hero.bag[7].count = 0;
    hero.bag[7].isEquip = true;
}

void InitMonster()
{
    // 1级小怪 野狼
    strcpy(monsterList[0].monName, "荒野野狼");
    monsterList[0].hp = 45;
    monsterList[0].maxHp = 45;
    monsterList[0].attack = 8;
    monsterList[0].defense = 3;
    monsterList[0].exp = 12;
    monsterList[0].gold = 8;
    monsterList[0].level = 1;
    monsterList[0].isBoss = false;
    monsterList[0].dropItem = 0;

    // 2级 毒蜘蛛
    strcpy(monsterList[1].monName, "剧毒蜘蛛");
    monsterList[1].hp = 55;
    monsterList[1].maxHp = 55;
    monsterList[1].attack = 12;
    monsterList[1].defense = 4;
    monsterList[1].exp = 18;
    monsterList[1].gold = 12;
    monsterList[1].level = 2;
    monsterList[1].isBoss = false;
    monsterList[1].dropItem = 1;

    // 3级 山贼
    strcpy(monsterList[2].monName, "拦路山贼");
    monsterList[2].hp = 70;
    monsterList[2].maxHp = 70;
    monsterList[2].attack = 15;
    monsterList[2].defense = 6;
    monsterList[2].exp = 25;
    monsterList[2].gold = 18;
    monsterList[2].level = 3;
    monsterList[2].isBoss = false;
    monsterList[2].dropItem = 2;

    // 4级 丛林猛虎
    strcpy(monsterList[3].monName, "丛林猛虎");
    monsterList[3].hp = 90;
    monsterList[3].maxHp = 90;
    monsterList[3].attack = 20;
    monsterList[3].defense = 7;
    monsterList[3].exp = 35;
    monsterList[3].gold = 25;
    monsterList[3].level = 4;
    monsterList[3].isBoss = false;
    monsterList[3].dropItem = 3;

    // 5级 沼泽巨蟒
    strcpy(monsterList[4].monName, "沼泽巨蟒");
    monsterList[4].hp = 110;
    monsterList[4].maxHp = 110;
    monsterList[4].attack = 24;
    monsterList[4].defense = 9;
    monsterList[4].exp = 45;
    monsterList[4].gold = 32;
    monsterList[4].level = 5;
    monsterList[4].isBoss = false;
    monsterList[4].dropItem = 4;

    // 6级 亡灵武士
    strcpy(monsterList[5].monName, "亡灵武士");
    monsterList[5].hp = 130;
    monsterList[5].maxHp = 130;
    monsterList[5].attack = 28;
    monsterList[5].defense = 11;
    monsterList[5].exp = 55;
    monsterList[5].gold = 40;
    monsterList[5].level = 6;
    monsterList[5].isBoss = false;
    monsterList[5].dropItem = 5;

    // 7级 熔岩蜥蜴
    strcpy(monsterList[6].monName, "熔岩蜥蜴");
    monsterList[6].hp = 155;
    monsterList[6].maxHp = 155;
    monsterList[6].attack = 33;
    monsterList[6].defense = 13;
    monsterList[6].exp = 68;
    monsterList[6].gold = 48;
    monsterList[6].level = 7;
    monsterList[6].isBoss = false;
    monsterList[6].dropItem = 6;

    // 8级 暗夜刺客
    strcpy(monsterList[7].monName, "暗夜刺客");
    monsterList[7].hp = 180;
    monsterList[7].maxHp = 180;
    monsterList[7].attack = 38;
    monsterList[7].defense = 15;
    monsterList[7].exp = 80;
    monsterList[7].gold = 58;
    monsterList[7].level = 8;
    monsterList[7].isBoss = false;
    monsterList[7].dropItem = 7;

    // 9级 寒冰雪熊
    strcpy(monsterList[8].monName, "寒冰雪熊");
    monsterList[8].hp = 220;
    monsterList[8].maxHp = 220;
    monsterList[8].attack = 42;
    monsterList[8].defense = 18;
    monsterList[8].exp = 95;
    monsterList[8].gold = 68;
    monsterList[8].level = 9;
    monsterList[8].isBoss = false;
    monsterList[8].dropItem = 0;

    // 10级 千年树妖
    strcpy(monsterList[9].monName, "千年树妖");
    monsterList[9].hp = 260;
    monsterList[9].maxHp = 260;
    monsterList[9].attack = 48;
    monsterList[9].defense = 20;
    monsterList[9].exp = 110;
    monsterList[9].gold = 80;
    monsterList[9].level = 10;
    monsterList[9].isBoss = false;
    monsterList[9].dropItem = 1;

    // Boss1 山贼头领
    strcpy(monsterList[10].monName, "山贼头领·黑风");
    monsterList[10].hp = 400;
    monsterList[10].maxHp = 400;
    monsterList[10].attack = 55;
    monsterList[10].defense = 22;
    monsterList[10].exp = 200;
    monsterList[10].gold = 150;
    monsterList[10].level = 10;
    monsterList[10].isBoss = true;
    monsterList[10].dropItem = 7;

    // Boss2 毒沼之王
    strcpy(monsterList[11].monName, "毒沼之王·腐鳞");
    monsterList[11].hp = 600;
    monsterList[11].maxHp = 600;
    monsterList[11].attack = 68;
    monsterList[11].defense = 28;
    monsterList[11].exp = 350;
    monsterList[11].gold = 260;
    monsterList[11].level = 12;
    monsterList[11].isBoss = true;
    monsterList[11].dropItem = 5;

    // Boss3 亡灵领主
    strcpy(monsterList[12].monName, "亡灵领主·噬魂");
    monsterList[12].hp = 850;
    monsterList[12].maxHp = 850;
    monsterList[12].attack = 82;
    monsterList[12].defense = 35;
    monsterList[12].exp = 520;
    monsterList[12].gold = 400;
    monsterList[12].level = 14;
    monsterList[12].isBoss = true;
    monsterList[12].dropItem = 6;

    // Boss4 熔岩巨龙
    strcpy(monsterList[13].monName, "熔岩巨龙·炎狱");
    monsterList[13].hp = 1200;
    monsterList[13].maxHp = 1200;
    monsterList[13].attack = 105;
    monsterList[13].defense = 45;
    monsterList[13].exp = 800;
    monsterList[13].gold = 666;
    monsterList[13].level = 18;
    monsterList[13].isBoss = true;
    monsterList[13].dropItem = 7;

    // 终极Boss 武林魔尊
    strcpy(monsterList[14].monName, "武林魔尊·天煞");
    monsterList[14].hp = 2000;
    monsterList[14].maxHp = 2000;
    monsterList[14].attack = 150;
    monsterList[14].defense = 60;
    monsterList[14].exp = 1500;
    monsterList[14].gold = 1200;
    monsterList[14].level = 25;
    monsterList[14].isBoss = true;
    monsterList[14].dropItem = 7;
}

void InitTask()
{
    // 任务1 猎杀野狼
    strcpy(hero.task[0].taskName, "猎杀荒野野狼");
    strcpy(hero.task[0].taskDesc, "击杀10只荒野野狼,维护村庄安全");
    hero.task[0].needKill = 10;
    hero.task[0].nowKill = 0;
    hero.task[0].targetMon = 0;
    hero.task[0].rewardExp = 100;
    hero.task[0].rewardGold = 50;
    hero.task[0].isAccept = false;
    hero.task[0].isFinish = false;

    // 任务2 清除毒蛛
    strcpy(hero.task[1].taskName, "清除剧毒蜘蛛");
    strcpy(hero.task[1].taskDesc, "森林深处毒蛛泛滥,消灭12只");
    hero.task[1].needKill = 12;
    hero.task[1].nowKill = 0;
    hero.task[1].targetMon = 1;
    hero.task[1].rewardExp = 150;
    hero.task[1].rewardGold = 80;
    hero.task[1].isAccept = false;
    hero.task[1].isFinish = false;

    // 任务3 剿灭山贼
    strcpy(hero.task[2].taskName, "剿灭拦路山贼");
    strcpy(hero.task[2].taskDesc, "剿灭沿路山贼8名,保护商旅");
    hero.task[2].needKill = 8;
    hero.task[2].nowKill = 0;
    hero.task[2].targetMon = 2;
    hero.task[2].rewardExp = 220;
    hero.task[2].rewardGold = 120;
    hero.task[2].isAccept = false;
    hero.task[2].isFinish = false;

    // 任务4 猎杀猛虎
    strcpy(hero.task[3].taskName, "猎杀丛林猛虎");
    strcpy(hero.task[3].taskDesc, "猎杀凶猛猛虎5只,获取虎皮");
    hero.task[3].needKill = 5;
    hero.task[3].nowKill = 0;
    hero.task[3].targetMon = 3;
    hero.task[3].rewardExp = 300;
    hero.task[3].rewardGold = 180;
    hero.task[3].isAccept = false;
    hero.task[3].isFinish = false;

    // 任务5 **黑风头领
    strcpy(hero.task[4].taskName, "**山贼Boss");
    strcpy(hero.task[4].taskDesc, "击败山贼头领黑风,根除山贼隐患");
    hero.task[4].needKill = 1;
    hero.task[4].nowKill = 0;
    hero.task[4].targetMon = 10;
    hero.task[4].rewardExp = 500;
    hero.task[4].rewardGold = 350;
    hero.task[4].isAccept = false;
    hero.task[4].isFinish = false;

    // 任务6 清理亡灵
    strcpy(hero.task[5].taskName, "清理亡灵武士");
    strcpy(hero.task[5].taskDesc, "古墓亡灵作乱,斩杀10名亡灵武士");
    hero.task[5].needKill = 10;
    hero.task[5].nowKill = 0;
    hero.task[5].targetMon = 5;
    hero.task[5].rewardExp = 420;
    hero.task[5].rewardGold = 260;
    hero.task[5].isAccept = false;
    hero.task[5].isFinish = false;

    // 任务7 斩杀熔岩蜥蜴
    strcpy(hero.task[6].taskName, "斩杀熔岩异兽");
    strcpy(hero.task[6].taskDesc, "火山地带蜥蜴肆虐,斩杀7只");
    hero.task[6].needKill = 7;
    hero.task[6].nowKill = 0;
    hero.task[6].targetMon = 6;
    hero.task[6].rewardExp = 480;
    hero.task[6].rewardGold = 320;
    hero.task[6].isAccept = false;
    hero.task[6].isFinish = false;

    // 任务8 **武林魔尊
    strcpy(hero.task[7].taskName, "终极宿命之战");
    strcpy(hero.task[7].taskDesc, "击败最终Boss武林魔尊,拯救江湖");
    hero.task[7].needKill = 1;
    hero.task[7].nowKill = 0;
    hero.task[7].targetMon = 14;
    hero.task[7].rewardExp = 3000;
    hero.task[7].rewardGold = 2000;
    hero.task[7].isAccept = false;
    hero.task[7].isFinish = false;
}

void InitPlayer()
{
    strcpy(hero.name, "江湖少侠");
    hero.level = 1;
    hero.hp = 100;
    hero.maxHp = 100;
    hero.mp = 50;
    hero.maxMp = 50;
    hero.attack = 15;
    hero.defense = 8;
    hero.exp = 0;
    hero.needExp = 50;
    hero.gold = 100;
    hero.positionX = 5;
    hero.positionY = 5;
    hero.buffAtk = 0;
    hero.buffDef = 0;
    hero.buffRound = 0;

    InitSkill();
    InitItem();
    InitTask();
}

void InitMap()
{
    // 全部初始化为空地
    for (int i = 0; i < MAP_SIZE; i++)
    {
        for (int j = 0; j < MAP_SIZE; j++)
        {
            worldMap.grid[i][j] = GRID_EMPTY;
            worldMap.isExplore[i][j] = false;
            worldMap.monIndex[i][j] = -1;
        }
    }

    // 固定特殊格子
    worldMap.grid[5][5] = GRID_SAVE;
    worldMap.isExplore[5][5] = true;

    worldMap.grid[2][3] = GRID_SHOP;
    worldMap.grid[7][8] = GRID_TREASURE;
    worldMap.grid[1][1] = GRID_BOSS;
    worldMap.grid[8][2] = GRID_TRAP;

    // 随机生成怪物点
    for (int i = 0; i < 15; i++)
    {
        int x = RandomInt(0, MAP_SIZE - 1);
        int y = RandomInt(0, MAP_SIZE - 1);
        if (worldMap.grid[x][y] == GRID_EMPTY)
        {
            worldMap.grid[x][y] = GRID_MONSTER;
            worldMap.monIndex[x][y] = RandomInt(0, 9);
        }
    }
}

void InitGame()
{
    srand((unsigned int)time(NULL));
    InitPlayer();
    InitMonster();
    InitMap();
    gameDay = 1;
}

void ShowStartMenu()
{
    ClearScreen();
    cout << "========================================" << endl;
    cout << "        武侠江湖冒险游戏 V1.0           " << endl;
    cout << "========================================" << endl;
    cout << "  1. 开始新游戏" << endl;
    cout << "  2. 读取存档" << endl;
    cout << "  3. 游戏说明" << endl;
    cout << "  4. 退出游戏" << endl;
    cout << "========================================" << endl;
    cout << "请输入选择:";
    int op;
    cin >> op;
    switch (op)
    {
        case 1:
            InitGame();
            ShowMainMenu();
            break;
        case 2:
            if (LoadGame() == SAVE_OK)
            {
                cout << "存档读取成功!" << endl;
                SleepTime(1000);
                ShowMainMenu();
            }
            else
            {
                cout << "暂无存档文件!" << endl;
                SleepTime(1500);
                ShowStartMenu();
            }
            break;
        case 3:
            ClearScreen();
            cout << "【游戏说明】" << endl;
            cout << "1. 方向键WASD移动探索地图" << endl;
            cout << "2. 击杀怪物获得经验、金币、材料" << endl;
            cout << "3. 升级解锁更强技能,提升属**" << endl;
            cout << "4. 商店购买药品道具,提升生存能力" << endl;
            cout << "5. 接取任务完成可获得大量奖励" << endl;
            cout << "6. 地图存档点可手动保存游戏进度" << endl;
            cout << "7. **Boss获取极品装备与大量资源" << endl;
            cout << "----------------------------------------" << endl;
            cout << "按回车键返回主菜单...";
            getchar();
            getchar();
            ShowStartMenu();
            break;
        case 4:
            gameRun = false;
            cout << "感谢游玩,江湖再会!" << endl;
            break;
        default:
            cout << "输入错误,请重新选择!" << endl;
            SleepTime(1000);
            ShowStartMenu();
            break;
    }
}

void ShowMainMenu()
{
    while (gameRun)
    {
        ClearScreen();
        cout << "========== 武侠江湖 | 第" << gameDay << "天 ==========" << endl;
        cout << "1.角色信息  2.背包物品  3.技能列表  4.任务面板" << endl;
        cout << "5.地图探索  6.商店交易  7.原地休息  8.手动存档" << endl;
        cout << "9.返回标题栏" << endl;
        cout << "========================================" << endl;
        cout << "请输入操作序号:";
        int op;
        cin >> op;
        switch (op)
        {
            case 1:
                ShowPlayerInfo();
                break;
            case 2:
                ShowBag();
                break;
            case 3:
                ShowSkillList();
                break;
            case 4:
                ShowTaskList();
                break;
            case 5:
                ShowMap();
                break;
            case 6:
                ShowShop();
                break;
            case 7:
                RecoverHPMP();
                gameDay++;
                cout << "你原地打坐休息,体力内力完全恢复!" << endl;
                cout << "天数流逝,当前:第" << gameDay << "天" << endl;
                cout << "按回车继续...";
                getchar();getchar();
                break;
            case 8:
                if (SaveGame() == SAVE_OK)
                {
                    cout << "游戏存档成功!" << endl;
                }
                else
                {
                    cout << "存档失败!" << endl;
                }
                SleepTime(1200);
                break;
            case 9:
                ShowStartMenu();
                return;
            default:
                cout << "输入无效,请重新选择!" << endl;
                SleepTime(800);
                break;
        }
    }
}

void ShowPlayerInfo()
{
    ClearScreen();
    cout << "========== 角色属**面板 ==========" << endl;
    cout << "角色名称:" << hero.name << endl;
    cout << "当前等级:Lv." << hero.level << endl;
    cout << "经验值:" << hero.exp << " / " << hero.needExp << endl;
    cout << "生命值:" << hero.hp << " / " << hero.maxHp << endl;
    cout << "内力值:" << hero.mp << " / " << hero.maxMp << endl;
    cout << "攻击力:" << hero.attack + hero.buffAtk << endl;
    cout << "防御力:" << hero.defense + hero.buffDef << endl;
    cout << "持有金币:" << hero.gold << " 枚" << endl;
    cout << "增益回合:" << hero.buffRound << " 回合" << endl;
    cout << "==================================" << endl;
    cout << "按回车键返回...";
    getchar();getchar();
}

void ShowSkillList()
{
    ClearScreen();
    cout << "========== 武学技能列表 ==========" << endl;
    for (int i = 0; i < MAX_SKILL; i++)
    {
        cout << i + 1 << "." << hero.skill[i].skillName;
        if (hero.skill[i].isUnlock)
        {
            cout << "【已解锁】";
        }
        else
        {
            cout << "【未解锁-等级" << hero.skill[i].unlockLevel << "解锁】";
        }
        cout << endl;
        cout << "   伤害:" << hero.skill[i].damage
             << "  耗蓝:" << hero.skill[i].mpCost << endl;
    }
    cout << "==================================" << endl;
    cout << "按回车键返回...";
    getchar();getchar();
}

void ShowBag()
{
    ClearScreen();
    cout << "========== 背包物品栏 ==========" << endl;
    int num = 0;
    for (int i = 0; i < MAX_ITEM; i++)
    {
        if (hero.bag[i].count > 0)
        {
            num++;
            cout << num << "." << hero.bag[i].itemName
                 << "  x" << hero.bag[i].count << endl;
        }
    }
    if (num == 0)
    {
        cout << "背包空空如也,快去探索收集物资吧!" << endl;
    }
    cout << "------------------------------" << endl;
    cout << "1.使用物品  2.返回上一级" << endl;
    cout << "请选择:";
    int op;
    cin >> op;
    if (op == 1)
    {
        PlayerUseItem();
    }
}

void ShowTaskList()
{
    ClearScreen();
    cout << "========== 江湖任务列表 ==========" << endl;
    for (int i = 0; i < MAX_TASK; i++)
    {
        cout << i + 1 << "." << hero.task[i].taskName;
        if (hero.task[i].isFinish)
        {
            cout << "【已完成】";
        }
        else if (hero.task[i].isAccept)
        {
            cout << "【进行中】" << hero.task[i].nowKill
                 << "/" << hero.task[i].needKill;
        }
        else
        {
            cout << "【可接取】";
        }
        cout << endl;
    }
    cout << "--------------------------------" << endl;
    cout << "请输入任务序号操作(0返回):";
    int tid;
    cin >> tid;
    if (tid >= 1 && tid <= MAX_TASK)
    {
        tid--;
        if (!hero.task[tid].isAccept && !hero.task[tid].isFinish)
        {
            AcceptTask(tid);
        }
        else if (hero.task[tid].isAccept && hero.task[tid].nowKill >= hero.task[tid].needKill)
        {
            SubmitTask(tid);
        }
        else
        {
            cout << "当前无法操作该任务!" << endl;
            SleepTime(1000);
        }
    }
}

void AcceptTask(int tid)
{
    hero.task[tid].isAccept = true;
    cout << "成功接取任务:" << hero.task[tid].taskName << endl;
    cout << "任务描述:" << hero.task[tid].taskDesc << endl;
    SleepTime(1500);
}

void SubmitTask(int tid)
{
    hero.exp += hero.task[tid].rewardExp;
    hero.gold += hero.task[tid].rewardGold;
    hero.task[tid].isFinish = true;
    hero.task[tid].isAccept = false;
    cout << "任务完成!奖励**成功!" << endl;
    cout << "获得经验:" << hero.task[tid].rewardExp << endl;
    cout << "获得金币:" << hero.task[tid].rewardGold << endl;
    LevelUp();
    SleepTime(1500);
}

void UpdateTaskKill(int monID)
{
    for (int i = 0; i < MAX_TASK; i++)
    {
        if (hero.task[i].isAccept && hero.task[i].targetMon == monID && !hero.task[i].isFinish)
        {
            hero.task[i].nowKill++;
        }
    }
}

void ShowShop()
{
    ClearScreen();
    cout << "========== 江湖杂货铺 ==========" << endl;
    cout << "当前金币:" << hero.gold << endl;
    cout << "1.低级回血丹  15金币" << endl;
    cout << "2.低级回蓝丹  12金币" << endl;
    cout << "3.力量增幅药剂 35金币" << endl;
    cout << "4.铁皮防御药剂 32金币" << endl;
    cout << "5.中级回血丹  45金币" << endl;
    cout << "6.高级回血丹  88金币" << endl;
    cout << "7.精钢护甲    120金币" << endl;
    cout << "0.离开商店" << endl;
    cout << "--------------------------------" << endl;
    cout << "请输入购买编号:";
    int id;
    cin >> id;
    if (id >= 1 && id <= 7)
    {
        BuyItem(id - 1);
    }
}

void BuyItem(int id)
{
    if (hero.gold >= hero.bag[id].price)
    {
        hero.gold -= hero.bag[id].price;
        hero.bag[id].count++;
        cout << "购买成功!获得:" << hero.bag[id].itemName << endl;
    }
    else
    {
        cout << "金币不足,无法购买!" << endl;
    }
    SleepTime(1000);
}

void PlayerUseItem()
{
    ClearScreen();
    cout << "选择要使用的物品序号(0返回):";
    int id;
    cin >> id;
    if (id > 0 && id <= MAX_ITEM)
    {
        UseItem(id - 1);
    }
}

void UseItem(int id)
{
    if (hero.bag[id].count <= 0)
    {
        cout << "该物品数量不足!" << endl;
        SleepTime(800);
        return;
    }
    switch (hero.bag[id].type)
    {
        case 1:
            hero.hp += hero.bag[id].value;
            if (hero.hp > hero.maxHp) hero.hp = hero.maxHp;
            cout << "使用" << hero.bag[id].itemName
                 << ",恢复生命" << hero.bag[id].value << "点!" << endl;
            break;
        case 2:
            hero.mp += hero.bag[id].value;
            if (hero.mp > hero.maxMp) hero.mp = hero.maxMp;
            cout << "使用" << hero.bag[id].itemName
                 << ",恢复内力" << hero.bag[id].value << "点!" << endl;
            break;
        case 3:
            AddBuff(hero.bag[id].value, 0, 5);
            cout << "力量提升!5回合内攻击+" << hero.bag[id].value << endl;
            break;
        case 4:
            AddBuff(0, hero.bag[id].value, 5);
            cout << "防御提升!5回合内防御+" << hero.bag[id].value << endl;
            break;
        default:
            cout << "该物品无法直接使用!" << endl;
            return;
    }
    hero.bag[id].count--;
    SleepTime(1200);
}

void AddBuff(int atk, int def, int round)
{
    hero.buffAtk += atk;
    hero.buffDef += def;
    hero.buffRound = round;
}

void ClearBuff()
{
    if (hero.buffRound > 0)
    {
        hero.buffRound--;
        if (hero.buffRound <= 0)
        {
            hero.buffAtk = 0;
            hero.buffDef = 0;
        }
    }
}

void ShowMap()
{
    ClearScreen();
    cout << "===== 江湖大地图 | W上 S下 A左 D右 =====" << endl;
    for (int i = 0; i < MAP_SIZE; i++)
    {
        for (int j = 0; j < MAP_SIZE; j++)
        {
            if (i == hero.positionX && j == hero.positionY)
            {
                cout << "【人】";
                worldMap.isExplore[i][j] = true;
            }
            else if (!worldMap.isExplore[i][j])
            {
                cout << "【?】";
            }
            else
            {
                switch (worldMap.grid[i][j])
                {
                    case GRID_EMPTY: cout << "【·】"; break;
                    case GRID_MONSTER: cout << "【怪】"; break;
                    case GRID_TREASURE: cout << "【宝】"; break;
                    case GRID_SHOP: cout << "【店】"; break;
                    case GRID_SAVE: cout << "【存】"; break;
                    case GRID_BOSS: cout << "【王】"; break;
                    case GRID_TRAP: cout << "【陷】"; break;
                }
            }
        }
        cout << endl;
    }
    cout << "========================================" << endl;
    cout << "请输入移动方向(W/A/S/D),Q退出探索:";
    char dir;
    cin >> dir;
    MovePlayer(dir);
}

void MovePlayer(int dir)
{
    int x = hero.positionX;
    int y = hero.positionY;
    switch (dir)
    {
        case 'W':case 'w': x--; break;
        case 'S':case 's': x++; break;
        case 'A':case 'a': y--; break;
        case 'D':case 'd': y++; break;
        case 'Q':case 'q': return;
        default:
            cout << "输入错误!" << endl;
            SleepTime(800);
            return;
    }
    // 边界判断
    if (x < 0 || x >= MAP_SIZE || y < 0 || y >= MAP_SIZE)
    {
        cout << "前方已是地图边界,无法通行!" << endl;
        SleepTime(800);
        return;
    }
    hero.positionX = x;
    hero.positionY = y;
    worldMap.isExplore[x][y] = true;
    // 判断格子事件
    switch (worldMap.grid[x][y])
    {
        case GRID_MONSTER:
            Battle(worldMap.monIndex[x][y]);
            break;
        case GRID_TREASURE:
            OpenTreasure();
            break;
        case GRID_SHOP:
            ShowShop();
            break;
        case GRID_SAVE:
            cout << "你到达存档点,是否存档?(1是 0否):";
            int s;
            cin >> s;
            if (s == 1) SaveGame();
            break;
        case GRID_BOSS:
            BossBattle();
            break;
        case GRID_TRAP:
            StepTrap();
            break;
        default:
            RandomEvent();
            break;
    }
}

void OpenTreasure()
{
    ClearScreen();
    cout << "你发现一处隐藏宝箱!" << endl;
    int goldGet = RandomInt(30, 120);
    int itemRan = RandomInt(0, 7);
    hero.gold += goldGet;
    hero.bag[itemRan].count++;
    cout << "获得金币x" << goldGet << endl;
    cout << "获得道具:" << hero.bag[itemRan].itemName << endl;
    worldMap.grid[hero.positionX][hero.positionY] = GRID_EMPTY;
    SleepTime(1500);
}

void StepTrap()
{
    int hurt = RandomInt(15, 40);
    hero.hp -= hurt;
    cout << "你踏入陷阱!受到" << hurt << "点伤害!" << endl;
    worldMap.grid[hero.positionX][hero.positionY] = GRID_EMPTY;
    SleepTime(1200);
    if (hero.hp <= 0)
    {
        cout << "你被陷阱重伤倒地,返回安全区域..." << endl;
        hero.hp = hero.maxHp / 2;
        hero.positionX = 5;
        hero.positionY = 5;
        SleepTime(1500);
    }
}

void RandomEvent()
{
    int r = RandomInt(1, 100);
    if (r <= 15)
    {
        int addHp = RandomInt(10, 30);
        hero.hp += addHp;
        if (hero.hp > hero.maxHp) hero.hp = hero.maxHp;
        cout << "偶遇灵泉,恢复生命" << addHp << "点!" << endl;
        SleepTime(800);
    }
    else if (r <= 25)
    {
        int addGold = RandomInt(10, 25);
        hero.gold += addGold;
        cout << "捡到散落银两,获得" << addGold << "金币!" << endl;
        SleepTime(800);
    }
}

void CalculateDamage(int atk, int def, int& hurt)
{
    hurt = atk - def;
    if (hurt < 1) hurt = 1;
    // 暴击判定 10%暴击
    if (RandomBool(10))
    {
        hurt *= 2;
        cout << "暴击!";
    }
}

void Battle(int monID)
{
    ClearScreen();
    Monster& m = monsterList[monID];
    cout << "========== 战斗开始 ==========" << endl;
    cout << "敌方:" << m.monName << " Lv." << m.level << endl;
    while (m.hp > 0 && hero.hp > 0)
    {
        ClearScreen();
        cout << "【" << m.monName << "】 HP:" << m.hp << "/" << m.maxHp << endl;
        cout << "【玩家】 HP:" << hero.hp << "/" << hero.maxHp
             << " MP:" << hero.mp << "/" << hero.maxMp << endl;
        cout << "-----------------------------" << endl;
        cout << "1.普通攻击  2.释放技能  3.使用道具  4.撤退" << endl;
        cout << "请选择战斗操作:";
        int op;
        cin >> op;
        switch (op)
        {
            case 1:
                PlayerAttack(monID);
                break;
            case 2:
                PlayerUseSkill(monID);
                break;
            case 3:
                PlayerUseItem();
                break;
            case 4:
                cout << "你选择撤退,逃离战斗!" << endl;
                SleepTime(1000);
                return;
            default:
                cout << "操作无效!" << endl;
                SleepTime(500);
                break;
        }
        if (m.hp <= 0) break;
        MonsterAttack(monID);
        ClearBuff();
    }
    // 战斗结算
    if (hero.hp <= 0)
    {
        cout << "你被" << m.monName << "击败了..." << endl;
        cout << "自动返回存档点复活,损失少量金币" << endl;
        hero.hp = hero.maxHp / 2;
        hero.mp = hero.maxMp / 2;
        hero.gold = hero.gold * 0.8;
        hero.positionX = 5;
        hero.positionY = 5;
    }
    else
    {
        cout << "战斗胜利!成功击杀" << m.monName << endl;
        cout << "获得经验:" << m.exp << "  获得金币:" << m.gold << endl;
        hero.exp += m.exp;
        hero.gold += m.gold;
        UpdateTaskKill(monID);
        // 掉落物品
        if (RandomBool(40))
        {
            hero.bag[m.dropItem].count++;
            cout << "掉落物品:" << hero.bag[m.dropItem].itemName << endl;
        }
        LevelUp();
    }
    // 怪物血量重置
    m.hp = m.maxHp;
    SleepTime(2000);
}

void PlayerAttack(int monID)
{
    int hurt;
    int atk = hero.attack + hero.buffAtk;
    int def = monsterList[monID].defense;
    CalculateDamage(atk, def, hurt);
    monsterList[monID].hp -= hurt;
    cout << "你发动普通攻击,造成" << hurt << "点伤害!" << endl;
    SleepTime(800);
}

void PlayerUseSkill(int monID)
{
    ClearScreen();
    cout << "===== 选择技能 =====" << endl;
    for (int i = 0; i < MAX_SKILL; i++)
    {
        if (hero.skill[i].isUnlock)
        {
            cout << i + 1 << "." << hero.skill[i].skillName
                 << " 耗蓝:" << hero.skill[i].mpCost << endl;
        }
    }
    cout << "请输入技能编号:";
    int sid;
    cin >> sid;
    sid--;
    if (sid < 0 || sid >= MAX_SKILL || !hero.skill[sid].isUnlock)
    {
        cout << "技能未解锁或输入无效!" << endl;
        SleepTime(1000);
        return;
    }
    if (hero.mp < hero.skill[sid].mpCost)
    {
        cout << "内力不足,无法释放该技能!" << endl;
        SleepTime(1000);
        return;
    }
    // 治疗技能特殊处理
    if (hero.skill[sid].type == 4)
    {
        hero.hp += hero.skill[sid].damage;
        if (hero.hp > hero.maxHp) hero.hp = hero.maxHp;
        cout << "你使用" << hero.skill[sid].skillName << ",恢复生命" << hero.skill[sid].damage << "点!" << endl;
    }
    else
    {
        int hurt;
        int atk = hero.attack + hero.buffAtk + hero.skill[sid].damage;
        int def = monsterList[monID].defense;
        CalculateDamage(atk, def, hurt);
        monsterList[monID].hp -= hurt;
        cout << "你释放" << hero.skill[sid].skillName << ",造成" << hurt << "点伤害!" << endl;
    }
    hero.mp -= hero.skill[sid].mpCost;
    SleepTime(1200);
}

void MonsterAttack(int monID)
{
    Monster& m = monsterList[monID];
    int hurt;
    int atk = m.attack;
    int def = hero.defense + hero.buffDef;
    CalculateDamage(atk, def, hurt);
    hero.hp -= hurt;
    cout << m.monName << "发动攻击,造成" << hurt << "点伤害!" << endl;
    SleepTime(1000);
}

void BossBattle()
{
    ClearScreen();
    cout << "警告!前方出现终极BOSS,是否**?(1是 0否):";
    int op;
    cin >> op;
    if (op == 1)
    {
        Battle(14); // **最终BOSS武林魔尊
    }
}

void LevelUp()
{
    while (hero.exp >= hero.needExp)
    {
        hero.exp -= hero.needExp;
        hero.level++;
        // 升级属**提升
        hero.maxHp += 25;
        hero.maxMp += 15;
        hero.attack += 8;
        hero.defense += 5;
        // 满血满蓝
        hero.hp = hero.maxHp;
        hero.mp = hero.maxMp;
        // 升级所需经验提升
        hero.needExp = hero.needExp * 1.5;
        cout << "恭喜你升级!当前等级:Lv." << hero.level << endl;
        // 解锁技能
        for (int i = 0; i < MAX_SKILL; i++)
        {
            if (hero.level >= hero.skill[i].unlockLevel && !hero.skill[i].isUnlock)
            {
                hero.skill[i].isUnlock = true;
                cout << "解锁新技能:" << hero.skill[i].skillName << endl;
            }
        }
        SleepTime(1500);
    }
}

void RecoverHPMP()
{
    hero.hp = hero.maxHp;
    hero.mp = hero.maxMp;
    hero.buffAtk = 0;
    hero.buffDef = 0;
    hero.buffRound = 0;
}

// 存档函数(简化实现)
int SaveGame()
{
    ofstream out("save.dat", ios::binary);
    if (!out) return SAVE_FAIL;
    out.write((char*)&hero, sizeof(Player));
    out.close();
    return SAVE_OK;
}

// 读档函数(简化实现)
int LoadGame()
{
    ifstream in("save.dat", ios::binary);
    if (!in) return SAVE_FAIL;
    in.read((char*)&hero, sizeof(Player));
    in.close();
    return SAVE_OK;
}

// 主函数
int main()
{
    ShowStartMenu();
    return 0;
}
 


0
郭宸熹
郭宸熹
修练者
修练者

地图操作(重点)

  • W 往上走
  • S 往下走
  • A 往左走
  • D 往右走
  • Q 退出地图

随便按 WASD 走动,踩到【怪】直接进战斗~

0
0
0
我要回答