From 68c22bf5eaf3651dc52dfb6f2edf9faeba94cf50 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Tue, 12 Apr 2022 15:08:58 +0200 Subject: [PATCH] =?UTF-8?q?Modifications=20et=20ajouts=20-=20Lorsque=20on?= =?UTF-8?q?=20organisme=20fait=20une=20action=20et=20qu'un=20organisme=20m?= =?UTF-8?q?eurt,=20d=C3=A9finie=20une=20nouvelle=20variable=20"mort"=20?= =?UTF-8?q?=C3=A0=20vraie,=20l'organisme=20reste=20dans=20le=20vecteur=20-?= =?UTF-8?q?=20A=20la=20fin=20des=20actions=20de=20tout=20les=20organismes,?= =?UTF-8?q?=20le=20vecteur=20est=20nettoy=C3=A9=20avec=20la=20nouvelle=20m?= =?UTF-8?q?=C3=A9thode=20"nettoyageMorts"=20-=20Gestion=20de=20la=20faim?= =?UTF-8?q?=20du=20mouton=20-=20Le=20loup=20meurt=20=20s'il=20a=20trop=20f?= =?UTF-8?q?aim?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/animal.hpp | 2 +- includes/loup.hpp | 2 -- includes/organisme.hpp | 2 ++ includes/univers.hpp | 3 +++ src/evenement.cpp | 15 ++++++++++----- src/loup.cpp | 6 ++---- src/mouton.cpp | 19 ++++++++++--------- src/sel.cpp | 2 +- src/univers.cpp | 11 +++++++++++ 9 files changed, 40 insertions(+), 22 deletions(-) diff --git a/includes/animal.hpp b/includes/animal.hpp index 0fb5dac..66ab29e 100644 --- a/includes/animal.hpp +++ b/includes/animal.hpp @@ -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; diff --git a/includes/loup.hpp b/includes/loup.hpp index 49ef89c..4e84e01 100644 --- a/includes/loup.hpp +++ b/includes/loup.hpp @@ -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; diff --git a/includes/organisme.hpp b/includes/organisme.hpp index 608013f..4738731 100644 --- a/includes/organisme.hpp +++ b/includes/organisme.hpp @@ -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); diff --git a/includes/univers.hpp b/includes/univers.hpp index 87564a5..8a2ff96 100644 --- a/includes/univers.hpp +++ b/includes/univers.hpp @@ -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 diff --git a/src/evenement.cpp b/src/evenement.cpp index 7b782db..5a5f089 100644 --- a/src/evenement.cpp +++ b/src/evenement.cpp @@ -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; diff --git a/src/loup.cpp b/src/loup.cpp index 2a1b2c0..ff57139 100644 --- a/src/loup.cpp +++ b/src/loup.cpp @@ -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 diff --git a/src/mouton.cpp b/src/mouton.cpp index afded54..9643b08 100644 --- a/src/mouton.cpp +++ b/src/mouton.cpp @@ -29,13 +29,14 @@ void Mouton::action(void) { m_index = cases_possible[static_cast(aleatoire(graine))]; - // 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(organisme)) { // si c'est de l'herbe - delete organisme; - m_faim = 0; - break; + 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(organisme)) { // si c'est de l'herbe + organisme->mort = true; + m_faim = 0; + break; + } } } } @@ -43,8 +44,8 @@ void Mouton::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 diff --git a/src/sel.cpp b/src/sel.cpp index 491fd7c..e1a6d3e 100644 --- a/src/sel.cpp +++ b/src/sel.cpp @@ -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; } diff --git a/src/univers.cpp b/src/univers.cpp index 4c6ad0e..cad16a6 100644 --- a/src/univers.cpp +++ b/src/univers.cpp @@ -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; + } + } +}