c++洛克王国
2026-08-10 10:04:19
发布于:浙江
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
// 1. 技能类定义
class Skill {
public:
std::string name;
int pp;
int maxPp;
Skill(std::string n, int mPp) : name(n), pp(mPp), maxPp(mPp) {}
bool use() {
if (pp > 0) {
pp--;
return true;
}
return false;
}
void restore() { pp = maxPp; }
};
// 2. 宠物类定义(增加进化系统)
class Pet {
public:
stdstring name;
stdstring element;
int hp;
int maxHp;
int attack;
int level;
int exp;
std::vector<Skill> skills;
Pet(std::string n, std::string e, int hp, int atk, std::vector<Skill> sk)
: name(n), element(e), hp(hp), maxHp(hp), attack(atk), level(1), exp(0), skills(sk) {}
void takeDamage(int dmg) {
hp -= dmg;
if (hp < 0) hp = 0;
}
bool isAlive() const { return hp > 0; }
// 增加经验值并检查升级/进化
void gainExp(int amount) {
exp += amount;
int expNeeded = level * 20;
while (exp >= expNeeded) {
exp -= expNeeded;
level++;
maxHp += 5;
attack += 2;
hp = maxHp;
std::cout << "?? 升级啦!" << name << " 升到了 Lv." << level << "!\n";
std::cout << " 最大HP: " << maxHp << " | 攻击力: " << attack << "\n";
// 进化检查
checkEvolution();
expNeeded = level * 20;
}
}
// 进化逻辑
void checkEvolution() {
if (name == "火花" && level >= 5) {
evolve("焰火", "火", 80, 18, {Skill("烈焰冲击", 10), Skill("火焰漩涡", 8)});
} else if (name == "焰火" && level >= 10) {
evolve("火神", "火", 120, 28, {Skill("地狱烈焰", 10), Skill("炎爆术", 6)});
} else if (name == "蹦蹦种子" && level >= 5) {
evolve("叶精灵", "草", 75, 16, {Skill("飞叶快刀", 10), Skill("光合作用", 8)});
} else if (name == "水蓝蓝" && level >= 5) {
evolve("水灵", "水", 78, 17, {Skill("水流冲击", 10), Skill("水之波动", 8)});
}
}
// 执行进化
void evolve(std::string newName, std::string newElement, int newMaxHp, int newAttack, std::vector<Skill> newSkills) {
std::cout << "? 进化啦!" << name << " 进化成了 " << newName << "!\n";
name = newName;
element = newElement;
maxHp = newMaxHp;
attack = newAttack;
hp = maxHp; // 进化回满血
skills = newSkills; // 学习新技能
std::cout << " 新属性: " << element << " | 最大HP: " << maxHp << " | 攻击力: " << attack << "\n";
}
};
// 3. 地图类定义
class Map {
public:
std::string name;
int minLevel;
int maxLevel;
Map(std::string n, int minL, int maxL) : name(n), minLevel(minL), maxLevel(maxL) {}
};
// 4. 属性克制计算模块
double getMultiplier(const stdstring& atkElement, const stdstring& defElement) {
if ((atkElement == "火" && defElement == "草") ||
(atkElement == "草" && defElement == "水") ||
(atkElement == "水" && defElement == "火")) return 2.0;
if ((atkElement == "火" && defElement == "水") ||
(atkElement == "水" && defElement == "草") ||
(atkElement == "草" && defElement == "火")) return 0.5;
if ((atkElement == "光" && defElement == "暗") ||
(atkElement == "暗" && defElement == "光")) return 2.0;
if ((atkElement == "光" || atkElement == "暗") &&
(defElement == "火" || defElement == "水" || defElement == "草")) return 2.0;
if ((atkElement == "火" || atkElement == "水" || atkElement == "草") &&
(defElement == "光" || defElement == "暗")) return 0.5;
return 1.0;
}
// 5. 捕捉概率计算模块
bool tryCapture(const Pet& target) {
double baseRate = 1.0 - ((double)target.hp / target.maxHp);
double finalRate = baseRate + 0.15;
if (finalRate > 0.95) finalRate = 0.95;
double randomVal = (double)rand() / RAND_MAX;
return randomVal < finalRate;
}
// 6. 战斗系统
bool startBattle(Pet& playerPet, Pet& wildPet, stdvector<Pet>& backpack) {
stdcout << "\n?? 野生宠物 [" << wildPet.name << "](" << wildPet.element << ") Lv." << wildPet.level << " 出现了!\n";
while (playerPet.isAlive() && wildPet.isAlive()) {
std::cout << "\n---------------------------------\n";
std::cout << "你的宠物: " << playerPet.name << " Lv." << playerPet.level
<< " (HP: " << playerPet.hp << "/" << playerPet.maxHp << ")\n";
std::cout << "野生宠物: " << wildPet.name << " (HP: " << wildPet.hp << "/" << wildPet.maxHp << ")\n";
std::cout << "请选择操作:\n";
for (int i = 0; i < playerPet.skills.size(); ++i) {
std::cout << i + 1 << ". " << playerPet.skills[i].name
<< " (PP: " << playerPet.skills[i].pp << "/" << playerPet.skills[i].maxPp << ")\n";
}
std::cout << playerPet.skills.size() + 1 << ". 丢咕噜球捕捉\n";
int choice;
std::cout << "输入编号: ";
std::cin >> choice;
if (choice == playerPet.skills.size() + 1) {
std::cout << "你丢出了咕噜球...\n";
if (tryCapture(wildPet)) {
std::cout << "?? 咔嚓!成功捕捉到 [" << wildPet.name << "]!已存入背包。\n";
backpack.push_back(wildPet);
return true;
} else {
std::cout << "?? 哎呀!宠物挣脱了咕噜球!\n";
}
}
else if (choice >= 1 && choice <= playerPet.skills.size()) {
Skill& selectedSkill = playerPet.skills[choice - 1];
if (selectedSkill.pp <= 0) {
std::cout << "?? " << selectedSkill.name << " 的 PP 已耗尽,无法使用!\n";
continue;
}
selectedSkill.use();
double multi = getMultiplier(playerPet.element, wildPet.element);
int baseDmg = playerPet.attack + (rand() % 5);
int playerDmg = (int)(baseDmg * multi);
std::cout << playerPet.name << " 使用了 " << selectedSkill.name
<< ",造成 " << playerDmg << " 点伤害!";
if (multi > 1.0) std::cout << " (效果拔群!)";
else if (multi < 1.0) std::cout << " (效果不佳...)";
std::cout << "\n";
wildPet.takeDamage(playerDmg);
if (!wildPet.isAlive()) {
std::cout << "?? 胜利!野生宠物被击败了!\n";
int expGain = 10 + wildPet.maxHp / 2 + wildPet.level * 3;
std::cout << "?? 获得了 " << expGain << " 点经验值!\n";
playerPet.gainExp(expGain);
return true;
}
} else {
std::cout << "无效输入,跳过回合!\n";
continue;
}
// 敌方回合
double multi = getMultiplier(wildPet.element, playerPet.element);
int baseDmg = wildPet.attack + (rand() % 5);
int enemyDmg = (int)(baseDmg * multi);
std::cout << wildPet.name << " 反击,造成 " << enemyDmg << " 点伤害!";
if (multi > 1.0) std::cout << " (效果拔群!)";
else if (multi < 1.0) std::cout << " (效果不佳...)";
std::cout << "\n";
playerPet.takeDamage(enemyDmg);
if (!playerPet.isAlive()) {
std::cout << "?? 你的宠物倒下了... 战斗失败。\n";
return false;
}
}
return true;
}
// 7. 生成野生宠物(根据地图等级)
Pet generateWildPet(const Map& currentMap) {
int level = currentMap.minLevel + rand() % (currentMap.maxLevel - currentMap.minLevel + 1);
// 根据地图决定遇到的宠物种类
int type = rand() % 4;
if (currentMap.name == "彼得大道") {
if (type == 0) return Pet("蹦蹦种子", "草", 30 + level * 3, 6 + level, {Skill("藤条鞭击", 10)});
if (type == 1) return Pet("水蓝蓝", "水", 35 + level * 3, 7 + level, {Skill("水花飞溅", 10)});
if (type == 2) return Pet("火花", "火", 32 + level * 3, 7 + level, {Skill("火花撞击", 10)});
return Pet("圣光迪莫", "光", 40 + level * 3, 8 + level, {Skill("圣光裁决", 8)});
} else { // 维苏威火山
if (type == 0) return Pet("烈焰猩猩", "火", 50 + level * 4, 12 + level * 2, {Skill("火焰拳", 10)});
if (type == 1) return Pet("熔岩巨兽", "火", 60 + level * 4, 14 + level * 2, {Skill("岩浆喷射", 8)});
if (type == 2) return Pet("暗影魔灵", "暗", 55 + level * 4, 13 + level * 2, {Skill("暗影爪", 10)});
return Pet("圣光迪莫", "光", 58 + level * 4, 13 + level * 2, {Skill("圣光裁决", 8)});
}
}
// 8. 主游戏循环
int main() {
srand(time(0));
Pet starter("火花", "火", 50, 10, {Skill("火花撞击", 10), Skill("烈焰喷射", 5)});
std::vector<Pet> backpack;
backpack.push_back(starter);
int activePetIndex = 0;
// 地图列表
std::vector<Map> maps = {
Map("彼得大道", 1, 5),
Map("维苏威火山", 6, 12)
};
int currentMapIndex = 0;
std::cout << "=== 欢迎来到 C++ 文字版洛克王国 (V5.0) ===\n";
while (true) {
Pet& currentPet = backpack[activePetIndex];
Map& currentMap = maps[currentMapIndex];
std::cout << "\n【当前地点:" << currentMap.name << "】\n";
std::cout << "出战宠物: " << currentPet.name << " Lv." << currentPet.level
<< " (HP: " << currentPet.hp << "/" << currentPet.maxHp << ")\n";
std::cout << "1. 探索草丛\n2. 休息恢复\n3. 打开背包\n4. 切换地图\n5. 退出游戏\n";
int action;
std::cout << "你的选择: ";
std::cin >> action;
if (action == 1) {
if (!currentPet.isAlive()) {
std::cout << "?? 你的宠物已经倒下了,请先去休息恢复!\n";
continue;
}
int encounter = rand() % 4;
if (encounter < 3) { // 75% 概率遇到宠物
Pet wildPet = generateWildPet(currentMap);
startBattle(currentPet, wildPet, backpack);
} else {
std::cout << "你在草丛里走了一圈,什么也没遇到。\n";
}
} else if (action == 2) {
for (auto& pet : backpack) {
pet.hp = pet.maxHp;
for (auto& skill : pet.skills) {
skill.restore();
}
}
std::cout << "?? 宠物在宠物医院休息,所有宠物 HP 和技能 PP 已完全恢复!\n";
} else if (action == 3) {
std::cout << "\n?? === 宠物背包 ===\n";
for (int i = 0; i < backpack.size(); ++i) {
std::cout << i + 1 << ". " << backpack[i].name << " Lv." << backpack[i].level
<< " (" << backpack[i].element << ") HP:"
<< backpack[i].hp << "/" << backpack[i].maxHp;
if (i == activePetIndex) std::cout << " [出战中]";
std::cout << "\n";
}
std::cout << "0. 返回\n";
std::cout << "请输入要切换出战的宠物编号: ";
int switchChoice;
std::cin >> switchChoice;
if (switchChoice >= 1 && switchChoice <= backpack.size()) {
activePetIndex = switchChoice - 1;
std::cout << "? 已将 [" << backpack[activePetIndex].name << "] 设为出战宠物!\n";
}
} else if (action == 4) {
std::cout << "\n??? === 选择目的地 ===\n";
for (int i = 0; i < maps.size(); ++i) {
std::cout << i + 1 << ". " << maps[i].name
<< " (推荐等级: " << maps[i].minLevel << "-" << maps[i].maxLevel << ")";
if (i == currentMapIndex) std::cout << " [当前]";
std::cout << "\n";
}
std::cout << "0. 返回\n";
std::cout << "请输入地图编号: ";
int mapChoice;
std::cin >> mapChoice;
if (mapChoice >= 1 && mapChoice <= maps.size()) {
currentMapIndex = mapChoice - 1;
std::cout << "?? 你来到了 [" << maps[currentMapIndex].name << "]!\n";
}
} else if (action == 5) {
std::cout << "下次再来洛克王国玩哦!\n";
break;
} else {
std::cout << "无效的指令。\n";
}
}
return 0;
}
全部评论 2
可以发一个无障碍完整版代码吗?我想玩一下
1周前 来自 浙江
1作者牛福
1周前 来自 浙江
1















有帮助,赞一个