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