问题标题: 我的枪械文明代码哪里错了

0
0
杨尹浩
杨尹浩
修练者
修练者

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <vector>
#include <windows.h>
#include <iomanip>
#include <algorithm>
#include <map> // 【新增】必须包含 map 头文件

using namespace std;

// ... (中间常量定义和结构体定义保持不变) ...

// 全局玩家对象
Player steve;

// ... (全局数据初始化 gunDatabase, armorDatabase 等保持不变) ...

// 初始化游戏
void initGame() {
    srand((unsigned)time(NULL));
    steve.hp = MAX_HP;
    steve.maxHp = MAX_HP;
    steve.gold = 200;
    
    // 【修正】正确指向 vector 中的具体对象
    steve.currentGun = &gunDatabase[0];      // 初始武器:木棍
    steve.currentArmor = &armorDatabase[0];  // 初始盔甲:无
    
    steve.hasTotem = false;
    steve.totemUsed = false;
    
    // 初始化子弹库存为0
    for(int i=0; i<7; i++) {
        steve.ammoInventory[(AmmoType)i] = 0;
    }
}
    bool hasTotem; // 是否有不**图腾
    bool totemUsed; // 本局是否已使用图腾 (防止无限复活bug,通常图腾消耗品)
    
    // 状态
    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}
};

// 28款枪械 + RPG/榴弹 (部分示例,实际填充28+2)
// 为了代码简洁,这里列出关键代表,实际逻辑支持任意数量
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() {
    cout << "\n按回车键继续...";
    cin.ignore();
    cin.get();
}

// ================= 核心逻辑函数 =================

// 初始化游戏
void initGame() {
    srand((unsigned)time(NULL));
    steve.hp = MAX_HP;
    steve.maxHp = MAX_HP;
    steve.gold = 200; // 初始资金多一点以便体验
    steve.currentGun = &gunDatabase; // 木棍
    steve.currentArmor = &armorDatabase;
    steve.hasTotem = false;
    steve.totemUsed = false;
    
    // 初始化子弹库存为0
    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 << "请选择: ";
}

// 伤害计算逻辑 (参考MC公式简化版)
// 伤害减免 = 防御值 / (防御值 + 8) * (1 - 韧**/(防御值+8)) ? 
// 简化公式: 减伤比例 = 防御值 * 4% (上限80%),韧**用于抵抗高伤害穿透
float calculateDamageReduction(int defense, int toughness, int incomingDamage) {
    if(defense <= 0) return 0.0f;
    
    // MC 1.9+ 护甲公式简化模拟
    // 有效防御 = 防御值 - (incomingDamage / (2 + toughness/4))
    // 但这太复杂,我们用线**加韧**修正
    float baseReduction = defense * 0.04f; // 每点防御4%
    if(baseReduction > 0.8f) baseReduction = 0.8f; // 最大80%
    
    // 韧**修正:减少高伤害对护甲的穿透效果
    // 简单处理:韧**每点提供额外2%的高伤抗**
    float toughnessBonus = toughness * 0.02f;
    
    float finalReduction = baseReduction + toughnessBonus;
    if(finalReduction > 0.9f) finalReduction = 0.9f; // 硬上限90%
    
    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;
            
            // BOSS额外奖励
            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; // 掉落武器
                steve.currentArmor = &armorDatabase; // 掉落盔甲
                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);
}

// BOSS战
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;
        // 简单处理,不加永久maxHp,避免溢出,仅提示
    }
    
    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.get(); 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;
}
 


0
0
汪思源
汪思源
新手光能
新手光能

真就 // ... (中间常量定义和结构体定义保持不变) .

0
0
汪思源
汪思源
新手光能
新手光能

问题很明显了吧……你这代码应该是AI还回来的,它为了显示快,省略了一些东西。你可以让它重发一遍,或者自己加上。

0
潘文珪
潘文珪
中级守护
中级守护

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <vector>
#include <windows.h>
#include <iomanip>
#include <algorithm>
#include <map>
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 Gun;
struct ArmorSet;
struct Bullet;
struct Monster;

// ===================== 完整结构体定义 =====================
// 枪械结构体
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 Bullet {
    string name;
    AmmoType type;
    int price;
};

// 玩家结构体(补全残缺代码)
struct Player {
    int hp;
    int maxHp;
    int gold;
    Gun* currentGun;
    ArmorSet* currentArmor;
    int ammoInventory[7]; // 7类弹药库存
    bool hasTotem;       // 是否拥有复活图腾
    bool totemUsed;      // 本局是否已使用图腾
    int critMultiplier;  // 暴击倍率
};

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

// ===================== 全局数据初始化 =====================
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, 40, 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() {
    cout << "\n按回车键继续...";
    cin.ignore();
    cin.get();
}

// ===================== 游戏初始化函数 =====================
void initGame() {
    srand((unsigned)time(NULL));
    steve.hp = MAX_HP;
    steve.maxHp = MAX_HP;
    steve.gold = 200;
    // 修复指针错误:取vector第一个元素地址
    steve.currentGun = &gunDatabase[0];
    steve.currentArmor = &armorDatabase[0];
    steve.hasTotem = false;
    steve.totemUsed = false;
    steve.critMultiplier = 2;
    // 清空弹药库存
    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 *= steve.critMultiplier;
            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掉落:大量战利品!额外+500G" << 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);
}

// BOSS**
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 << "【福利】今晚休息极佳,临时战斗伤害小幅提升(本局生效)" << 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.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;
}

0
0
我要回答