宝可梦对战游戏
2026-04-19 16:39:47
发布于:北京
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
enum Type {
NORMAL, FIRE, WATER, GRASS, ELECTRIC,
ICE, FIGHTING, POISON, GROUND, FLYING,
PSYCHIC, BUG, ROCK, GHOST, DARK,
DRAGON, STEEL, FAIRY
};
string typeName(Type t) {
switch(t) {
case NORMAL: return "一般";
case FIRE: return "火";
case WATER: return "水";
case GRASS: return "草";
case ELECTRIC: return "电";
case ICE: return "冰";
case FIGHTING: return "格斗";
case POISON: return "毒";
case GROUND: return "地面";
case FLYING: return "飞行";
case PSYCHIC: return "超能力";
case BUG: return "虫";
case ROCK: return "岩";
case GHOST: return "幽灵";
case DARK: return "恶";
case DRAGON: return "龙";
case STEEL: return "钢";
case FAIRY: return "妖精";
default: return "无";
}
}
double getEffectiveness(Type atk, Type def) {
if (atk == FIRE) {
if (def == GRASS || def == BUG || def == ICE || def == STEEL) return 2.0;
if (def == FIRE || def == WATER || def == ROCK) return 0.5;
}
if (atk == WATER) {
if (def == FIRE || def == GROUND || def == ROCK) return 2.0;
if (def == WATER || def == GRASS || def == DRAGON) return 0.5;
}
if (atk == GRASS) {
if (def == WATER || def == GROUND || def == ROCK) return 2.0;
if (def == FIRE || def == GRASS || def == POISON || def == FLYING || def == BUG || def == DRAGON || def == STEEL) return 0.5;
}
if (atk == ELECTRIC) {
if (def == WATER || def == FLYING) return 2.0;
if (def == ELECTRIC || def == GRASS || def == DRAGON) return 0.5;
if (def == GROUND) return 0.0;
}
if (atk == GROUND) {
if (def == FIRE || def == ELECTRIC || def == POISON || def == ROCK || def == STEEL) return 2.0;
if (def == GRASS || def == BUG) return 0.5;
if (def == FLYING) return 0.0;
}
if (atk == FIGHTING) {
if (def == NORMAL || def == ICE || def == ROCK || def == DARK || def == STEEL) return 2.0;
if (def == POISON || def == FLYING || def == PSYCHIC || def == BUG || def == FAIRY) return 0.5;
if (def == GHOST) return 0.0;
}
if (atk == PSYCHIC) {
if (def == FIGHTING || def == POISON) return 2.0;
if (def == PSYCHIC || def == STEEL) return 0.5;
if (def == DARK) return 0.0;
}
if (atk == ICE) {
if (def == GRASS || def == GROUND || def == FLYING || def == DRAGON) return 2.0;
if (def == FIRE || def == WATER || def == ICE || def == STEEL) return 0.5;
}
if (atk == DRAGON) {
if (def == DRAGON) return 2.0;
if (def == STEEL) return 0.5;
if (def == FAIRY) return 0.0;
}
if (atk == DARK) {
if (def == PSYCHIC || def == GHOST) return 2.0;
if (def == FIGHTING || def == DARK || def == FAIRY) return 0.5;
}
if (atk == GHOST) {
if (def == PSYCHIC || def == GHOST) return 2.0;
if (def == DARK) return 0.5;
if (def == NORMAL) return 0.0;
}
if (atk == STEEL) {
if (def == ICE || def == ROCK || def == FAIRY) return 2.0;
if (def == FIRE || def == WATER || def == ELECTRIC || def == STEEL) return 0.5;
}
if (atk == FAIRY) {
if (def == FIGHTING || def == DRAGON || def == DARK) return 2.0;
if (def == FIRE || def == POISON || def == STEEL) return 0.5;
}
if (atk == POISON) {
if (def == GRASS || def == FAIRY) return 2.0;
if (def == POISON || def == GROUND || def == ROCK || def == GHOST) return 0.5;
if (def == STEEL) return 0.0;
}
if (atk == FLYING) {
if (def == GRASS || def == FIGHTING || def == BUG) return 2.0;
if (def == ELECTRIC || def == ROCK || def == STEEL) return 0.5;
}
if (atk == BUG) {
if (def == GRASS || def == PSYCHIC || def == DARK) return 2.0;
if (def == FIRE || def == FIGHTING || def == POISON || def == FLYING || def == GHOST || def == STEEL || def == FAIRY) return 0.5;
}
if (atk == ROCK) {
if (def == FIRE || def == ICE || def == FLYING || def == BUG) return 2.0;
if (def == FIGHTING || def == GROUND || def == STEEL) return 0.5;
}
return 1.0;
}
double calcTotalEffect(Type atk, Type def1, Type def2) {
return getEffectiveness(atk, def1) * getEffectiveness(atk, def2);
}
struct Skill {
string name;
Type type;
int power;
int hitRate;
int critRate;
};
struct Pokemon {
string name;
Type type1;
Type type2;
int maxHp;
int hp;
int atk;
Skill skill[4];
};
void printHp(Pokemon &p) {
cout << "[" << p.name << "] HP: " << p.hp << "/" << p.maxHp
<< " 属性:" << typeName(p.type1);
if (p.type2 != NORMAL) cout << "+" << typeName(p.type2);
cout << endl;
}
int attack(Pokemon &user, Skill &s, Pokemon &target) {
cout << "\n" << user.name << " 使用了 【" << s.name << "】(" << typeName(s.type) << " 威力:" << s.power << ")" << endl;
if (rand() % 100 + 1 > s.hitRate) {
cout << " → 没有命中!" << endl;
return 0;
}
double eff = calcTotalEffect(s.type, target.type1, target.type2);
int dmg = user.atk + s.power;
bool crit = false;
if (rand() % 100 + 1 <= s.critRate) {
dmg *= 2;
crit = true;
}
dmg = (int)(dmg * eff);
if (eff >= 2.0) cout << " → ✨ 效果绝佳!";
else if (eff <= 0.5 && eff > 0) cout << " → ☁️ 效果不理想…";
else if (eff == 0) cout << " → ❌ 无效!";
if (crit) cout << " 💥 暴击!";
cout << endl;
cout << " → 对【" << target.name << "】造成【" << dmg << "点伤害】!" << endl;
return dmg;
}
void showSkills(Pokemon &p) {
cout << "\n可用技能:" << endl;
for (int i = 0; i < 4; i++) {
cout << i+1 << ". " << p.skill[i].name
<< " [" << typeName(p.skill[i].type) << "]"
<< " 威力:" << p.skill[i].power
<< " 命中:" << p.skill[i].hitRate << "%" << endl;
}
}
int chooseSkill(Pokemon &p) {
showSkills(p);
int c;
cout << "\n选择技能(1-4):";
cin >> c;
while (c < 1 || c > 4) cin >> c;
return c - 1;
}
//==============================================================================
// 40 只宝可梦正式开始
//==============================================================================
// 1
void Pikachu(Pokemon &p) {
p = {"皮卡丘", ELECTRIC, NORMAL, 150,150,32, {
{"撞击",NORMAL,40,95,10},
{"电光一闪",NORMAL,40,100,10},
{"十万伏特",ELECTRIC,90,90,15},
{"打雷",ELECTRIC,110,70,20}
}};
}
// 2
void Charmander(Pokemon &p) {
p = {"小火龙", FIRE, NORMAL, 155,155,30, {
{"抓",NORMAL,40,95,10},
{"火花",FIRE,40,100,10},
{"火焰漩涡",FIRE,35,85,15},
{"喷射火焰",FIRE,90,85,15}
}};
}
// 3
void Squirtle(Pokemon &p) {
p = {"杰尼龟", WATER, NORMAL, 158,158,29, {
{"撞击",NORMAL,40,95,10},
{"水枪",WATER,40,100,10},
{"泡沫光线",WATER,65,85,15},
{"水炮",WATER,110,80,15}
}};
}
//4
void Bulbasaur(Pokemon &p) {
p = {"妙蛙种子", GRASS, POISON, 160,160,28, {
{"撞击",NORMAL,40,95,10},
{"藤鞭",GRASS,45,100,10},
{"飞叶快刀",GRASS,55,95,20},
{"能量球",GRASS,90,80,15}
}};
}
//5
void Eevee(Pokemon &p) {
p = {"伊布", NORMAL, NORMAL, 140,140,25, {
{"撞击",NORMAL,40,95,10},
{"摇尾巴",NORMAL,0,100,0},
{"快速攻击",NORMAL,40,100,20},
{"珍藏",NORMAL,130,70,20}
}};
}
//6
void Psyduck(Pokemon &p) {
p = {"可达鸭", WATER, PSYCHIC, 155,155,27, {
{"抓",NORMAL,40,95,10},
{"水枪",WATER,40,100,10},
{"念力",PSYCHIC,50,100,10},
{"精神强念",PSYCHIC,90,90,15}
}};
}
//7
void Meowth(Pokemon &p) {
p = {"喵喵", NORMAL, NORMAL, 140,140,26, {
{"抓",NORMAL,40,95,10},
{"叫声",NORMAL,0,100,0},
{"聚宝功",NORMAL,40,100,10},
{"乱抓",NORMAL,18,85,30}
}};
}
//8
void Pidgeot(Pokemon &p) {
p = {"大比鸟", NORMAL, FLYING, 170,170,33, {
{"电光一闪",NORMAL,40,100,10},
{"翅膀攻击",FLYING,60,100,15},
{"空气斩",FLYING,75,95,20},
{"神鸟猛击",FLYING,140,70,30}
}};
}
//9
void Arbok(Pokemon &p) {
p = {"阿柏怪", POISON, NORMAL, 165,165,32, {
{"毒针",POISON,30,100,20},
{"缠绕",NORMAL,40,100,10},
{"毒液牙",POISON,50,100,20},
{"污泥炸弹",POISON,90,80,20}
}};
}
//10
void Gyarados(Pokemon &p) {
p = {"暴鲤龙", WATER, FLYING, 210,210,55, {
{"撞击",NORMAL,40,95,10},
{"水之波动",WATER,60,100,15},
{"攀瀑",WATER,80,90,20},
{"破坏光线",NORMAL,150,70,20}
}};
}
//11
void Alakazam(Pokemon &p) {
p = {"胡地", PSYCHIC, NORMAL, 190,190,50, {
{"念力",PSYCHIC,50,100,10},
{"精神利刃",PSYCHIC,70,100,20},
{"精神强念",PSYCHIC,90,90,15},
{"精神冲击",PSYCHIC,80,90,15}
}};
}
//12
void Arcanine(Pokemon &p) {
p = {"风速狗", FIRE, NORMAL, 200,200,48, {
{"火焰轮",FIRE,60,95,20},
{"咬碎",DARK,80,90,20},
{"喷射火焰",FIRE,90,85,15},
{"大字爆炎",FIRE,110,85,15}
}};
}
//13
void Lapras(Pokemon &p) {
p = {"乘龙", WATER, ICE, 220,220,45, {
{"水枪",WATER,40,100,10},
{"冰冻光束",ICE,90,90,15},
{"水炮",WATER,110,80,15},
{"暴风雪",ICE,110,70,20}
}};
}
//14
void Gengar(Pokemon &p) {
p = {"耿鬼", GHOST, POISON, 180,180,48, {
{"舌舔",GHOST,30,100,30},
{"暗影拳",GHOST,60,100,20},
{"暗影球",GHOST,80,100,15},
{"污泥炸弹",POISON,90,80,20}
}};
}
//15
void Dragonite(Pokemon &p) {
p = {"快龙", DRAGON, FLYING, 230,230,60, {
{"龙爪",DRAGON,80,100,20},
{"翅膀攻击",FLYING,60,100,15},
{"龙波动",DRAGON,90,100,15},
{"逆鳞",DRAGON,120,85,20}
}};
}
//16
void Metagross(Pokemon &p) {
p = {"巨金怪", STEEL, PSYCHIC, 220,220,62, {
{"念力",PSYCHIC,50,100,10},
{"铁头",STEEL,80,100,15},
{"精神强念",PSYCHIC,90,90,15},
{"彗星拳",STEEL,100,85,20}
}};
}
//17
void Salamence(Pokemon &p) {
p = {"暴飞龙", DRAGON, FLYING, 225,225,61, {
{"龙爪",DRAGON,80,100,20},
{"燕返",FLYING,60,100,20},
{"龙波动",DRAGON,90,100,15},
{"逆鳞",DRAGON,120,85,20}
}};
}
//18
void Tyranitar(Pokemon &p) {
p = {"班基拉斯", ROCK, DARK, 240,240,65, {
{"咬碎",DARK,80,90,20},
{"岩崩",ROCK,75,90,20},
{"蛮力",FIGHTING,120,80,10},
{"尖石攻击",ROCK,100,80,30}
}};
}
//19
void Blaziken(Pokemon &p) {
p = {"火焰鸡", FIRE, FIGHTING, 200,200,58, {
{"火花",FIRE,40,100,10},
{"上天拳",FIGHTING,85,90,15},
{"火焰踢",FIRE,85,90,15},
{"喷射火焰",FIRE,90,85,15}
}};
}
//20
void Gardevoir(Pokemon &p) {
p = {"沙奈朵", PSYCHIC, FAIRY, 195,195,55, {
{"念力",PSYCHIC,50,100,10},
{"魔法闪耀",FAIRY,80,100,15},
{"精神强念",PSYCHIC,90,90,15},
{"月亮之力",FAIRY,95,90,15}
}};
}
//21
void Mewtwo(Pokemon &p) {
p = {"超梦", PSYCHIC, NORMAL, 280,280,70, {
{"念力",PSYCHIC,50,100,10},
{"精神冲击",PSYCHIC,80,90,15},
{"精神强念",PSYCHIC,90,90,15},
{"精神击破",PSYCHIC,120,75,25}
}};
}
//22
void Mew(Pokemon &p) {
p = {"梦幻", PSYCHIC, NORMAL, 260,260,60, {
{"拍击",NORMAL,40,95,10},
{"精神波动",PSYCHIC,70,100,15},
{"变身",NORMAL,0,100,0},
{"精神强念",PSYCHIC,90,90,15}
}};
}
//23
void Rayquaza(Pokemon &p) {
p = {"烈空坐", DRAGON, FLYING, 300,300,75, {
{"逆鳞",DRAGON,120,85,20},
{"飞翔",FLYING,90,70,15},
{"龙波动",DRAGON,90,100,15},
{"画龙点睛",DRAGON,180,70,30}
}};
}
//24
void Groudon(Pokemon &p) {
p = {"固拉多", FIRE, GROUND, 310,310,78, {
{"地震",GROUND,100,100,20},
{"大字爆炎",FIRE,110,85,15},
{"断崖之剑",GROUND,120,85,25},
{"日光束",GRASS,120,70,20}
}};
}
//25
void Kyogre(Pokemon &p) {
p = {"盖欧卡", WATER, NORMAL, 310,310,75, {
{"水炮",WATER,110,80,15},
{"浊流",WATER,90,85,15},
{"根源波动",WATER,130,75,25},
{"冰冻光束",ICE,90,90,15}
}};
}
//26
void Dialga(Pokemon &p) {
p = {"帝牙卢卡", STEEL, DRAGON, 290,290,72, {
{"龙爪",DRAGON,80,100,20},
{"铁头",STEEL,80,100,15},
{"龙波动",DRAGON,90,100,15},
{"时光咆哮",DRAGON,150,70,30}
}};
}
//27
void Palkia(Pokemon &p) {
p = {"帕路奇亚", WATER, DRAGON, 290,290,72, {
{"龙爪",DRAGON,80,100,20},
{"水之波动",WATER,60,100,15},
{"水炮",WATER,110,80,15},
{"亚空裂斩",DRAGON,150,70,30}
}};
}
//28
void Giratina(Pokemon &p) {
p = {"骑拉帝纳", GHOST, DRAGON, 300,300,70, {
{"暗影爪",GHOST,70,100,25},
{"龙爪",DRAGON,80,100,20},
{"暗影球",GHOST,80,100,15},
{"影子突袭",GHOST,120,75,25}
}};
}
//29
void Arceus(Pokemon &p) {
p = {"阿尔宙斯", NORMAL, NORMAL, 320,320,80, {
{"制裁光砾",NORMAL,100,100,15},
{"精神强念",PSYCHIC,90,90,15},
{"地震",GROUND,100,100,20},
{"终极冲击",NORMAL,150,70,30}
}};
}
//30
void Lugia(Pokemon &p) {
p = {"洛奇亚", PSYCHIC, FLYING, 295,295,68, {
{"空气斩",FLYING,75,95,20},
{"精神强念",PSYCHIC,90,90,15},
{"水炮",WATER,110,80,15},
{"空中爆破",FLYING,100,75,25}
}};
}
//31
void HoOh(Pokemon &p) {
p = {"凤王", FIRE, FLYING, 295,295,70, {
{"火焰放射",FIRE,90,85,15},
{"神鸟猛击",FLYING,140,70,30},
{"大字爆炎",FIRE,110,85,15},
{"晨光",FIRE,0,100,0}
}};
}
//32
void Zekrom(Pokemon &p) {
p = {"捷克罗姆", DRAGON, ELECTRIC, 290,290,75, {
{"十字交叉闪电",ELECTRIC,100,100,15},
{"龙爪",DRAGON,80,100,20},
{"打雷",ELECTRIC,110,70,20},
{"雷击",ELECTRIC,130,75,25}
}};
}
//33
void Reshiram(Pokemon &p) {
p = {"莱希拉姆", DRAGON, FIRE, 290,290,75, {
{"十字交叉火焰",FIRE,100,100,15},
{"龙爪",DRAGON,80,100,20},
{"喷射火焰",FIRE,90,85,15},
{"青焰",FIRE,130,75,25}
}};
}
//34
void Kyurem(Pokemon &p) {
p = {"酋雷姆", DRAGON, ICE, 285,285,70, {
{"冰冻光束",ICE,90,90,15},
{"龙波动",DRAGON,90,100,15},
{"暴风雪",ICE,110,70,20},
{"冰封世界",ICE,90,90,15}
}};
}
//35
void Xerneas(Pokemon &p) {
p = {"哲尔尼亚斯", FAIRY, NORMAL, 290,290,68, {
{"魔法闪耀",FAIRY,80,100,15},
{"月亮之力",FAIRY,95,90,15},
{"精神强念",PSYCHIC,90,90,15},
{"大地掌控",FAIRY,0,100,0}
}};
}
//36
void Yveltal(Pokemon &p) {
p = {"伊裴尔塔尔", DARK, FLYING, 290,290,72, {
{"恶之波动",DARK,80,100,15},
{"空气斩",FLYING,75,95,20},
{"暗影球",GHOST,80,100,15},
{"死亡之翼",DARK,120,75,25}
}};
}
//37
void Zygarde(Pokemon &p) {
p = {"基格尔德", DRAGON, GROUND, 290,290,70, {
{"碎岩",ROCK,40,100,20},
{"龙爪",DRAGON,80,100,20},
{"地震",GROUND,100,100,20},
{"大地神力",GROUND,120,85,20}
}};
}
//38
void Silvally(Pokemon &p) {
p = {"银伴战兽", NORMAL, NORMAL, 270,270,65, {
{"多重攻击",NORMAL,50,100,15},
{"铁头",STEEL,80,100,15},
{"火焰牙",FIRE,65,95,20},
{"雷电牙",ELECTRIC,65,95,20}
}};
}
//39
void Necrozma(Pokemon &p) {
p = {"奈克洛兹玛", PSYCHIC, NORMAL, 280,280,72, {
{"念力",PSYCHIC,50,100,10},
{"精神利刃",PSYCHIC,70,100,20},
{"精神强念",PSYCHIC,90,90,15},
{"光子喷涌",PSYCHIC,100,90,20}
}};
}
//40
void Eternatus(Pokemon &p) {
p = {"无极汰那", POISON, DRAGON, 310,310,76, {
{"污泥炸弹",POISON,90,80,20},
{"龙爪",DRAGON,80,100,20},
{"龙波动",DRAGON,90,100,15},
{"无极巨炮",POISON,140,70,30}
}};
}
Pokemon getPokemonByID(int id) {
Pokemon p;
switch(id) {
case 1: Pikachu(p); break;
case 2: Charmander(p); break;
case 3: Squirtle(p); break;
case 4: Bulbasaur(p); break;
case 5: Eevee(p); break;
case 6: Psyduck(p); break;
case 7: Meowth(p); break;
case 8: Pidgeot(p); break;
case 9: Arbok(p); break;
case 10: Gyarados(p); break;
case 11: Alakazam(p); break;
case 12: Arcanine(p); break;
case 13: Lapras(p); break;
case 14: Gengar(p); break;
case 15: Dragonite(p); break;
case 16: Metagross(p); break;
case 17: Salamence(p); break;
case 18: Tyranitar(p); break;
case 19: Blaziken(p); break;
case 20: Gardevoir(p); break;
case 21: Mewtwo(p); break;
case 22: Mew(p); break;
case 23: Rayquaza(p); break;
case 24: Groudon(p); break;
case 25: Kyogre(p); break;
case 26: Dialga(p); break;
case 27: Palkia(p); break;
case 28: Giratina(p); break;
case 29: Arceus(p); break;
case 30: Lugia(p); break;
case 31: HoOh(p); break;
case 32: Zekrom(p); break;
case 33: Reshiram(p); break;
case 34: Kyurem(p); break;
case 35: Xerneas(p); break;
case 36: Yveltal(p); break;
case 37: Zygarde(p); break;
case 38: Silvally(p); break;
case 39: Necrozma(p); break;
case 40: Eternatus(p); break;
default: Pikachu(p);
}
return p;
}
Pokemon playerSelect() {
cout << "\n==================== 请选择你的宝可梦 (1-40) ====================\n";
cout << "1皮卡丘 2小火龙 3杰尼龟 4妙蛙种子 5伊布 6可达鸭 7喵喵 8大比鸟\n";
cout << "9阿柏怪 10暴鲤龙 11胡地 12风速狗 13乘龙 14耿鬼 15快龙 16巨金怪\n";
cout << "17暴飞龙 18班基拉斯 19火焰鸡 20沙奈朵 21超梦 22梦幻 23烈空坐 24固拉多\n";
cout << "25盖欧卡 26帝牙卢卡 27帕路奇亚 28骑拉帝纳 29阿尔宙斯 30洛奇亚 31凤王\n";
cout << "32捷克罗姆 33莱希拉姆 34酋雷姆 35哲尔尼亚斯 36伊裴尔塔尔 37基格尔德\n";
cout << "38银伴战兽 39奈克洛兹玛 40无极汰那\n";
cout << "==================================================================\n";
int c; cin >> c;
return getPokemonByID(c);
}
Pokemon randomEnemy() {
return getPokemonByID(rand()%40 + 1);
}
//==============================================================================
// 主程序
//==============================================================================
int main() {
srand((unsigned)time(NULL));
cout << "===============================" << endl;
cout << " 宝可梦对战 · 40 只完整版" << endl;
cout << "===============================" << endl;
Pokemon player = playerSelect();
Pokemon enemy = randomEnemy();
cout << "\n对战开始!对手是:【" << enemy.name << "】" << endl;
while (true) {
cout << "\n========================================" << endl;
printHp(player);
printHp(enemy);
int sk = chooseSkill(player);
int dmg = attack(player, player.skill[sk], enemy);
enemy.hp -= dmg;
if (enemy.hp <= 0) {
cout << "\n🎉 " << enemy.name << " 倒下了!你胜利了!" << endl;
break;
}
cout << "\n========================================" << endl;
cout << "【" << enemy.name << "】的回合!" << endl;
int esk = rand()%4;
int edmg = attack(enemy, enemy.skill[esk], player);
player.hp -= edmg;
if (player.hp <= 0) {
cout << "\n💀 " << player.name << " 倒下了…你输了!" << endl;
break;
}
}
cout << "\n游戏结束" << endl;
return 0;
}
好心人,点个赞
点赞才能复制
这里空空如也















有帮助,赞一个