问题标题: 酷丁编程:小代码

0
0
已解决
罗豫京
罗豫京
修练者
修练者

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <vector>
#include <windows.h>
#include <iomanip>
#include <algorithm>
#include <limits> // 修复pause缓冲区

using namespace std;

// ===================== 常量定义 =====================
const int MAX_HP = 100;
const int BLACK_MARKET_ENTRY_FEE = 100;

// ===================== 枚举定义 =====================
enum AmmoType {
    AMMO_NONE,
    AMMO_PISTOL,
    AMMO_RIFLE,
    AMMO_SNIPER,
    AMMO_SHOTGUN,
    AMMO_SMG,
    AMMO_ROCKET,
    AMMO_GRENADE
};

enum ArmorType {
    ARMOR_NONE,
    ARMOR_LEATHER,
    ARMOR_GOLD,
    ARMOR_CHAIN,
    ARMOR_IRON,
    ARMOR_DIAMOND,
    ARMOR_NETHERITE
};

// ===================== 结构体定义 =====================
struct Bullet {
    string name;
    AmmoType type;
    int price;
};

struct Gun {
    string name;
    int price;
    int damage;
    int critChance;
    AmmoType ammoType;
    int magSize;
};

struct ArmorSet {
    string name;
    ArmorType type;
    int price;
    int defense;
    int toughness;
};

struct Player {
    int hp;
    int maxHp;
    int gold;
    Gun* currentGun;
    ArmorSet* currentArmor;
    int ammoInventory[7];
    bool hasTotem;    // 是否有不**图腾
    bool totemUsed;   // 本局是否已使用图腾
    int critMultiplier;
};

// 怪物结构体
struct Monster {
    string name;
    int hp;
    int maxHp;
    int atk;
    int defense;
    int rewardGold;
    bool isBoss;
};

// ===================== 全局数据初始化 =====================
// 7类子弹
Bullet bullets[] = {
    {"手枪弹", AMMO_PISTOL, 2},
    {"步枪弹", AMMO_RIFLE, 5},
    {"狙击弹", AMMO_SNIPER, 15},
    {"霰弹", AMMO_SHOTGUN, 8},
    {"冲锋枪弹", AMMO_SMG, 3},
    {"火箭弹", AMMO_ROCKET, 50},
    {"榴弹", AMMO_GRENADE, 40}
};

vector<Gun> gunDatabase = {
    {"木棍", 0, 4, 0, AMMO_NONE, 0},
    {"石剑", 10, 8, 5, AMMO_NONE, 0},
    {"铁剑", 50, 12, 10, AMMO_NONE, 0},
    {"钻石剑", 200, 18, 15, AMMO_NONE, 0},
    {"下界合金剑", 500, 25, 20, AMMO_NONE, 0},
    {"格洛克17", 100, 15, 5, AMMO_PISTOL, 17},
    {"沙漠之鹰", 300, 45, 15, AMMO_PISTOL, 7},
    {"M1911", 150, 20, 8, AMMO_PISTOL, 7},
    {"左轮手枪", 250, 35, 25, AMMO_PISTOL, 6},
    {"MP5", 400, 22, 10, AMMO_SMG, 30},
    {"UZI", 350, 18, 5, AMMO_SMG, 32},
    {"Vector", 600, 25, 12, AMMO_SMG, 33},
    {"P90", 700, 20, 8, AMMO_SMG, 50},
    {"AK-47", 500, 35, 10, AMMO_RIFLE, 30},
    {"M4A1", 550, 32, 12, AMMO_RIFLE, 30},
    {"SCAR-L", 600, 30, 15, AMMO_RIFLE, 30},
    {"Groza", 800, 40, 18, AMMO_RIFLE, 30},
    {"M16A4", 450, 28, 10, AMMO_RIFLE, 30},
    {"FAMAS", 480, 29, 11, AMMO_RIFLE, 25},
    {"AWM", 1500, 100, 50, AMMO_SNIPER, 5},
    {"Kar98k", 800, 75, 30, AMMO_SNIPER, 5},
    {"M24", 1000, 85, 35, AMMO_SNIPER, 5},
    {"VSS", 900, 40, 20, AMMO_SNIPER, 10},
    {"S686", 400, 60, 20, AMMO_SHOTGUN, 2},
    {"S12K", 600, 45, 10, AMMO_SHOTGUN, 5},
    {"DBS", 700, 55, 15, AMMO_SHOTGUN, 14},
    {"RPG-7", 2000, 200, 100, AMMO_ROCKET, 1},
    {"榴弹发射器", 1800, 150, 80, AMMO_GRENADE, 1}
};

