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 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
| // g++ -Wall -Wextra mini_mini_mini_rpg.cpp -o mini_mini_mini_rpg && mini_mini_mini_rpg
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <stdexcept>
#include <map>
class personnage
{
private:
// Nom du personnage
std::string m_nom;
// Vie initiale du personne (le max)
unsigned int m_vie_initiale;
// Vie actuelle du personnage
unsigned int m_vie;
// Force du personnage
unsigned int m_force;
public:
// Constructeur
personnage
(
std::string const & nom = "", // Valeur par défaut pour std::map
unsigned int const vie = 20,
unsigned int const force = 5
) :
m_nom(nom), m_vie_initiale(vie), m_vie(vie), m_force(force)
{ }
// Retourne le nom
std::string const & nom() const { return m_nom; }
// Retourne la vie initiale (la vie maximale)
unsigned int vie_initiale() const { return m_vie_initiale; }
// Retourne la vie actuelle
unsigned int vie() const { return m_vie; }
// Retourne la force
unsigned int force() const { return m_force; }
// Le personnage est vivant
bool est_vivant() const { return m_vie != 0; }
// Le personnage est mort
bool est_mort() const { return !est_vivant(); }
// Le personnage est blessé
void recoit_degat(unsigned int const nb_degat)
{
if (nb_degat >= m_vie) { m_vie = 0; }
else { m_vie -= nb_degat; }
}
// Le personnage frappe un autre
void donne_coup(personnage & victime) const { victime.recoit_degat(m_force); }
// Le personnage boit une potion
void boire_potion() { boire_potion(2); }
// Le personnage boit une potion
void boire_superpotion() { boire_potion(4); }
// Le personnage est entièrement soigné
void restaure() { m_vie = m_vie_initiale; }
private:
// Le personnage boit une potion générique
void boire_potion(unsigned int const nb_point) { m_vie = std::min(m_vie + nb_point, m_vie_initiale); }
};
// Retourne une référence sur le personnage trouvé via son nom
// Lance une exception sinon
personnage & get_personnage_by_name(std::string const & nom_perso,std::vector<personnage> & persos)
{
for (std::size_t i = 0; i < persos.size(); ++i)
{
if (persos[i].nom() == nom_perso) { return persos[i]; }
}
throw std::logic_error("Le personnage " + nom_perso + "n'a pas été trouvé");
}
// Programme principal
int main()
{
// Exemple
{
// Création des personnages
std::vector<personnage> persos;
persos.push_back(personnage("Bruce"));
persos.push_back(personnage("Chuck"));
// Aide utilisateur
std::cout << "Deux personnages (Bruce et Chuck) se battent." << std::endl;
std::cout << "Personnages possibles : Bruce, Chuck" << std::endl;
std::cout << "Actions possibles : boire, frapper" << std::endl;
std::cout << "Cibles possibles (selon action) : potion, superpotion, Bruce, Chuck" << std::endl;
std::cout << std::endl;
// Tant qu'un personnage n'est pas mort
while (persos.at(0).est_vivant() && persos.at(1).est_vivant())
{
// Variables pour la saisie utilisateur
std::string nom_perso;
std::string action;
std::string cible;
// Saisie utilisateur
std::cout << "Personnage ? "; std::cout.flush(); std::cin >> nom_perso;
std::cout << "Action ? "; std::cout.flush(); std::cin >> action;
std::cout << "Cible ? "; std::cout.flush(); std::cin >> cible;
// On recupère le personnage
personnage & perso = get_personnage_by_name(nom_perso, persos);
// Action
if (action == "boire")
{
if (cible == "potion")
{
perso.boire_potion();
std::cout << "Le personnage " << perso.nom() << " boit une potion, sa vie est de " << perso.vie() << std::endl;
}
else if (cible == "superpotion")
{
perso.boire_superpotion();
std::cout << "Le personnage " << perso.nom() << " boit une superpotion, sa vie est de " << perso.vie() << std::endl;
}
else if (cible == perso.nom())
{
std::cout << "Le personnage " << perso.nom() << " avale sa salive *glup*" << std::endl;
}
else if (cible == "Bruce" || cible == "Chuck")
{
std::cout << "Le personnage " << perso.nom() << " essaye de lécher son adversaire, mais celui-ci refuse !" << std::endl;
}
else
{
std::cout << "Le personnage " << perso.nom() << " refuse de boire une telle chose !" << std::endl;
}
}
else if (action == "frapper")
{
if (cible == perso.nom())
{
perso.donne_coup(perso);
std::cout << "Le personnage " << perso.nom() << " se blesse... sa vie est de " << perso.vie() << std::endl;
}
else if (cible == "Bruce" || cible == "Chuck")
{
personnage & victime = get_personnage_by_name(cible, persos);
perso.donne_coup(victime);
std::cout << "Le personnage " << perso.nom() << " frappe " << cible << ", la vie de " << cible << " est de " << victime.vie() << std::endl;
}
else
{
std::cout << "Le personnage " << perso.nom() << " frappe le vent. Ce n'est pas très efficace..." << std::endl;
}
}
else
{
std::cout << "Le personnage " << perso.nom() << " est limité, il ne comprend pas cette action" << std::endl;
}
}
}
// On peux aussi utiliser des std::map (le nom est inutile)
{
std::map<std::string, personnage> persos;
persos["Bruce"] = personnage("Bruce", 21);
persos["Chuck"] = personnage("Chuck", 42);
std::string nom_perso;
std::cout << "Personnage ? "; std::cout.flush(); std::cin >> nom_perso;
if (persos.find(nom_perso) != persos.end()) // Si on fait pas le find, la map va créer le personnage
{
std::cout << "Le personnage " << nom_perso << " a " << persos[nom_perso].vie() << " points de vie" << std::endl;
}
else
{
std::cout << "Le personnage " << nom_perso << " n'existe pas" << std::endl;
}
}
return 0;
} |
Partager