#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 = ⌖
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 = ⌖
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;
}
#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 = ⌖
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 = ⌖
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;
}

