1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
#include <iostream>
#include <string>
#include <iterator>
#include <exception>
#include <map>
enum CHRT {FstChrt = 0, Hero = FstChrt, Orc, Goblin, Rat, noChrts};
enum ATTKS {FstAttk = 0, Punch = FstAttk, Scratch, Sword, Rifle, Knife, NoAttks};
class Attack {
public:
Attack() = default;
Attack(ATTKS attk, const std::string& name, int power, int level) : mattk(attk), mName(name), mPower(power), mLevel(level) {}
std::string GetName() const {
return mName;
}
int GetPower() const {
return mPower;
}
ATTKS getId() const {
return mattk;
}
void SetName(const std::string& name) {
mName = name;
}
void IncrementLevel() {
++mLevel;
}
int GetLevel() const {
return mLevel;
}
private:
std::string mName;
int mPower { };
int mLevel { };
ATTKS mattk {};
};
using Attacks = std::map<ATTKS, Attack>;
class Character {
public:
Character() = default;
Character(CHRT chrt, const std::string& name, int health)
: mchrt(chrt), mName(name), mHealth(health) {}
Attack& GetAttackById(ATTKS attck) {
if (auto ret {mAttacks.find(attck)}; ret != mAttacks.end())
return ret->second;
throw std::runtime_error("Index error");
}
const Attack& GetAttackById(ATTKS attck) const {
if (auto ret { mAttacks.find(attck) }; ret != mAttacks.end())
return ret->second;
throw std::runtime_error("Index error");
}
Attacks& GetAttacks() {
return mAttacks;
}
const Attacks& GetAttacks() const {
return mAttacks;
}
size_t numAttacks() const {
return mAttacks.size();
}
void LearnAttack(Attack attack) {
mAttacks[attack.getId()] = std::move(attack);
}
std::string GetName() const {
return mName;
}
private:
std::string mName;
int mHealth {};
Attacks mAttacks {};
CHRT mchrt {};
};
using Characters = std::map<CHRT, Character>;
void ShowAttacks(const Characters& enemyList);
int main() {
Character player(Hero, "Hero", 100);
Characters enemyList { {Orc, {Orc, "orc", 100}},
{Goblin, {Goblin, "Goblin", 70}},
{Rat, {Rat, "Rat", 10}} };
// Default values.
const Attack punch(Punch, "Punch", 7, 1);
const Attack scratch(Scratch, "Scratch", 3, 1);
const Attack orcSword(Sword, "Orc Sword", 21, 1);
const Attack rifle(Rifle, "Rifle", 29, 1);
const Attack knife(Knife, "Knife", 11, 1);
enemyList[Orc].LearnAttack(punch);
enemyList[Orc].LearnAttack(orcSword);
enemyList[Goblin].LearnAttack(punch);
enemyList[Goblin].LearnAttack(scratch);
enemyList[Rat].LearnAttack(scratch);
player.LearnAttack(knife);
player.LearnAttack(rifle);
player.LearnAttack(punch);
player.GetAttackById(Knife).IncrementLevel();
enemyList[Rat].GetAttackById(Scratch).IncrementLevel();
ShowAttacks(enemyList);
}
void ShowAttacks(const Characters& enemyList) {
for (const auto& [cid, enemy] : enemyList) {
std::cout << "Enemy " << enemy.GetName() << ". Attack List Size: " << enemy.numAttacks() << '\n';
if (enemy.numAttacks() == 0)
std::cout << enemy.GetName() << " has no attacks!\n\n";
else
for (const auto& [attid, attk] : enemy.GetAttacks())
std::cout << attk.GetName() << " - LVL: " << attk.GetLevel() << '\n';
}
}
| |