vector<ArmorSet> armorDatabase = {
    {"无盔甲", ARMOR_NONE, 0, 0, 0},
    {"皮革套装", ARMOR_LEATHER, 100, 4, 0},
    {"金质套装", ARMOR_GOLD, 150, 6, 0},
    {"链甲套装", ARMOR_CHAIN, 250, 8, 0},
    {"铁质套装", ARMOR_IRON, 500, 12, 1},
    {"钻石套装", ARMOR_DIAMOND, 1500, 16, 2},
    {"下界合金套装", ARMOR_NETHERITE, 3000, 20, 3}
};

// 全局玩家对象(只定义一次)
Player steve;

// ===================== 辅助函数 =====================
void setColor(int colorCode) {
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colorCode);
}

void resetColor() {
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}

int randomNum(int l, int r) {
    return rand() % (r - l + 1) + l;
}

void pause() {
    cin.sync();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cout << "\n按回车键继续...";
    cin.get();
}

// ===================== 核心逻辑函数 =====================
void initGame() {
    srand((unsigned)time(NULL));
    steve.hp = MAX_HP;
    steve.maxHp = MAX_HP;
    steve.gold = 200;
    // 修复指针错误,取容器第一个元素地址
    steve.currentGun = &gunDatabase[0];
    steve.currentArmor = &armorDatabase[0];
    steve.hasTotem = false;
    steve.totemUsed = false;

    for(int i = 0; i < 7; i++) {
        steve.ammoInventory[(AmmoType)i] = 0;
    }
}

void printStatus() {
    system("cls");
    cout << "========================================" << endl;
    cout << "  史蒂夫状态栏" << endl;
    cout << "----------------------------------------" << endl;

    cout << "HP: [";
    int hpPercent = (steve.hp * 20) / steve.maxHp;
    for(int i = 0; i < 20; i++) {
        if(i < hpPercent) {
            setColor(10);
            cout << "=";
        } else {
            setColor(12);
            cout << "-";
        }
    }
    resetColor();
    cout << "] " << steve.hp << "/" << steve.maxHp << endl;

    cout << "金币: " << steve.gold << " G" << endl;
    cout << "当前武器: " << steve.currentGun->name
         << " (伤害:" << steve.currentGun->damage
         << ", 暴击率:" << steve.currentGun->critChance << "%)" << endl;

    if(steve.currentGun->ammoType != AMMO_NONE) {
        cout << "  弹药: " << steve.ammoInventory[steve.currentGun->ammoType] << endl;
    }

    cout << "当前盔甲: " << steve.currentArmor->name
         << " (防御:" << steve.currentArmor->defense
         << ", 韧**:" << steve.currentArmor->toughness << ")" << endl;

    cout << "不**图腾: " << (steve.hasTotem ? "[拥有]" : "[无]") << endl;
    cout << "========================================" << endl;
}

void showMenu() {
    cout << "\n===== 主菜单 =====" << endl;
    cout << "1. 挖矿赚钱 (随机事件)" << endl;
    cout << "2. 军火商店 (买枪/买子弹)" << endl;
    cout << "3. 防具店 (买盔甲)" << endl;
    cout << "4. 黑市入口 (半价/门票100G)" << endl;
    cout << "5. 野外战斗 (普通怪)" << endl;
    cout << "6. BOSS** (唤魔者/掠夺兽)" << endl;
    cout << "7. 休息 (随机福利)" << endl;
    cout << "8. 物品栏/更换装备" << endl;
    cout << "0. 退出游戏" << endl;
    cout << "==================" << endl;
    cout << "请选择: ";
}

float calculateDamageReduction(int defense, int toughness, int incomingDamage) {
    if(defense <= 0) return 0.0f;
    float baseReduction = defense * 0.04f;
    if(baseReduction > 0.8f) baseReduction = 0.8f;
    float toughnessBonus = toughness * 0.02f;
    float finalReduction = baseReduction + toughnessBonus;
    if(finalReduction > 0.9f) finalReduction = 0.9f;
    return finalReduction;
}

