Modifications et ajouts

- Lorsque on organisme fait une action et qu'un organisme meurt, définie une nouvelle variable "mort" à vraie, l'organisme reste dans le vecteur
- A la fin des actions de tout les organismes, le vecteur est nettoyé avec la nouvelle méthode "nettoyageMorts"
- Gestion de la faim du mouton
- Le loup meurt  s'il a trop faim
This commit is contained in:
Mylloon 2022-04-12 15:08:58 +02:00
parent 3ab72af9de
commit 68c22bf5ea
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
9 changed files with 40 additions and 22 deletions

View file

@ -38,7 +38,7 @@ class Animal: public Organisme {
// ID de l'univers, index dans l'univers, age max, faim max, vitesse
Animal(int, int, int, int, int);
virtual ~Animal(void);
~Animal(void);
// Animal carnivore ?
virtual bool carnivore(void) const noexcept = 0;

View file

@ -16,8 +16,6 @@ class Loup: public Animal {
// ID de l'univers, index dans l'univers
Loup(int, int);
~Loup(void);
// Renvoie vrai
bool carnivore(void) const noexcept;

View file

@ -24,6 +24,8 @@ class Organisme {
public:
const int ID; // ID unique pour chaque organisme
bool mort = false; // vrai si l'organisme est mort
// ID de l'Univers, type de l'organisme, index dans l'univers
Organisme(int, bool = true, int = -1);

View file

@ -39,6 +39,9 @@ class Univers {
// Vérifie s'il y a de la vie dans l'univers
bool enVie(void) const noexcept;
// Supprime les organismes mort du vecteur qui les stockes
void nettoyageMorts(void) noexcept;
};
#endif

View file

@ -151,17 +151,22 @@ void Evenement::lancerSimulation(Univers * univers) {
// pour déterminer l'ordre des actions, puis chaque organisme fait une action
// A la fin de chaque tour, on incrémente de 1 le nombre de tours
while(univers->enVie()) {
// Incrémente le nombre de tours
++univers->m_tour;
// On trie les organismes en fonction de leur vitesse
std::sort(univers->m_organismes_univers[univers->ID].begin(), univers->m_organismes_univers[univers->ID].end(), comp_organisme());
// Pour tout les organismes de notre univers
// Fais ce qu'il a à faire pendant son tour
// pour tout les organismes vivant de notre univers
for(auto it: univers->m_organismes_univers[univers->ID]) {
it->action(); // Fais ce qu'il a à faire pendant son tour
if(!it->mort) {
it->action();
}
}
// Incrémente le nombre de tours
++univers->m_tour;
break;
// Supprime les organismes mort du vecteur `Univers::m_organismes_univers`
univers->nettoyageMorts();
}
std::cout << "Fin de la simulation pour l'univers n°" << univers->ID << " !" << std::endl;

View file

@ -8,8 +8,6 @@ Loup::Loup(const int univers_ID, const int index): Animal(univers_ID, index, 60,
m_correspondance[ID] = _m_lettre;
}
Loup::~Loup(void) { }
int Loup::generationVitesse(void) const noexcept {
std::random_device nombre_aleatoire;
std::default_random_engine graine(nombre_aleatoire());
@ -37,8 +35,8 @@ void Loup::action(void) {
// S'accouple si besoin
/* ... */
if(m_age == m_age_max) { // meurt si trop vieux
delete this;
if(m_age > m_age_max || m_faim > m_faim_max) { // meurt si trop vieux ou trop faim
mort = true;
} else {
++m_age; // augmente l'âge
++m_faim; // augmente la faim

View file

@ -29,22 +29,23 @@ void Mouton::action(void) {
m_index = cases_possible[static_cast<uint64_t>(aleatoire(graine))];
// Mange de l'herbe si besoin
if(m_faim > 1) { // mange de l'herbe si besoin
for(auto organisme: Univers::m_organismes_univers[m_univers_ID]) { // regarde tout les organismes
if(organisme->position().first == m_index) { // si sur ma position
if(dynamic_cast<Herbe *>(organisme)) { // si c'est de l'herbe
delete organisme;
organisme->mort = true;
m_faim = 0;
break;
}
}
}
}
// S'accouple si besoin
/* ... */
if(m_age == m_age_max) { // meurt si trop vieux
delete this;
if(m_age > m_age_max || m_faim > m_faim_max) { // meurt si trop vieux ou trop faim
mort = true;
} else {
++m_age; // augmente l'âge
++m_faim; // augmente la faim

View file

@ -17,7 +17,7 @@ Sel::~Sel(void) {
void Sel::action(void) {
if(m_age == 1) { // devient de l'herbe au bout d'un tour
delete this;
mort = true;
} else {
++m_age;
}

View file

@ -45,3 +45,14 @@ bool Univers::enVie(void) const noexcept {
}
return true; // sinon l'univers est vivant
}
void Univers::nettoyageMorts(void) noexcept {
auto it = m_organismes_univers[ID].begin();
while(it != m_organismes_univers[ID].end()) { // parcours complet du vecteur
if((*it)->mort) { // si l'organisme est mort
delete *it; // on le supprime
} else { // sinon on va au prochain organisme du vecteur
++it;
}
}
}