• 个人简介

    #include <bits/stdc++.h> #include <windows.h> #include <ctime> #include <limits> using namespace std;

    const double DEFAULT_SLEEP_TIME = 1.2; const int DEFAULT_COLOR = 15; const int MAX_ITEMS = 10; const int MAX_TASKS = 10; // 最大任务数量

    // 玩家属性结构体 struct Player { long long silver; long long combat; long long speed; string name; bool has_map; bool has_eye; bool has_yinyang; string items[MAX_ITEMS]; int item_count; };

    // 任务结构体 struct Task { string name; // 任务名称 string desc; // 任务描述 string reward_desc; // 奖励描述 long long reward_silver; // 奖励银子 long long reward_combat; // 奖励战力 long long reward_speed; // 奖励速度 string reward_item; // 奖励道具 bool is_completed; // 是否完成 bool is_received; // 是否领取 };

    // 商店道具结构体 struct ShopItem { string name; long long price; string desc; };

    Player player; Task tasks[MAX_TASKS]; // 任务列表 int task_count = 0; // 当前任务数量

    ShopItem shop_items[] = { {"千年人参", 800, "使用后战力+300"}, {"摸金符", 500, "使用后速度+200"}, {"大力丸", 300, "使用后战力+100"}, {"疾风靴", 400, "使用后速度+150"}, {"止血散", 200, "战斗失败后恢复100战力"} }; const int SHOP_ITEM_COUNT = sizeof(shop_items) / sizeof(ShopItem);

    void clean() { system("cls"); } void sleep_seconds(double n) { Sleep(static_cast<DWORD>(n * 1000)); } void set_color(short n) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), n); }

    void init_random() { srand(static_cast<unsigned int>(time(0))); }

    int random_int(int first, int second) { int min_val = min(first, second); int max_val = max(first, second); return rand() % (max_val - min_val + 1) + min_val; }

    void print_random_color(const string& msg) { int color = random_int(9, 14); set_color(color); cout << msg << endl; set_color(DEFAULT_COLOR); }

    void show_attributes() { set_color(11); cout << "================= 玩家属性 =" << endl; set_color(DEFAULT_COLOR); printf("银子:%lld\t战力:%lld\t速度:%lld\n", player.silver, player.combat, player.speed); cout << "特殊能力:"; if (player.has_yinyang) cout << "阴阳轮转 "; if (player.has_eye) cout << "神霄天目 "; if (!player.has_yinyang && !player.has_eye) cout << "无"; cout << endl; cout << "持有道具:"; if (player.item_count == 0) cout << "无"; else for (int i = 0; i < player.item_count; i++) cout << player.items[i] << " "; cout << "\n===========================\n\n"; }

    void add_item(const string& item_name) { if (player.item_count < MAX_ITEMS) { player.items[player.item_count++] = item_name; print_random_color("叮!获得道具:" + item_name); } else { set_color(12); cout << "道具栏已满,无法获得新道具!" << endl; set_color(DEFAULT_COLOR); } }

    void use_item_internal(int idx) { string item = player.items[idx]; if (item == "千年人参") { player.combat += 300; char msg[100]; sprintf(msg, "使用千年人参,战力+300!当前战力:%lld", player.combat); print_random_color(msg); } else if (item == "摸金符") { player.speed += 200; char msg[100]; sprintf(msg, "使用摸金符,速度+200!当前速度:%lld", player.speed); print_random_color(msg); } else if (item == "大力丸") { player.combat += 100; char msg[100]; sprintf(msg, "使用大力丸,战力+100!当前战力:%lld", player.combat); print_random_color(msg); } else if (item == "疾风靴") { player.speed += 150; char msg[100]; sprintf(msg, "使用疾风靴,速度+150!当前速度:%lld", player.speed); print_random_color(msg); } else if (item == "止血散") { player.combat += 100; char msg[100]; sprintf(msg, "使用止血散,战力+100!当前战力:%lld", player.combat); print_random_color(msg); } else if (item == "大荒地图") { set_color(12); cout << "大荒地图无法使用,是探索古墓的必备道具!" << endl; set_color(DEFAULT_COLOR); sleep_seconds(DEFAULT_SLEEP_TIME); return; } else { set_color(13); cout << "该道具暂时无法使用!" << endl; set_color(DEFAULT_COLOR); sleep_seconds(DEFAULT_SLEEP_TIME); return; }

    for (int i = idx; i < player.item_count - 1; i++)
        player.items[i] = player.items[i+1];
    player.item_count--;
    print_random_color("道具已使用!");
    sleep_seconds(DEFAULT_SLEEP_TIME);
    

    }

    void item_management() { while (true) { clean(); set_color(13); cout << "\n\n\t\t【道具管理】\n\n"; set_color(DEFAULT_COLOR); cout << "当前银子:" << player.silver << "两\n\n"; cout << "【我的道具】\n"; if (player.item_count == 0) cout << "暂无道具\n"; else for (int i = 0; i < player.item_count; i++) cout << i+1 << ". " << player.items[i] << endl;

    cout << "\n【操作选项】\n1. 使用道具\n2. 返回主菜单\n请选择操作(1-2):";
        int choice;
        while (!(cin >> choice) || choice <1 || choice>2) {
            cin.clear(); cin.ignore(1e9,'\n');
            set_color(12); cout << "输入无效!请输入1或2:"; set_color(DEFAULT_COLOR);
        }
        if (choice ==2) break;
    
        if (player.item_count ==0) {
            set_color(12); cout << "\n没有道具可使用!" << endl; set_color(DEFAULT_COLOR);
            sleep_seconds(DEFAULT_SLEEP_TIME); continue;
        }
    
        cout << "\n请选择要使用的道具编号(0返回):";
        int item_choice;
        while (!(cin >> item_choice) || item_choice <0 || item_choice > player.item_count) {
            cin.clear(); cin.ignore(1e9,'\n');
            set_color(12); cout << "输入无效!请输入0-" << player.item_count << ":"; set_color(DEFAULT_COLOR);
        }
        if (item_choice ==0) continue;
        use_item_internal(item_choice -1);
    }
    

    }

    void shop_system() { while (true) { clean(); set_color(10); cout << "\n\n\t\t【大荒杂货铺】\n\n"; set_color(DEFAULT_COLOR); cout << "当前银子:" << player.silver << "两\n\n"; cout << "【出售道具】\n"; for (int i=0; i<SHOP_ITEM_COUNT; i++) cout << i+1 << ". " << shop_items[i].name << " - " << shop_items[i].price << "两 (" << shop_items[i].desc << ")\n";

    cout << "\n" << SHOP_ITEM_COUNT+1 << ". 返回主菜单\n请选择(" << SHOP_ITEM_COUNT+1 << "返回):";
        int choice;
        while (!(cin >> choice) || choice <1 || choice > SHOP_ITEM_COUNT+1) {
            cin.clear(); cin.ignore(1e9,'\n');
            set_color(12); cout << "输入无效!1-" << SHOP_ITEM_COUNT+1 << ":"; set_color(DEFAULT_COLOR);
        }
        if (choice == SHOP_ITEM_COUNT+1) break;
    
        ShopItem& it = shop_items[choice-1];
        if (player.silver >= it.price) {
            player.silver -= it.price;
            char msg[100];
            sprintf(msg, "花费%lld两购买%s!剩余:%lld", it.price, it.name.c_str(), player.silver);
            print_random_color(msg);
            add_item(it.name);
        } else {
            set_color(12); cout << "\n银子不足!" << endl; set_color(DEFAULT_COLOR);
        }
        sleep_seconds(DEFAULT_SLEEP_TIME);
    }
    

    }

    // ===================== 【任务系统】 ===================== // 初始化任务 void init_tasks() { task_count = 4;

    // 主线任务1
    tasks[0] = {
        "初次探索",
        "完成一次古墓探索",
        "奖励:银子500,战力200",
        500, 200, 0, "", false, false
    };
    
    // 主线任务2
    tasks[1] = {
        "战胜怪物",
        "在战斗中击败一只古墓怪物",
        "奖励:银子800,道具大力丸",
        800, 0, 0, "大力丸", false, false
    };
    
    // 每日任务1
    tasks[2] = {
        "每日历练",
        "累计探索古墓2次",
        "奖励:银子300,速度100",
        300, 0, 100, "", false, false
    };
    
    // 每日任务2
    tasks[3] = {
        "宝箱猎人",
        "开启一个神秘宝箱",
        "奖励:银子400,战力150",
        400, 150, 0, "", false, false
    };
    

    }

    // 提交任务,领取奖励 void submit_task(int idx) { Task& t = tasks[idx]; if (!t.is_completed) { set_color(12); cout << "任务尚未完成,无法领取奖励!" << endl; set_color(DEFAULT_COLOR); sleep_seconds(DEFAULT_SLEEP_TIME); return; } if (t.is_received) { set_color(13); cout << "已领取过该任务奖励!" << endl; set_color(DEFAULT_COLOR); sleep_seconds(DEFAULT_SLEEP_TIME); return; }

    // 发放奖励
    player.silver += t.reward_silver;
    player.combat += t.reward_combat;
    player.speed += t.reward_speed;
    if (!t.reward_item.empty()) add_item(t.reward_item);
    
    t.is_received = true;
    print_random_color("任务完成!领取奖励成功!");
    sleep_seconds(DEFAULT_SLEEP_TIME);
    

    }

    // 任务主界面 void task_system() { while (true) { clean(); set_color(14); cout << "\n\n\t\t【任务系统】\n\n"; set_color(DEFAULT_COLOR); show_attributes();

    cout << "【可接/已接任务】\n";
        for (int i=0; i<task_count; i++) {
            cout << i+1 << ". " << tasks[i].name << "\n";
            cout << "   描述:" << tasks[i].desc << "\n";
            cout << "   奖励:" << tasks[i].reward_desc << "\n";
            cout << "   状态:";
            if (tasks[i].is_received) cout << "已完成并领奖";
            else if (tasks[i].is_completed) cout << "可领奖";
            else cout << "未完成";
            cout << "\n----------------------------------------\n";
        }
    
        cout << "\n【操作】\n1. 领取任务奖励\n2. 返回主菜单\n请选择(1-2):";
        int c;
        while (!(cin >> c) || c<1 || c>2) {
            cin.clear(); cin.ignore(1e9,'\n');
            set_color(12); cout << "无效输入!:"; set_color(DEFAULT_COLOR);
        }
        if (c ==2) break;
    
        cout << "\n请选择要领奖的任务编号(0返回):";
        int idx;
        while (!(cin >> idx) || idx<0 || idx>task_count) {
            cin.clear(); cin.ignore(1e9,'\n');
            set_color(12); cout << "无效!0-" << task_count << ":"; set_color(DEFAULT_COLOR);
        }
        if (idx ==0) continue;
        submit_task(idx-1);
    }
    

    }

    // 探索完成后自动完成任务 void check_explore_task() { if (!tasks[0].is_completed) tasks[0].is_completed = true; if (!tasks[2].is_completed) tasks[2].is_completed = true; }

    // 击败怪物后完成任务 void check_kill_task() { if (!tasks[1].is_completed) tasks[1].is_completed = true; }

    // 开启宝箱后完成任务 void check_chest_task() { if (!tasks[3].is_completed) tasks[3].is_completed = true; } // ======================================================

    void save_progress() { ofstream f("save_data.txt"); if (f) { f << player.name << endl; f << player.silver << " " << player.combat << " " << player.speed << endl; f << player.has_map << " " << player.has_eye << " " << player.has_yinyang << endl; f << player.item_count << endl; for (int i=0; i<player.item_count; i++) f << player.items[i] << endl;

    // 保存任务
        f << task_count << endl;
        for (int i=0; i<task_count; i++)
            f << tasks[i].is_completed << " " << tasks[i].is_received << endl;
    
        f.close();
        print_random_color("进度保存成功!");
    } else {
        set_color(12); cout << "保存失败!" << endl; set_color(DEFAULT_COLOR);
    }
    sleep_seconds(DEFAULT_SLEEP_TIME);
    

    }

    void load_progress() { ifstream f("save_data.txt"); if (f) { player.item_count =0; f >> player.name; f >> player.silver >> player.combat >> player.speed; f >> player.has_map >> player.has_eye >> player.has_yinyang;

    int n; f >> n;
        for (int i=0; i<n; i++) {
            string it; getline(f>>ws, it);
            if (player.item_count < MAX_ITEMS)
                player.items[player.item_count++] = it;
        }
    
        // 加载任务
        f >> task_count;
        for (int i=0; i<task_count; i++)
            f >> tasks[i].is_completed >> tasks[i].is_received;
    
        f.close();
        print_random_color("进度加载成功!欢迎回来," + player.name + "!");
    } else {
        set_color(12); cout << "无存档!" << endl; set_color(DEFAULT_COLOR);
    }
    sleep_seconds(DEFAULT_SLEEP_TIME);
    

    }

    void event_chest() { set_color(10); cout << "\n你发现了宝箱!" << endl; sleep_seconds(DEFAULT_SLEEP_TIME); check_chest_task(); // 完成宝箱任务

    int t = random_int(1,3);
    if (t==1) {
        int s = random_int(500,2000); player.silver +=s;
        char m[50]; sprintf(m, "获得%d两银子!", s); print_random_color(m);
    } else if (t==2) {
        int c = random_int(200,800); player.combat +=c;
        char m[50]; sprintf(m, "战力+%d!", c); print_random_color(m);
    } else add_item("千年人参");
    sleep_seconds(DEFAULT_SLEEP_TIME);
    

    }

    void event_monster() { set_color(12); string ms[] = {"尸蹩","血尸","粽子","阴兵","螭龙"}; string name = ms[random_int(0,4)]; int c = random_int(300,1500); cout << "\n遇到" << name << "!战力:" << c << endl; sleep_seconds(DEFAULT_SLEEP_TIME);

    cout << "1.战斗 2.逃跑:";
    int ch;
    while (!(cin>>ch)||ch<1||ch>2) {
        cin.clear();cin.ignore(1e9,'\n');
        set_color(12);cout<<"无效!1或2:";set_color(DEFAULT_COLOR);
    }
    
    if (ch==1) {
        cout << "\n战斗中..." << endl; sleep_seconds(1.5);
        if (player.combat >= c) {
            set_color(10); cout << "胜利!击败" << name << endl;
            check_kill_task(); // 完成击杀任务
            int s = random_int(300,1000); player.silver +=s;
            char m[50];sprintf(m,"获得%d两!",s);print_random_color(m);
            if (random_int(1,3)==1) add_item("摸金符");
        } else {
            set_color(12); cout << "失败!" << endl;
            player.silver -=200; if (player.silver <0) player.silver =0;
            cout << "损失200两,剩余:" << player.silver << endl;
    
            bool has = false; int id =-1;
            for (int i=0; i<player.item_count; i++)
                if (player.items[i] == "止血散") { has=1; id=i; break; }
            if (has) {
                player.combat +=100;
                char m[100];sprintf(m,"自动使用止血散,战力+100:%lld",player.combat);
                print_random_color(m);
                for (int i=id; i<player.item_count-1; i++)
                    player.items[i] = player.items[i+1];
                player.item_count--;
            }
        }
    } else {
        if (player.speed >=50) {
            set_color(11);cout<<"成功逃跑!"<<endl;
        } else {
            set_color(12);cout<<"没逃脱!受伤!战力-100"<<endl;
            player.combat -=100; if (player.combat <0) player.combat=0;
        }
    }
    sleep_seconds(DEFAULT_SLEEP_TIME);
    

    }

    void explore_scene() { clean(); set_color(9);cout<<"\n\n\t\t【古墓探索】\n\n";set_color(DEFAULT_COLOR); string sc[] = {"前殿","甬道","耳室","主墓室","藏宝室","陪葬坑"}; string name = sc[random_int(0,5)]; cout << "进入:" << name << endl; sleep_seconds(DEFAULT_SLEEP_TIME);

    check_explore_task(); // 探索任务完成
    
    int e = random_int(1,4);
    switch(e) {
        case 1: event_chest(); break;
        case 2: event_monster(); break;
        case 3:
            set_color(14);cout<<"\n发现壁画!速度+50"<<endl;
            player.speed +=50;
            char m[100];sprintf(m,"当前速度:%lld",player.speed);
            print_random_color(m);
            sleep_seconds(DEFAULT_SLEEP_TIME); break;
        default:
            set_color(13);cout<<"\n空空如也"<<endl;
            sleep_seconds(DEFAULT_SLEEP_TIME); break;
    }
    cout << "\n按回车返回...";
    cin.ignore(); cin.get();
    

    }

    int show_main_menu() { clean(); show_attributes(); set_color(14);cout<<"\t\t【盗墓传奇 - 主菜单】\n\n";set_color(DEFAULT_COLOR); cout << "1. 继续探索\n"; cout << "2. 道具管理\n"; cout << "3. 商店购买\n"; cout << "4. 保存进度\n"; cout << "5. 加载进度\n"; cout << "6. 退出游戏\n"; cout << "7. 任务系统\n"; // 新增 cout << "\n请选择(1-7):";

    int c;
    while (!(cin>>c)||c<1||c>7) {
        cin.clear();cin.ignore(1e9,'\n');
        set_color(12);cout<<"无效!1-7:";set_color(DEFAULT_COLOR);
    }
    return c;
    

    }

    void init_game() { player.silver =0; player.combat=0; player.speed=0; player.has_map=0; player.has_eye=0; player.has_yinyang=0; player.item_count=0;

    init_tasks(); // 初始化任务
    
    cout << endl; sleep_seconds(1);
    set_color(DEFAULT_COLOR); cout << "   盗墓传奇\n"; sleep_seconds(1);
    cout << "作者:xhyqj\n"; sleep_seconds(1);
    cout << "监制:元始天尊\n"; sleep_seconds(1);
    cout << "第一体验者:xhyqj\n"; sleep_seconds(1);
    cout << "支持者:xhmzw\n"; sleep_seconds(1.5);
    
    clean();
    cout << "请输入姓名:"; cin >> player.name;
    cout << "欢迎 " << player.name << "!" << endl;
    sleep_seconds(DEFAULT_SLEEP_TIME);
    
    clean(); show_attributes(); sleep_seconds(DEFAULT_SLEEP_TIME);
    
    cout << "收到大荒信件,是否打开?(T/F):";
    char ch; cin >> ch;
    cin.ignore(1e9,'\n');
    
    if (ch == 'F' || ch == 'f') {
        sleep_seconds(1); cout << "被窃魂符拉入阴间!\n"; sleep_seconds(1);
        cout << "看到老者,是否上前?(T/F):"; cin >> ch;
    
        if (ch == 'F' || ch == 'f') {
            sleep_seconds(1); cout << "魔神出现!\n"; sleep_seconds(1.5);
            clean();
            int col = random_int(9,14); set_color(col);
            cout << "    ▉      ▉                 ▉▉▉▉▉▉▉▉▉▉▉▉ ▉▉▉▉▉▉▉▉▉▉▉\n";
            cout << "   ▉▋    ▉▉▉▉▉▉▉▉▉      ▉        ▉                           ▉\n";
            cout << "  ▉ ▉   ▉       ▉     ▉      ▉         ▉     ▉                 ▉\n";
            cout << " ▉  ▉            ▉            ▉▉▉▉▉  ▉   ▉                ▉\n";
            cout << "     ▉            ▉           ▉ ▉    ▉  ▉ ▉               ▉\n";
            cout << "     ▉       ▉   ▉   ▉     ▉   ▉ ▉    ▉▉                  ▉\n";
            cout << "     ▉      ▉    ▉    ▉         ▉       ▉▋                    ▉\n";
            cout << "     ▉     ▉     ▉     ▉      ▉         ▉        ▉       ▉  ▉\n";
            cout << "     ▉          ▉▉           ▉           ▉▉▉▉▉▉          ▉\n";
            set_color(DEFAULT_COLOR); sleep_seconds(2);
            cout << "\n游戏结束!\n"; exit(0);
        } else {
            sleep_seconds(1); cout << "老者赠予你宝物!\n"; sleep_seconds(1);
            print_random_color("银子+1000,战力+500,速度+100!");
            player.silver +=1000; player.combat +=500; player.speed +=100;
            sleep_seconds(1);
            print_random_color("获得:阴阳轮转"); player.has_yinyang=1;
            sleep_seconds(1);
            print_random_color("获得:神霄天目"); player.has_eye=1;
            sleep_seconds(1);
            print_random_color("获得:大荒地图"); player.has_map=1; add_item("大荒地图");
            sleep_seconds(1);
        }
    } else {
        sleep_seconds(1); cout << "获得地图、银子、功法!\n"; sleep_seconds(1);
        print_random_color("获得大荒地图!"); player.has_map=1; add_item("大荒地图");
        print_random_color("银子+100,战力+500!");
        player.silver +=100; player.combat +=500;
        sleep_seconds(1.5);
    }
    

    }

    void game_loop() { while (true) { int c = show_main_menu(); switch(c) { case 1: if (player.has_map) explore_scene(); else { set_color(12);cout<<"无地图无法探索!"<<endl;set_color(DEFAULT_COLOR); sleep_seconds(1); } break; case 2: item_management(); break; case 3: shop_system(); break; case 4: save_progress(); break; case 5: load_progress(); break; case 6: clean(); set_color(14); cout << "感谢游玩!\n"; set_color(DEFAULT_COLOR); exit(0); case 7: task_system(); break; // 任务 default: break; } } }

    int main() { init_random(); init_game(); game_loop(); return 0; }

  • 通过的题目

  • 最近活动

    This person is lazy and didn't join any contests or homework.
  • 最近编写的题解

题目标签

聪明人游戏
1