void goMine() {
    system("cls");
    cout << "你正在挖掘矿石..." << endl;
    Sleep(1000);
    int event = randomNum(1, 10);
    int goldGain = 0;

    if(event <= 2) {
        cout << "【幸运】发现钻石矿!获得 50 G" << endl;
        goldGain = 50;
    } else if(event <= 5) {
        cout << "【普通】挖到铁矿和煤炭。获得 20 G" << endl;
        goldGain = 20;
    } else if(event == 6) {
        cout << "【意外】挖到了古代遗迹!获得 100 G" << endl;
        goldGain = 100;
    } else if(event == 7) {
        cout << "【危险】遭遇洞穴蜘蛛!受到 10 点伤害" << endl;
        steve.hp -= 10;
        if(steve.hp <= 0) steve.hp = 1;
    } else if(event == 8) {
        cout << "【惊喜】捡到一包子弹!(随机类型)" << endl;
        AmmoType type = (AmmoType)randomNum(0, 6);
        steve.ammoInventory[type] += 10;
        cout << "获得 " << bullets[type].name << " x10" << endl;
    } else {
        cout << "【平凡】只挖到石头。获得 5 G" << endl;
        goldGain = 5;
    }
    steve.gold += goldGain;
    if(goldGain > 0) cout << "金币 + " << goldGain << endl;
    pause();
}

void gunShop(bool isBlackMarket = false) {
    system("cls");
    string shopName = isBlackMarket ? "=== 黑市军火商 ===" : "=== 正规军火店 ===";
    cout << shopName << endl;
    if(isBlackMarket) cout << "(所有商品半价)" << endl;
    cout << "------------------" << endl;

    for(int i = 0; i < gunDatabase.size(); i++) {
        Gun g = gunDatabase[i];
        if(g.name == "木棍") continue;
        int price = isBlackMarket ? g.price / 2 : g.price;
        cout << i + 1 << ". " << g.name
             << " | 伤害:" << g.damage
             << " | 暴击:" << g.critChance << "%"
             << " | 价格:" << price << " G" << endl;
    }
    cout << "0. 返回" << endl;
    cout << "请输入编号购买: ";
    int choice;
    cin >> choice;
    if(choice == 0) return;
    if(choice < 1 || choice > gunDatabase.size()) {
        cout << "无效选择" << endl;
        pause();
        return;
    }
    Gun& target = gunDatabase[choice - 1];
    int price = isBlackMarket ? target.price / 2 : target.price;
    if(steve.gold >= price) {
        steve.gold -= price;
        steve.currentGun = &target;
        cout << "购买成功!装备了 " << target.name << endl;
        if(target.ammoType != AMMO_NONE) {
            int freeAmmo = target.magSize / 2;
            steve.ammoInventory[target.ammoType] += freeAmmo;
            cout << "赠送新手弹药: " << bullets[target.ammoType].name << " x" << freeAmmo << endl;
        }
    } else {
        cout << "金币不足!" << endl;
    }
    pause();
}

void ammoShop(bool isBlackMarket = false) {
    system("cls");
    string shopName = isBlackMarket ? "=== 黑市弹药库 ===" : "=== 弹药补给站 ===";
    cout << shopName << endl;
    if(isBlackMarket) cout << "(所有商品半价)" << endl;
    for(int i = 0; i < 7; i++) {
        Bullet b = bullets[i];
        int price = isBlackMarket ? b.price / 2 : b.price;
        cout << i + 1 << ". " << b.name
             << " | 单价:" << price << " G"
             << " | 持有:" << steve.ammoInventory[(AmmoType)i] << endl;
    }
    cout << "0. 返回" << endl;
    cout << "选择子弹类型编号: ";
    int choice;
    cin >> choice;
    if(choice == 0) return;
    if(choice < 1 || choice > 7) {
        cout << "无效选择" << endl;
        pause();
        return;
    }
    Bullet& target = bullets[choice - 1];
    int price = isBlackMarket ? target.price / 2 : target.price;
    cout << "购买数量: ";
    int count;
    cin >> count;
    if(count <= 0) return;
    int totalCost = price * count;
    if(steve.gold >= totalCost) {
        steve.gold -= totalCost;
        steve.ammoInventory[target.type] += count;
        cout << "购买成功!获得 " << target.name << " x" << count << endl;
    } else {
        cout << "金币不足!需要 " << totalCost << " G" << endl;
    }
    pause();
}

void armorShop(bool isBlackMarket = false) {
    system("cls");
    string shopName = isBlackMarket ? "=== 黑市防具店 ===" : "=== 铁匠铺 ===";
    cout << shopName << endl;
    if(isBlackMarket) cout << "(所有商品半价)" << endl;
    for(int i = 1; i < armorDatabase.size(); i++) {
        ArmorSet a = armorDatabase[i];
        int price = isBlackMarket ? a.price / 2 : a.price;
        cout << i << ". " << a.name
             << " | 防御:" << a.defense
             << " | 韧**:" << a.toughness
             << " | 价格:" << price << " G" << endl;
    }
    cout << "0. 返回" << endl;
    cout << "请输入编号购买: ";
    int choice;
    cin >> choice;
    if(choice == 0) return;
    if(choice < 1 || choice >= armorDatabase.size()) {
        cout << "无效选择" << endl;
        pause();
        return;
    }
    ArmorSet& target = armorDatabase[choice];
    int price = isBlackMarket ? target.price / 2 : target.price;
    if(steve.gold >= price) {
        steve.gold -= price;
        steve.currentArmor = &target;
        cout << "购买并装备了 " << target.name << endl;
    } else {
        cout << "金币不足!" << endl;
    }
    pause();
}

