#include
#include
#include
#include
#include
#include
#include
using namespace std;
// ==================== 招式 ====================
struct Move {
string name, effect, type;
int power, accuracy;
Move(string n, int p, int a, string e, string t)
: name(n), power(p), accuracy(a), effect(e), type(t) {}
};
inline Move mv(string n, int p, int a, string e, string t) {
return Move(n, p, a, e, t);
}
struct MegaData { string newName; int atkUp, hpUp; vector moves; };
// ==================== 数据库 ====================
map<string, vector> moveDB;
map<string, MegaData> megaDB;
string k(const string& f, const string& n) { return f + “|” + n; }
void initMoves() {
auto& D = moveDB;
D[k(“普通”,“小火龙”)] = {mv(“火花”,50,100,“none”,“火”), mv(“抓”,40,100,“none”,“一般”)};
D[k(“普通”,“火恐龙”)] = {mv(“火焰牙”,65,100,“none”,“火”), mv(“劈开”,60,100,“none”,“一般”)};
D[k(“普通”,“喷火龙”)] = {mv(“喷射火焰”,80,100,“none”,“火”), mv(“翅膀攻击”,75,100,“none”,“飞行”)};
D[k(“普通”,“杰尼龟”)] = {mv(“水枪”,50,100,“none”,“水”), mv(“撞击”,40,100,“none”,“一般”)};
D[k(“普通”,“卡咪龟”)] = {mv(“水之波动”,65,100,“none”,“水”), mv(“咬住”,60,100,“none”,“恶”)};
D[k(“普通”,“水箭龟”)] = {mv(“水炮”,85,95,“none”,“水”), mv(“火箭头槌”,80,100,“none”,“一般”)};
D[k(“普通”,“木守宫”)] = {mv(“种子机关枪”,25,90,“multiHit”,“草”), mv(“吸取”,40,100,“none”,“草”)};
D[k(“普通”,“森林蜥蜴”)] = {mv(“种子机关枪”,30,90,“multiHit”,“草”), mv(“刀叶”,70,100,“none”,“草”)};
D[k(“普通”,“蜥蜴王”)] = {mv(“叶刃斩”,80,95,“none”,“草”), mv(“龙之波动”,85,100,“none”,“龙”)};
D[k(“普通”,“妙蛙种子”)] = {mv(“藤鞭”,45,100,“none”,“草”), mv(“撞击”,40,100,“none”,“一般”)};
D[k(“普通”,“妙蛙草”)] = {mv(“飞叶快刀”,60,100,“none”,“草”), mv(“毒粉”,0,95,“none”,“毒”)};
D[k(“普通”,“妙蛙花”)] = {mv(“日光束”,90,100,“none”,“草”), mv(“毒液冲击”,70,100,“none”,“毒”)};
D[k(“普通”,“火稚鸡”)] = {mv(“火花”,50,100,“none”,“火”), mv(“抓”,40,100,“none”,“一般”)};
D[k(“普通”,“力壮鸡”)] = {mv(“二连踢”,55,100,“none”,“格斗”), mv(“火焰牙”,65,100,“none”,“火”)};
D[k(“普通”,“火焰鸡”)] = {mv(“火焰踢”,75,90,“none”,“火”), mv(“二连踢”,50,100,“none”,“格斗”)};
D[k(“普通”,“水跃鱼”)] = {mv(“水枪”,50,100,“none”,“水”), mv(“撞击”,40,100,“none”,“一般”)};
D[k(“普通”,“沼跃鱼”)] = {mv(“泥巴射击”,60,95,“none”,“地面”), mv(“水枪”,50,100,“none”,“水”)};
D[k(“普通”,“巨沼怪”)] = {mv(“浊流”,75,95,“none”,“水”), mv(“地震”,70,100,“none”,“地面”)};
D[k(“普通”,“飞天螳螂”)] = {mv(“连斩”,60,95,“none”,“虫”), mv(“电光一闪”,40,100,“none”,“一般”), mv(“翅膀攻击”,60,100,“none”,“飞行”)};
D[k(“普通”,“巨钳螳螂”)] = {mv(“子弹拳”,60,100,“none”,“钢”), mv(“十字剪”,70,100,“none”,“虫”), mv(“剑舞”,0,100,“none”,“一般”)};
D[k(“普通”,“劈斧螳螂”)] = {mv(“岩石爆击”,25,90,“multiHit”,“岩石”), mv(“十字剪”,70,100,“none”,“虫”), mv(“岩石封锁”,60,95,“none”,“岩石”)};
D[k(“普通”,“鬼斯”)] = {mv(“暗影球”,60,100,“none”,“幽灵”), mv(“催眠术”,0,60,“none”,“超能力”), mv(“舌舔”,30,100,“none”,“幽灵”)};
D[k(“普通”,“鬼斯通”)] = {mv(“暗影球”,70,100,“none”,“幽灵”), mv(“奇异之光”,0,100,“none”,“幽灵”), mv(“毒击”,60,100,“none”,“毒”)};
D[k(“普通”,“耿鬼”)] = {mv(“暗影球”,80,100,“none”,“幽灵”), mv(“污泥炸弹”,80,100,“none”,“毒”), mv(“同命”,0,100,“none”,“幽灵”)};
D[k(“普通”,“皮卡丘”)] = {mv(“十万伏特”,70,100,“none”,“电”), mv(“电光一闪”,40,100,“none”,“一般”)};
D[k(“普通”,“雷丘”)] = {mv(“打雷”,90,85,“none”,“电”), mv(“电球”,80,100,“none”,“电”)};
D[k(“普通”,“可达鸭”)] = {mv(“水枪”,50,100,“none”,“水”), mv(“念力”,55,100,“none”,“超能力”)};
D[k(“普通”,“哥达鸭”)] = {mv(“水炮”,85,95,“none”,“水”), mv(“精神强念”,80,100,“none”,“超能力”)};
D[k(“普通”,“卡比兽”)] = {mv(“泰山压顶”,80,100,“none”,“一般”), mv(“睡觉”,0,100,“none”,“超能力”)};
D[k(“普通”,“迷你龙”)] = {mv(“龙尾”,60,90,“none”,“龙”), mv(“电磁波”,0,90,“none”,“电”)};
D[k(“普通”,“哈克龙”)] = {mv(“龙之波动”,80,100,“none”,“龙”), mv(“神速”,70,100,“none”,“一般”)};
D[k(“普通”,“快龙”)] = {mv(“逆鳞”,100,100,“none”,“龙”), mv(“喷射火焰”,80,100,“none”,“火”)};
D[k(“普通”,“圆陆鲨”)] = {mv(“龙爪”,60,95,“none”,“龙”), mv(“泼沙”,0,100,“none”,“地面”)};
D[k(“普通”,“尖牙陆鲨”)] = {mv(“龙爪”,70,100,“none”,“龙”), mv(“挖洞”,60,100,“none”,“地面”)};
D[k(“普通”,“烈咬陆鲨”)] = {mv(“龙之俯冲”,90,95,“none”,“龙”), mv(“地震”,80,100,“none”,“地面”), mv(“龙爪”,70,100,“none”,“龙”)};
D[k(“普通”,“沙奈朵”)] = {mv(“月亮之力”,75,100,“none”,“妖精”), mv(“精神强念”,70,100,“none”,“超能力”)};
D[k(“普通”,“路卡利欧”)] = {mv(“波导弹”,70,100,“none”,“格斗”), mv(“近身战”,80,100,“none”,“格斗”)};
D[k(“普通”,“暴鲤龙”)] = {mv(“攀瀑”,70,100,“none”,“水”), mv(“咬碎”,70,100,“none”,“恶”)};
D[k(“普通”,“大钢蛇”)] = {mv(“铁尾”,70,85,“none”,“钢”), mv(“地震”,70,100,“none”,“地面”)};
D[k(“普通”,“大针蜂”)] = {mv(“毒击”,70,100,“none”,“毒”), mv(“飞弹针”,20,95,“multiHit”,“虫”), mv(“直冲钻”,70,95,“none”,“地面”)};
D[k(“普通”,“差不多娃娃”)] = {mv(“舍身冲撞”,100,100,“none”,“一般”), mv(“帮助”,0,100,“none”,“一般”), mv(“破坏光线”,120,90,“none”,“一般”)};
D[k(“普通”,“电龙”)] = {mv(“龙之波动”,75,100,“none”,“龙”), mv(“打雷”,90,85,“none”,“电”), mv(“棉花防守”,0,100,“none”,“草”)};
D[k(“普通”,“诅咒娃娃”)] = {mv(“暗影爪”,80,100,“none”,“幽灵”), mv(“突袭”,60,100,“none”,“恶”), mv(“暗影球”,70,100,“none”,“幽灵”)};
D[k(“普通”,“阿勃梭鲁”)] = {mv(“暗袭要害”,80,100,“none”,“恶”), mv(“精神利刃”,70,100,“none”,“超能力”), mv(“劈开”,70,100,“none”,“一般”)};
D[k(“普通”,“梦幻”)] = {mv(“精神强念”,80,100,“none”,“超能力”), mv(“波导弹”,80,100,“none”,“格斗”)};
D[k(“普通”,“时拉比”)] = {mv(“魔法叶”,60,100,“none”,“草”), mv(“治愈之愿”,0,100,“none”,“超能力”)};
D[k(“普通”,“基拉祈”)] = {mv(“彗星拳”,80,90,“none”,“钢”), mv(“精神强念”,80,100,“none”,“超能力”)};
D[k(“普通”,“蒂安希”)] = {mv(“钻石风暴”,80,95,“none”,“岩石”), mv(“月亮之力”,75,100,“none”,“妖精”)};
D[k(“普通”,“雷电兽”)] = {mv(“十万伏特”,70,100,“none”,“电”), mv(“电光一闪”,40,100,“none”,“一般”)};
D[k(“普通”,“赫拉克罗斯”)] = {mv(“超级角击”,80,85,“none”,“虫”), mv(“近身战”,80,100,“none”,“格斗”)};
D[k(“普通”,“超梦”)] = {mv(“精神击破”,100,95,“none”,“超能力”), mv(“波导弹”,80,100,“none”,“格斗”)};
D[k(“普通”,“裂空座”)] = {mv(“画龙点睛”,120,90,“none”,“龙”), mv(“逆鳞”,110,100,“none”,“龙”)};
D[k(“普通”,“伊布”)] = {mv(“撞击”,40,100,“none”,“一般”), mv(“咬住”,60,100,“none”,“恶”), mv(“电光一闪”,40,100,“none”,“一般”)};
D[k(“普通”,“六尾”)] = {mv(“火花”,40,100,“none”,“火”), mv(“电光一闪”,40,100,“none”,“一般”)};
D[k(“普通”,“九尾”)] = {mv(“喷射火焰”,90,100,“none”,“火”), mv(“魔法闪耀”,80,100,“none”,“妖精”)};
D[k(“普通”,“幼基拉斯”)] = {mv(“咬住”,60,100,“none”,“恶”), mv(“落石”,50,90,“none”,“岩石”)};
D[k(“普通”,“沙基拉斯”)] = {mv(“咬住”,60,100,“none”,“恶”), mv(“岩崩”,75,90,“none”,“岩石”)};
D[k(“普通”,“班基拉斯”)] = {mv(“咬碎”,80,100,“none”,“恶”), mv(“尖石攻击”,100,90,“none”,“岩石”), mv(“地震”,100,100,“none”,“地面”)};
D[k(“阿罗拉”,“六尾”)] = {mv(“细雪”,50,100,“none”,“冰”), mv(“电光一闪”,40,100,“none”,“一般”)};
D[k(“阿罗拉”,“九尾”)] = {mv(“极光束”,70,100,“none”,“冰”), mv(“魔法闪耀”,80,100,“none”,“妖精”)};
D[k(“阿罗拉”,“雷丘”)] = {mv(“精神强念”,80,100,“none”,“超能力”), mv(“十万伏特”,70,100,“none”,“电”)};
D[k(“伽勒尔”,“双弹瓦斯”)] = {mv(“神奇蒸汽”,80,95,“none”,“妖精”), mv(“污泥炸弹”,80,100,“none”,“毒”)};
D[k(“伽勒尔”,“闪电鸟”)] = {mv(“雷电踢”,85,90,“none”,“格斗”), mv(“近身战”,90,100,“none”,“格斗”), mv(“勇鸟猛攻”,100,100,“none”,“飞行”)};
D[k(“伽勒尔”,“急冻鸟”)] = {mv(“冰冷视线”,85,95,“none”,“超能力”), mv(“空气斩”,75,95,“none”,“飞行”), mv(“催眠术”,0,60,“none”,“超能力”)};
D[k(“伽勒尔”,“火焰鸟”)] = {mv(“怒火中烧”,90,95,“none”,“恶”), mv(“恶之波动”,80,100,“none”,“恶”), mv(“勇鸟猛攻”,100,100,“none”,“飞行”)};
}
void initMega() {
auto& D = megaDB;
D[“蜥蜴王”] = {“Mega蜥蜴王”,40,80,{mv(“叶刃斩”,90,95,“none”,“草”), mv(“龙之波动”,90,100,“none”,“龙”), mv(“雷电拳”,85,100,“none”,“电”)}};
D[“喷火龙”] = {“Mega喷火龙X”,50,80,{mv(“龙之爪”,85,100,“none”,“龙”), mv(“闪焰冲锋”,100,95,“none”,“火”), mv(“雷电拳”,75,100,“none”,“电”)}};
D[“水箭龟”] = {“Mega水箭龟”,45,90,{mv(“水炮”,95,95,“none”,“水”), mv(“波导弹”,80,100,“none”,“格斗”), mv(“恶之波动”,80,100,“none”,“恶”)}};
D[“妙蛙花”] = {“Mega妙蛙花”,40,85,{mv(“日光束”,95,100,“none”,“草”), mv(“污泥炸弹”,80,100,“none”,“毒”), mv(“地震”,80,100,“none”,“地面”)}};
D[“超梦”] = {“Mega超梦X”,60,100,{mv(“精神击破”,110,95,“none”,“超能力”), mv(“健美”,0,100,“none”,“格斗”), mv(“吸取拳”,85,100,“none”,“格斗”)}};
D[“裂空座”] = {“Mega裂空座”,70,110,{mv(“画龙点睛”,130,90,“none”,“龙”), mv(“逆鳞”,120,100,“none”,“龙”), mv(“神速”,80,100,“none”,“一般”)}};
D[“火焰鸡”] = {“Mega火焰鸡”,50,80,{mv(“火焰踢”,85,90,“none”,“火”), mv(“飞膝踢”,130,90,“none”,“格斗”), mv(“闪焰冲锋”,100,95,“none”,“火”)}};
D[“巨沼怪”] = {“Mega巨沼怪”,45,90,{mv(“浊流”,85,95,“none”,“水”), mv(“地震”,90,100,“none”,“地面”), mv(“冰冻拳”,75,100,“none”,“冰”)}};
D[“沙奈朵”] = {“Mega沙奈朵”,45,80,{mv(“月亮之力”,85,100,“none”,“妖精”), mv(“精神强念”,80,100,“none”,“超能力”), mv(“魔法火焰”,75,100,“none”,“火”)}};
D[“路卡利欧”] = {“Mega路卡利欧”,55,85,{mv(“波导弹”,85,100,“none”,“格斗”), mv(“近身战”,100,100,“none”,“格斗”), mv(“子弹拳”,70,100,“none”,“钢”)}};
D[“暴鲤龙”] = {“Mega暴鲤龙”,50,85,{mv(“攀瀑”,80,100,“none”,“水”), mv(“咬碎”,80,100,“none”,“恶”), mv(“地震”,80,100,“none”,“地面”)}};
D[“大钢蛇”] = {“Mega大钢蛇”,40,100,{mv(“铁尾”,90,85,“none”,“钢”), mv(“地震”,85,100,“none”,“地面”), mv(“尖石攻击”,80,90,“none”,“岩石”)}};
D[“蒂安希”] = {“Mega蒂安希”,50,80,{mv(“钻石风暴”,90,95,“none”,“岩石”), mv(“月亮之力”,85,100,“none”,“妖精”), mv(“精神强念”,80,100,“none”,“超能力”)}};
D[“雷电兽”] = {“Mega雷电兽”,55,80,{mv(“十万伏特”,85,100,“none”,“电”), mv(“喷射火焰”,80,100,“none”,“火”), mv(“电压置换”,70,100,“none”,“电”)}};
D[“赫拉克罗斯”] = {“Mega赫拉克罗斯”,60,85,{mv(“超级角击”,100,85,“none”,“虫”), mv(“近身战”,95,100,“none”,“格斗”), mv(“岩石爆击”,75,90,“multiHit”,“岩石”)}};
D[“烈咬陆鲨”] = {“Mega烈咬陆鲨”,60,100,{mv(“龙之俯冲”,100,95,“none”,“龙”), mv(“地震”,95,100,“none”,“地面”), mv(“龙爪”,85,100,“none”,“龙”)}};
D[“班基拉斯”] = {“Mega班基拉斯”,55,110,{mv(“尖石攻击”,100,90,“none”,“岩石”), mv(“咬碎”,90,100,“none”,“恶”), mv(“地震”,90,100,“none”,“地面”)}};
D[“大针蜂”] = {“Mega大针蜂”,70,70,{mv(“毒击”,80,100,“none”,“毒”), mv(“飞弹针”,25,95,“multiHit”,“虫”), mv(“直冲钻”,80,95,“none”,“地面”)}};
D[“差不多娃娃”] = {“Mega差不多娃娃”,40,100,{mv(“舍身冲撞”,120,100,“none”,“一般”), mv(“帮助”,0,100,“none”,“一般”), mv(“破坏光线”,150,90,“none”,“一般”)}};
D[“电龙”] = {“Mega电龙”,50,85,{mv(“龙之波动”,85,100,“none”,“龙”), mv(“打雷”,110,85,“none”,“电”), mv(“棉花防守”,0,100,“none”,“草”)}};
D[“诅咒娃娃”] = {“Mega诅咒娃娃”,60,80,{mv(“暗影爪”,90,100,“none”,“幽灵”), mv(“突袭”,70,100,“none”,“恶”), mv(“暗影球”,80,100,“none”,“幽灵”)}};
D[“阿勃梭鲁”] = {“Mega阿勃梭鲁”,65,80,{mv(“暗袭要害”,90,100,“none”,“恶”), mv(“精神利刃”,80,100,“none”,“超能力”), mv(“近身战”,95,100,“none”,“格斗”)}};
D[“巨钳螳螂”] = {“Mega巨钳螳螂”,50,80,{mv(“子弹拳”,80,100,“none”,“钢”), mv(“十字剪”,80,100,“none”,“虫”), mv(“剑舞”,0,100,“none”,“一般”)}};
D[“耿鬼”] = {“Mega耿鬼”,60,80,{mv(“暗影球”,100,100,“none”,“幽灵”), mv(“污泥炸弹”,95,100,“none”,“毒”), mv(“恶之波动”,85,100,“none”,“恶”)}};
}
// ==================== 蛋 ====================
class Egg {
public:
int hatchCounter;
string pokemonName, pokemonForm;
Egg(string n, string f): hatchCounter(5), pokemonName(n), pokemonForm(f) {}
string getName() {
return (pokemonForm == “普通” ? pokemonName : pokemonForm + pokemonName) + “的蛋”;
}
};
// ==================== 宝可梦 ====================
class Pokemon {
public:
string name, form, type1, type2, gender;
int hp, maxHp, attackPower, level, exp;
bool isCaptured, canMega, isMega;
vector moves;
string evolution; int evolutionLevel;
string secondEvolution; int secondEvoLevel;
Pokemon(string n, string f, string t1, string t2, int h, int a, string g,
string evo = "", int evoLv = 100, string evo2 = "", int evoLv2 = 100)
: name(n), form(f), type1(t1), type2(t2), gender(g),
hp(h), maxHp(h), attackPower(a), level(1), exp(0),
isCaptured(false), canMega(false), isMega(false),
evolution(evo), evolutionLevel(evoLv),
secondEvolution(evo2), secondEvoLevel(evoLv2) {}
string getFullName() { return ((form == "普通") ? name : form + name) + "(" + gender + ")"; }
bool isAlive() { return hp > 0; }
void takeDamage(int d) { hp = max(0, hp - d); }
void heal(int a) { hp = min(maxHp, hp + a); }
bool isImmuneTo(Move& m) {
if ((type1 == "幽灵" || type2 == "幽灵") && (m.type == "普通" || m.type == "格斗")) {
cout << getFullName() << " 是幽灵属性,免疫了 " << m.name << "!" << endl;
return true;
}
return false;
}
void setupMoves() {
moves.clear();
auto it = moveDB.find(k(form, name));
if (it != moveDB.end()) moves = it->second;
if (moves.empty()) moves.push_back(mv("撞击", 40, 100, "none", "一般"));
}
void useMove(int idx, Pokemon& target) {
if (idx < 0 || idx >= (int)moves.size()) return;
Move m = moves[idx];
if (target.isImmuneTo(m)) return;
if (rand() % 100 + 1 > m.accuracy) {
cout << getFullName() << " 的 " << m.name << " 没打中!" << endl;
return;
}
cout << getFullName() << " 使用了 " << m.name << "!" << endl;
if (m.effect == "multiHit") {
int hits = rand() % 4 + 2, total = 0;
for (int i = 0; i < hits; i++) {
int d = rand() % m.power + 10; total += d;
cout << " 第" << i+1 << "下:" << d << "伤害" << endl;
}
target.takeDamage(total);
} else if (m.effect == "lowerAttack") {
int d = rand() % m.power + 5; target.takeDamage(d);
target.attackPower = max(5, target.attackPower - 5);
} else {
int d = rand() % m.power + 10; target.takeDamage(d);
cout << "造成 " << d << " 伤害!" << endl;
}
}
void evolve(string newName, int newAtk, int newHp) {
cout << getFullName() << " 进化成了 " << form << newName << "(" << gender << ") !" << endl;
name = newName; attackPower = newAtk; maxHp = newHp; hp = maxHp;
setupMoves();
}
void gainExp(int amount) {
exp += amount;
while (exp >= 100) {
level++; exp -= 100; attackPower += 5; maxHp += 15; hp = maxHp;
cout << getFullName() << " 升到 Lv." << level << " !" << endl;
if (name == "飞天螳螂" && level >= 20) {
bool male = (gender == "雄性");
evolve(male ? "巨钳螳螂" : "劈斧螳螂",
attackPower + (male ? 25 : 30), maxHp + (male ? 40 : 45));
evolution = ""; secondEvolution = "";
} else if (!evolution.empty() && level >= evolutionLevel && name != evolution) {
evolve(evolution, attackPower + 20, maxHp + 50);
evolution = "";
} else if (!secondEvolution.empty() && level >= secondEvoLevel && name != secondEvolution) {
evolve(secondEvolution, attackPower + 30, maxHp + 80);
secondEvolution = "";
if (megaDB.count(name)) canMega = true;
}
}
}
void megaEvolve() {
if (!canMega || isMega || !megaDB.count(name)) {
cout << "无法Mega进化!" << endl;
return;
}
isMega = true;
MegaData& md = megaDB[name];
attackPower += md.atkUp;
maxHp += md.hpUp;
hp = min(maxHp, hp + md.hpUp);
name = md.newName;
moves = md.moves;
cout << getFullName() << " Mega进化!" << endl;
}
void showMoves() {
cout << "\n===== " << getFullName() << " 的招式 =====" << endl;
for (int i = 0; i < (int)moves.size(); i++) cout << i+1 << ". " << moves[i].name << endl;
}
};
// ==================== 训练家 ====================
class Trainer {
public:
string name;
vector team;
bool defeated;
Trainer(string n): name(n), defeated(false) {}
string getFullName() { return name; }
};
// ==================== 全局 ====================
int masterBallShards = 0, masterBalls = 0;
vector playerTeam, pcBox, wildPokemons, eggPokemons;
vector eggs;
vector trainers;
bool inTrainerBattle = false;
Trainer* currentTrainer = nullptr;
// ★ 修复点:把原来带默认参数的 lambda 换成普通函数
Pokemon makeP(string n, string f, string t1, string t2, int h, int a, string g,
string e1 = “”, int l1 = 100, string e2 = “”, int l2 = 100) {
return Pokemon(n, f, t1, t2, h, a, g, e1, l1, e2, l2);
}
// ==================== 数据库初始化 ====================
void initPokemon() {
wildPokemons.clear();
wildPokemons.push_back(makeP(“小火龙”,“普通”,“火”,“”,110,28,“雄性”,“火恐龙”,16,“喷火龙”,36));
wildPokemons.push_back(makeP(“杰尼龟”,“普通”,“水”,“”,115,27,“雄性”,“卡咪龟”,16,“水箭龟”,36));
wildPokemons.push_back(makeP(“木守宫”,“普通”,“草”,“”,110,28,“雄性”,“森林蜥蜴”,16,“蜥蜴王”,36));
wildPokemons.push_back(makeP(“妙蛙种子”,“普通”,“草”,“毒”,115,27,“雄性”,“妙蛙草”,16,“妙蛙花”,36));
wildPokemons.push_back(makeP(“火稚鸡”,“普通”,“火”,“”,110,28,“雄性”,“力壮鸡”,16,“火焰鸡”,36));
wildPokemons.push_back(makeP(“水跃鱼”,“普通”,“水”,“”,110,28,“雄性”,“沼跃鱼”,16,“巨沼怪”,36));
wildPokemons.push_back(makeP(“皮卡丘”,“普通”,“电”,“”,120,30,“雄性”,“雷丘”,20));
wildPokemons.push_back(makeP(“可达鸭”,“普通”,“水”,“”,100,25,“雄性”,“哥达鸭”,33));
wildPokemons.push_back(makeP(“卡比兽”,“普通”,“一般”,“”,180,35,“雄性”));
wildPokemons.push_back(makeP(“飞天螳螂”,“普通”,“虫”,“飞行”,110,35,“雄性”));
wildPokemons.push_back(makeP(“飞天螳螂”,“普通”,“虫”,“飞行”,110,35,“雌性”));
wildPokemons.push_back(makeP(“鬼斯”,“普通”,“幽灵”,“毒”,90,20,“雄性”,“鬼斯通”,25,“耿鬼”,40));
wildPokemons.push_back(makeP(“伊布”,“普通”,“一般”,“”,95,22,“雄性”));
wildPokemons.push_back(makeP(“迷你龙”,“普通”,“龙”,“”,100,25,“雄性”,“哈克龙”,30,“快龙”,55));
wildPokemons.push_back(makeP(“圆陆鲨”,“普通”,“龙”,“地面”,105,26,“雄性”,“尖牙陆鲨”,24,“烈咬陆鲨”,48));
wildPokemons.push_back(makeP(“幼基拉斯”,“普通”,“岩石”,“地面”,100,26,“雄性”,“沙基拉斯”,30,“班基拉斯”,55));
wildPokemons.push_back(makeP(“大针蜂”,“普通”,“虫”,“毒”,100,30,“雄性”));
wildPokemons.push_back(makeP(“阿勃梭鲁”,“普通”,“恶”,“”,130,45,“雄性”));
wildPokemons.push_back(makeP(“路卡利欧”,“普通”,“格斗”,“钢”,110,38,“雄性”));
wildPokemons.push_back(makeP(“沙奈朵”,“普通”,“超能力”,“妖精”,115,32,“雌性”));
wildPokemons.push_back(makeP(“暴鲤龙”,“普通”,“水”,“飞行”,140,42,“雄性”));
wildPokemons.push_back(makeP(“梦幻”,“普通”,“超能力”,“”,200,60,“无性别”));
wildPokemons.push_back(makeP(“时拉比”,“普通”,“超能力”,“草”,200,60,“无性别”));
wildPokemons.push_back(makeP(“基拉祈”,“普通”,“钢”,“超能力”,200,60,“无性别”));
wildPokemons.push_back(makeP(“蒂安希”,“普通”,“岩石”,“妖精”,200,65,“雌性”));
wildPokemons.push_back(makeP(“超梦”,“普通”,“超能力”,“”,250,70,“无性别”));
wildPokemons.push_back(makeP(“裂空座”,“普通”,“龙”,“飞行”,260,75,“无性别”));
wildPokemons.push_back(makeP(“六尾”,“阿罗拉”,“冰”,“”,110,25,“雌性”,“九尾”,20));
wildPokemons.push_back(makeP(“雷丘”,“阿罗拉”,“电”,“超能力”,130,35,“雄性”));
wildPokemons.push_back(makeP(“闪电鸟”,“伽勒尔”,“格斗”,“飞行”,250,75,“无性别”));
wildPokemons.push_back(makeP(“急冻鸟”,“伽勒尔”,“超能力”,“飞行”,250,75,“无性别”));
wildPokemons.push_back(makeP(“火焰鸟”,“伽勒尔”,“恶”,“飞行”,250,75,“无性别”));
}
void initEggPokemons() {
eggPokemons.clear();
eggPokemons.push_back(Pokemon(“皮卡丘”,“普通”,“电”,“”,100,25,“雄性”));
eggPokemons.push_back(Pokemon(“六尾”,“普通”,“火”,“”,95,24,“雌性”));
eggPokemons.push_back(Pokemon(“可达鸭”,“普通”,“水”,“”,90,23,“雄性”));
eggPokemons.push_back(Pokemon(“迷你龙”,“普通”,“龙”,“”,100,25,“雄性”));
eggPokemons.push_back(Pokemon(“圆陆鲨”,“普通”,“龙”,“地面”,105,26,“雄性”));
eggPokemons.push_back(Pokemon(“伊布”,“普通”,“一般”,“”,95,22,“雄性”));
eggPokemons.push_back(Pokemon(“六尾”,“阿罗拉”,“冰”,“”,110,25,“雌性”));
eggPokemons.push_back(Pokemon(“飞天螳螂”,“普通”,“虫”,“飞行”,110,35,“雄性”));
}
void initTrainers() {
vector names;
names.push_back(“短裤小子”); names.push_back(“迷你裙”); names.push_back(“露营少年”);
names.push_back(“捕虫少年”); names.push_back(“登山男”); names.push_back(“泳圈女孩”);
names.push_back(“吉他手”); names.push_back(“护士”); names.push_back(“警察先生”);
names.push_back(“大姐姐”);
struct Tpl { string n, f, t1, t2; int h, a; };
vector<Tpl> tpls;
{ Tpl t = {"皮卡丘","普通","电","",120,30}; tpls.push_back(t); }
{ Tpl t = {"可达鸭","普通","水","",100,25}; tpls.push_back(t); }
{ Tpl t = {"卡比兽","普通","一般","",180,35}; tpls.push_back(t); }
{ Tpl t = {"小火龙","普通","火","",110,28}; tpls.push_back(t); }
{ Tpl t = {"杰尼龟","普通","水","",115,27}; tpls.push_back(t); }
{ Tpl t = {"妙蛙种子","普通","草","",115,27}; tpls.push_back(t); }
{ Tpl t = {"木守宫","普通","草","",110,28}; tpls.push_back(t); }
{ Tpl t = {"火稚鸡","普通","火","",110,28}; tpls.push_back(t); }
{ Tpl t = {"水跃鱼","普通","水","",110,28}; tpls.push_back(t); }
{ Tpl t = {"六尾","普通","火","",95,24}; tpls.push_back(t); }
{ Tpl t = {"飞天螳螂","普通","虫","飞行",110,35}; tpls.push_back(t); }
{ Tpl t = {"鬼斯","普通","幽灵","毒",90,20}; tpls.push_back(t); }
{ Tpl t = {"伊布","普通","一般","",95,22}; tpls.push_back(t); }
{ Tpl t = {"大针蜂","普通","虫","毒",100,30}; tpls.push_back(t); }
{ Tpl t = {"阿勃梭鲁","普通","恶","",130,45}; tpls.push_back(t); }
for (size_t i = 0; i < names.size(); i++) {
Trainer t(names[i]);
int cnt = rand() % 3 + 2;
for (int j = 0; j < cnt; j++) {
Tpl& tp = tpls[rand() % tpls.size()];
string gender = (rand() % 2 == 0) ? "雄性" : "雌性";
Pokemon p(tp.n, tp.f, tp.t1, tp.t2, tp.h, tp.a, gender);
p.setupMoves(); p.isCaptured = true;
t.team.push_back(p);
}
trainers.push_back(t);
}
}
// ==================== UI ====================
void showTeam() {
cout << “\n========== 身上队伍 (” << playerTeam.size() << “/6) ==========” << endl;
if (playerTeam.empty()) { cout << “(空空如也)” << endl; return; }
for (int i = 0; i < (int)playerTeam.size(); i++) {
Pokemon& p = playerTeam[i];
cout << i+1 << “. " << p.getFullName() << " Lv.” << p.level
<< " HP:" << p.hp << “/” << p.maxHp;
if (p.canMega && !p.isMega) cout << " 可Mega";
cout << endl;
}
}
void showPCBox() {
cout << “\n========== 电脑盒子 (” << pcBox.size() << “只) ==========” << endl;
if (pcBox.empty()) { cout << “(空空如也)” << endl; return; }
for (int i = 0; i < (int)pcBox.size(); i++)
cout << i+1 << “. " << pcBox[i].getFullName() << " Lv.” << pcBox[i].level
<< " HP:" << pcBox[i].hp << “/” << pcBox[i].maxHp << endl;
}
void showEggs() {
cout << “\n========== 持有的蛋 (” << eggs.size() << “个) ==========” << endl;
if (eggs.empty()) { cout << “(空空如也)” << endl; return; }
for (int i = 0; i < (int)eggs.size(); i++)
cout << i+1 << “. " << eggs[i].getName() << " 还需” << eggs[i].hatchCounter << “场战斗孵化” << endl;
}
void showItems() {
cout << “\n========== 持有物品 ==========” << endl;
cout << "大师球碎片: " << masterBallShards << “/3” << endl;
cout << “大师球: " << masterBalls << " 个” << endl;
cout << “蛋: " << eggs.size() << " 个” << endl;
}
// ==================== 掉落 / 孵化 ====================
void hatchEgg(int index) {
if (index < 0 || index >= (int)eggs.size()) return;
Egg& egg = eggs[index];
egg.hatchCounter–;
if (egg.hatchCounter > 0) return;
Pokemon np = eggPokemons[rand() % eggPokemons.size()];
np.setupMoves(); np.isCaptured = true;
cout << "蛋孵化了!出现了 " << np.getFullName() << "!" << endl;
if (playerTeam.size() < 6) { playerTeam.push_back(np); cout << np.getFullName() << " 加入了队伍!" << endl; }
else { pcBox.push_back(np); cout << "队伍已满," << np.getFullName() << " 存入电脑盒子!" << endl; }
eggs.erase(eggs.begin() + index);
}
void dropEgg() {
if (rand() % 100 >= 5) return;
int idx = rand() % eggPokemons.size();
string n = eggPokemons[idx].name, f = eggPokemons[idx].form;
eggs.push_back(Egg(n, f));
cout << "获得了 " << (f == “普通” ? n : f + n) << “的蛋!还需要5场战斗孵化!” << endl;
}
void dropMasterBallShard() {
if (rand() % 100 >= 10) return;
masterBallShards++;
cout << “获得大师球碎片! (” << masterBallShards << “/3)” << endl;
if (masterBallShards >= 3) {
masterBalls++; masterBallShards -= 3;
cout << “合成成功!获得1个大师球!” << endl;
}
}
// ==================== 队伍管理 ====================
void manageTeam() {
while (true) {
cout << “\n========== 队伍管理 ==========\n”
<< “1. 查看身上队伍\n2. 查看电脑盒子\n3. 放入电脑盒子\n”
<< "4. 从盒子取出\n5. 查看蛋\n6. 返回\n选择: ";
int c; cin >> c;
if (c == 1) showTeam();
else if (c == 2) showPCBox();
else if (c == 3) {
if (playerTeam.empty()) { cout << “身上没有宝可梦!” << endl; continue; }
showTeam(); cout << "选择要放入盒子的宝可梦编号: ";
int i; cin >> i;
if (i >= 1 && i <= (int)playerTeam.size()) {
pcBox.push_back(playerTeam[i-1]);
playerTeam.erase(playerTeam.begin() + i - 1);
cout << “已放入电脑盒子!” << endl;
}
}
else if (c == 4) {
if (pcBox.empty()) { cout << “盒子里没有宝可梦!” << endl; continue; }
if (playerTeam.size() >= 6) { cout << “身上已经有6只宝可梦了!” << endl; continue; }
showPCBox(); cout << "选择要取出的宝可梦编号: ";
int i; cin >> i;
if (i >= 1 && i <= (int)pcBox.size()) {
playerTeam.push_back(pcBox[i-1]);
pcBox.erase(pcBox.begin() + i - 1);
cout << “已取出并加入队伍!” << endl;
}
}
else if (c == 5) showEggs();
else break;
}
}
// ==================== 收服 ====================
bool alreadyOwned(string name, string form) {
for (size_t i = 0; i < playerTeam.size(); i++)
if (playerTeam[i].name == name && playerTeam[i].form == form) return true;
for (size_t i = 0; i < pcBox.size(); i++)
if (pcBox[i].name == name && pcBox[i].form == form) return true;
return false;
}
bool capture(Pokemon& w, bool useMB = false) {
if (useMB) {
if (masterBalls <= 0) { cout << “没有大师球!” << endl; return false; }
masterBalls–;
cout << “使用了大师球!100%收服成功!” << endl;
} else {
int rate = 80;
if (w.name == “超梦” || w.name == “裂空座” || w.name == “蒂安希” ||
w.name == “梦幻” || w.name == “时拉比” || w.name == “基拉祈”) rate = 40;
if (w.form == “伽勒尔”) rate = 30;
if (rand() % 100 >= rate) { cout << “收服失败!” << endl; return false; }
cout << “收服 " << w.getFullName() << " 成功!” << endl;
}
w.isCaptured = true; w.hp = w.maxHp;
if (playerTeam.size() < 6) { playerTeam.push_back(w); cout << w.getFullName() << " 加入了队伍!" << endl; }
else { pcBox.push_back(w); cout << “队伍已满,” << w.getFullName() << " 存入电脑盒子!" << endl; }
return true;
}
// ==================== 战斗 ====================
void trainerBattle() {
if (!currentTrainer || currentTrainer->defeated || playerTeam.empty()) return;
cout << “\n训练家 " << currentTrainer->getFullName() << " 发起了对战!” << endl;
for (size_t i = 0; i < currentTrainer->team.size(); i++) {
Pokemon& o = currentTrainer->team[i];
o.hp = o.maxHp;
cout << "\n" << currentTrainer->getFullName() << " 派出了 " << o.getFullName() << "!" << endl;
while (o.isAlive()) {
if (playerTeam.empty()) return;
Pokemon& mine = playerTeam[0];
cout << "\n我方:" << mine.getFullName() << " HP:" << mine.hp << "/" << mine.maxHp << endl;
cout << "敌方:" << o.getFullName() << " HP:" << o.hp << "/" << o.maxHp << endl;
cout << "1.攻击 2.逃跑 3.Mega进化 4.查看招式" << endl;
int c; cin >> c;
if (c == 1) {
mine.showMoves(); int m; cin >> m;
mine.useMove(m-1, o);
if (!o.isAlive()) {
cout << o.getFullName() << " 倒下了!" << endl;
mine.gainExp(40);
break;
}
o.useMove(rand() % o.moves.size(), mine);
if (!mine.isAlive()) {
cout << mine.getFullName() << " 倒下了!" << endl;
playerTeam.erase(playerTeam.begin());
if (playerTeam.empty()) {
cout << "所有宝可梦都倒下了... 你输给了 " << currentTrainer->getFullName() << "!" << endl;
return;
}
}
}
else if (c == 2) { cout << "逃跑了!" << endl; return; }
else if (c == 3) mine.megaEvolve();
else if (c == 4) mine.showMoves();
}
}
cout << "\n你击败了训练家 " << currentTrainer->getFullName() << "!" << endl;
currentTrainer->defeated = true;
cout << "获得了 " << rand() % 500 + 200 << " 元奖金!" << endl;
}
void encounter(Pokemon& w) {
cout << “\n野生的 " << w.getFullName() << " 出现了!” << endl;
w.setupMoves();
bool canMegaThisBattle = true;
while (w.isAlive()) {
if (playerTeam.empty()) { cout << "没有宝可梦!无法战斗!" << endl; return; }
Pokemon& mine = playerTeam[0];
cout << "\n我方:" << mine.getFullName() << " HP:" << mine.hp << "/" << mine.maxHp << endl;
cout << "1.攻击 2.精灵球 3.大师球 4.逃跑 5.Mega进化 6.查看招式" << endl;
int c; cin >> c;
bool caught = false, ranAway = false;
if (c == 1) {
mine.showMoves(); int m; cin >> m;
mine.useMove(m-1, w);
}
else if (c == 2) {
caught = capture(w, false);
}
else if (c == 3) {
if (masterBalls <= 0) cout << "没有大师球!" << endl;
else caught = capture(w, true);
}
else if (c == 4) { cout << "逃跑!" << endl; ranAway = true; }
else if (c == 5 && canMegaThisBattle) { mine.megaEvolve(); canMegaThisBattle = false; }
else if (c == 6) { mine.showMoves(); }
if (caught) { dropMasterBallShard(); dropEgg(); return; }
if (ranAway) return;
if (!w.isAlive()) {
cout << w.getFullName() << " 倒下了!" << endl;
mine.gainExp(40);
dropMasterBallShard(); dropEgg();
return;
}
w.useMove(rand() % w.moves.size(), mine);
if (!mine.isAlive()) {
cout << mine.getFullName() << " 倒下了!" << endl;
playerTeam.erase(playerTeam.begin());
if (playerTeam.empty()) { cout << "所有宝可梦都倒下了..." << endl; return; }
}
}
}
// ==================== main ====================
int main() {
srand((unsigned)time(0));
initMoves();
initMega();
initPokemon();
initEggPokemons();
initTrainers();
cout << "宝可梦 初始选择\n1.小火龙 2.杰尼龟 3.木守宫 4.妙蛙种子 5.火稚鸡 6.水跃鱼" << endl;
int c; cin >> c;
Pokemon starter("小火龙","普通","火","",110,28,"雄性","火恐龙",16,"喷火龙",36);
if (c == 2) starter = Pokemon("杰尼龟","普通","水","",115,27,"雄性","卡咪龟",16,"水箭龟",36);
else if (c == 3) starter = Pokemon("木守宫","普通","草","",110,28,"雄性","森林蜥蜴",16,"蜥蜴王",36);
else if (c == 4) starter = Pokemon("妙蛙种子","普通","草","毒",115,27,"雄性","妙蛙草",16,"妙蛙花",36);
else if (c == 5) starter = Pokemon("火稚鸡","普通","火","",110,28,"雄性","力壮鸡",16,"火焰鸡",36);
else if (c == 6) starter = Pokemon("水跃鱼","普通","水","",110,28,"雄性","沼跃鱼",16,"巨沼怪",36);
starter.setupMoves();
starter.isCaptured = true;
playerTeam.push_back(starter);
cout << "选择了 " << starter.getFullName() << endl;
while (true) {
cout << "\n========== 主菜单 ==========\n1.草丛 2.队伍 3.盒子 4.物品 5.退出" << endl;
int a; cin >> a;
if (a == 1) {
Trainer* t = nullptr;
if (!trainers.empty() && rand() % 100 < 30) {
int idx = rand() % trainers.size();
if (!trainers[idx].defeated) t = &trainers[idx];
}
if (t) {
inTrainerBattle = true;
currentTrainer = t;
trainerBattle();
inTrainerBattle = false;
currentTrainer = nullptr;
} else {
Pokemon w = wildPokemons[rand() % wildPokemons.size()];
if (alreadyOwned(w.name, w.form)) {
cout << "遇到 " << w.getFullName() << "(已拥有),战斗?1是2否" << endl;
int s; cin >> s;
if (s == 1) encounter(w);
else dropEgg();
} else encounter(w);
}
for (int i = (int)eggs.size() - 1; i >= 0; i--) hatchEgg(i);
}
else if (a == 2) showTeam();
else if (a == 3) manageTeam();
else if (a == 4) showItems();
else break;
}
return 0;
}