void blackMarket() {
    system("cls");
    cout << "你来到了阴暗的黑市入口..." << endl;
    cout << "守门人: \"想进去?先交 " << BLACK_MARKET_ENTRY_FEE << " G 门票费。\"" << endl;
    cout << "1. 支付进入" << endl;
    cout << "2. 离开" << endl;
    cout << "选择: ";
    int op;
    cin >> op;
    if(op != 1) return;
    if(steve.gold < BLACK_MARKET_ENTRY_FEE) {
        cout << "金币不足,被赶走了。" << endl;
        pause();
        return;
    }
    steve.gold -= BLACK_MARKET_ENTRY_FEE;
    cout << "欢迎光顾黑市!所有商品半价!" << endl;
    Sleep(1000);
    int subOp;
    while(true) {
        system("cls");
        cout << "=== 黑市内部 ===" << endl;
        cout << "剩余金币: " << steve.gold << endl;
        cout << "1. 购买枪械 (半价)" << endl;
        cout << "2. 购买子弹 (半价)" << endl;
        cout << "3. 购买盔甲 (半价)" << endl;
        cout << "4. 购买不**图腾 (半价 500G)" << endl;
        cout << "0. 离开黑市" << endl;
        cout << "选择: ";
        cin >> subOp;
        if(subOp == 0) break;
        if(subOp == 1) gunShop(true);
        else if(subOp == 2) ammoShop(true);
        else if(subOp == 3) armorShop(true);
        else if(subOp == 4) {
            if(steve.gold >= 500) {
                steve.gold -= 500;
                steve.hasTotem = true;
                cout << "购买了不**图腾!" << endl;
            } else {
                cout << "金币不足 (需要500G)" << endl;
            }
            pause();
        }
    }
}

void battle(Monster mob) {
    system("cls");
    cout << "遭遇敌人: " << mob.name << " (HP:" << mob.hp << ")" << endl;
    if(mob.isBoss) {
        setColor(12);
        cout << "*** BOSS战 ***" << endl;
        resetColor();
    }
    pause();
    while(steve.hp > 0 && mob.hp > 0) {
        system("cls");
        cout << "--------------------------------" << endl;
        cout << mob.name << " HP: " << mob.hp << "/" << mob.maxHp << endl;
        cout << "史蒂夫 HP: " << steve.hp << "/" << steve.maxHp << endl;
        cout << "--------------------------------" << endl;
        cout << "1. 攻击" << endl;
        cout << "2. 逃跑" << endl;
        cout << "选择: ";
        int action;
        cin >> action;
        if(action == 2) {
            cout << "你逃跑了!" << endl;
            pause();
            return;
        }
        int dmg = steve.currentGun->damage;
        string attackMsg = "你使用了 " + steve.currentGun->name;
        if(steve.currentGun->ammoType != AMMO_NONE) {
            if(steve.ammoInventory[steve.currentGun->ammoType] > 0) {
                steve.ammoInventory[steve.currentGun->ammoType]--;
            } else {
                cout << "弹药耗尽!只能肉搏!(伤害降低)" << endl;
                dmg = 5;
                attackMsg = "你徒手攻击";
            }
        }
        bool isCrit = false;
        if(randomNum(1, 100) <= steve.currentGun->critChance) {
            dmg *= 2;
            isCrit = true;
            attackMsg += " [暴击!]";
        }
        float reduction = calculateDamageReduction(mob.defense, 0, dmg);
        int finalDmg = (int)(dmg * (1 - reduction));
        if(finalDmg < 1) finalDmg = 1;
        mob.hp -= finalDmg;
        cout << attackMsg << " 造成 " << finalDmg << " 点伤害" << endl;
        if(mob.hp <= 0) {
            cout << "\n" << mob.name << " 被击败了!" << endl;
            cout << "获得金币: " << mob.rewardGold << endl;
            steve.gold += mob.rewardGold;
            if(mob.isBoss) {
                cout << "BOSS掉落:大量战利品!" << endl;
                steve.gold += 500;
                if(!steve.hasTotem && randomNum(1, 3) == 1) {
                    steve.hasTotem = true;
                    cout << "获得了不**图腾!" << endl;
                }
            }
            pause();
            return;
        }
        Sleep(800);
        int mobDmg = mob.atk;
        float playerReduction = calculateDamageReduction(steve.currentArmor->defense, steve.currentArmor->toughness, mobDmg);
        int finalMobDmg = (int)(mobDmg * (1 - playerReduction));
        if(finalMobDmg < 1) finalMobDmg = 1;
        steve.hp -= finalMobDmg;
        cout << mob.name << " 攻击了你!造成 " << finalMobDmg << " 点伤害" << endl;
        if(steve.hp <= 0) {
            if(steve.hasTotem) {
                cout << "\n*** 不**图腾生效! ***" << endl;
                cout << "你免于**亡,恢复至 1 HP" << endl;
                steve.hp = 1;
                steve.hasTotem = false;
                Sleep(2000);
            } else {
                cout << "\n*** 你**亡了! ***" << endl;
                cout << "金币减半,复活..." << endl;
                steve.gold /= 2;
                steve.hp = steve.maxHp / 2;
                // 修复**亡指针崩溃
                steve.currentGun = &gunDatabase[0];
                steve.currentArmor = &armorDatabase[0];
                pause();
                return;
            }
        }
        Sleep(800);
    }
}

void wildFight() {
    Monster m;
    int type = randomNum(1, 3);
    if(type == 1) {
        m = {"僵尸", 60, 60, 15, 2, 30, false};
    } else if(type == 2) {
        m = {"骷髅", 50, 50, 20, 1, 35, false};
    } else {
        m = {"苦力怕", 40, 40, 30, 0, 40, false};
    }
    battle(m);
}

void bossFight() {
    system("cls");
    cout << "选择**的BOSS:" << endl;
    cout << "1. 唤魔者 (高魔法伤害)" << endl;
    cout << "2. 掠夺兽 (高物理伤害)" << endl;
    cout << "0. 返回" << endl;
    cout << "选择: ";
    int op;
    cin >> op;
    if(op == 0) return;
    Monster boss;
    if(op == 1) {
        boss = {"唤魔者", 300, 300, 40, 5, 1000, true};
    } else {
        boss = {"掠夺兽", 400, 400, 50, 8, 1200, true};
    }
    battle(boss);
}

void rest() {
    system("cls");
    cout << "你在床上休息..." << endl;
    Sleep(1000);
    int heal = randomNum(20, 50);
    steve.hp += heal;
    if(steve.hp > steve.maxHp) steve.hp = steve.maxHp;
    cout << "恢复了 " << heal << " 点生命值。" << endl;
    int luck = randomNum(1, 10);
    if(luck == 1) {
        cout << "【福利】在枕头下发现了 50 G!" << endl;
        steve.gold += 50;
    } else if(luck == 2) {
        cout << "【福利】感觉精力充沛,最大生命值临时增加 10 (下次重置)" << endl;
    }
    pause();
}

void inventory() {
    system("cls");
    cout << "=== 物品栏 ===" << endl;
    cout << "当前武器: " << steve.currentGun->name << endl;
    cout << "当前盔甲: " << steve.currentArmor->name << endl;
    cout << "不**图腾: " << (steve.hasTotem ? "有" : "无") << endl;
    cout << "\n子弹库存:" << endl;
    for(int i = 0; i < 7; i++) {
        if(steve.ammoInventory[(AmmoType)i] > 0) {
            cout << bullets[i].name << ": " << steve.ammoInventory[(AmmoType)i] << endl;
        }
    }
    cout << "\n按回车返回...";
    cin.sync();
    cin.ignore();
    cin.get();
}

// ===================== 主函数 =====================
int main() {
    SetConsoleTitle("我的世界-枪械与装甲文明");
    initGame();
    int op;
    while(true) {
        printStatus();
        showMenu();
        cin >> op;
        switch(op) {
            case 1: goMine(); break;
            case 2: {
                int sub;
                cout << "1.买枪 2.买弹: ";
                cin >> sub;
                if(sub == 1) gunShop();
                else if(sub == 2) ammoShop();
            } break;
            case 3: armorShop(); break;
            case 4: blackMarket(); break;
            case 5: wildFight(); break;
            case 6: bossFight(); break;
            case 7: rest(); break;
            case 8: inventory(); break;
            case 0:
                cout << "游戏退出。" << endl;
                return 0;
            default:
                cout << "无效输入" << endl;
                Sleep(500);
        }
    }
    return 0;
}


1
已采纳
高驰宇
高驰宇
新手天翼
新手天翼

EMM下次能不能发到代码分享,不然我们复制不了,也玩不了

(PS:你可以在游戏开始界面写上“MADE BY XXX”)

我要回答