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:
parent
3ab72af9de
commit
68c22bf5ea
9 changed files with 40 additions and 22 deletions
|
@ -38,7 +38,7 @@ class Animal: public Organisme {
|
||||||
// ID de l'univers, index dans l'univers, age max, faim max, vitesse
|
// ID de l'univers, index dans l'univers, age max, faim max, vitesse
|
||||||
Animal(int, int, int, int, int);
|
Animal(int, int, int, int, int);
|
||||||
|
|
||||||
virtual ~Animal(void);
|
~Animal(void);
|
||||||
|
|
||||||
// Animal carnivore ?
|
// Animal carnivore ?
|
||||||
virtual bool carnivore(void) const noexcept = 0;
|
virtual bool carnivore(void) const noexcept = 0;
|
||||||
|
|
|
@ -16,8 +16,6 @@ class Loup: public Animal {
|
||||||
// ID de l'univers, index dans l'univers
|
// ID de l'univers, index dans l'univers
|
||||||
Loup(int, int);
|
Loup(int, int);
|
||||||
|
|
||||||
~Loup(void);
|
|
||||||
|
|
||||||
// Renvoie vrai
|
// Renvoie vrai
|
||||||
bool carnivore(void) const noexcept;
|
bool carnivore(void) const noexcept;
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,8 @@ class Organisme {
|
||||||
public:
|
public:
|
||||||
const int ID; // ID unique pour chaque organisme
|
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
|
// ID de l'Univers, type de l'organisme, index dans l'univers
|
||||||
Organisme(int, bool = true, int = -1);
|
Organisme(int, bool = true, int = -1);
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,9 @@ class Univers {
|
||||||
|
|
||||||
// Vérifie s'il y a de la vie dans l'univers
|
// Vérifie s'il y a de la vie dans l'univers
|
||||||
bool enVie(void) const noexcept;
|
bool enVie(void) const noexcept;
|
||||||
|
|
||||||
|
// Supprime les organismes mort du vecteur qui les stockes
|
||||||
|
void nettoyageMorts(void) noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -151,17 +151,22 @@ void Evenement::lancerSimulation(Univers * univers) {
|
||||||
// pour déterminer l'ordre des actions, puis chaque organisme fait une action
|
// 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
|
// A la fin de chaque tour, on incrémente de 1 le nombre de tours
|
||||||
while(univers->enVie()) {
|
while(univers->enVie()) {
|
||||||
|
// Incrémente le nombre de tours
|
||||||
|
++univers->m_tour;
|
||||||
|
|
||||||
// On trie les organismes en fonction de leur vitesse
|
// 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());
|
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]) {
|
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
|
// Supprime les organismes mort du vecteur `Univers::m_organismes_univers`
|
||||||
++univers->m_tour;
|
univers->nettoyageMorts();
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "Fin de la simulation pour l'univers n°" << univers->ID << " !" << std::endl;
|
std::cout << "Fin de la simulation pour l'univers n°" << univers->ID << " !" << std::endl;
|
||||||
|
|
|
@ -8,8 +8,6 @@ Loup::Loup(const int univers_ID, const int index): Animal(univers_ID, index, 60,
|
||||||
m_correspondance[ID] = _m_lettre;
|
m_correspondance[ID] = _m_lettre;
|
||||||
}
|
}
|
||||||
|
|
||||||
Loup::~Loup(void) { }
|
|
||||||
|
|
||||||
int Loup::generationVitesse(void) const noexcept {
|
int Loup::generationVitesse(void) const noexcept {
|
||||||
std::random_device nombre_aleatoire;
|
std::random_device nombre_aleatoire;
|
||||||
std::default_random_engine graine(nombre_aleatoire());
|
std::default_random_engine graine(nombre_aleatoire());
|
||||||
|
@ -37,8 +35,8 @@ void Loup::action(void) {
|
||||||
// S'accouple si besoin
|
// S'accouple si besoin
|
||||||
/* ... */
|
/* ... */
|
||||||
|
|
||||||
if(m_age == m_age_max) { // meurt si trop vieux
|
if(m_age > m_age_max || m_faim > m_faim_max) { // meurt si trop vieux ou trop faim
|
||||||
delete this;
|
mort = true;
|
||||||
} else {
|
} else {
|
||||||
++m_age; // augmente l'âge
|
++m_age; // augmente l'âge
|
||||||
++m_faim; // augmente la faim
|
++m_faim; // augmente la faim
|
||||||
|
|
|
@ -29,22 +29,23 @@ void Mouton::action(void) {
|
||||||
|
|
||||||
m_index = cases_possible[static_cast<uint64_t>(aleatoire(graine))];
|
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
|
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(organisme->position().first == m_index) { // si sur ma position
|
||||||
if(dynamic_cast<Herbe *>(organisme)) { // si c'est de l'herbe
|
if(dynamic_cast<Herbe *>(organisme)) { // si c'est de l'herbe
|
||||||
delete organisme;
|
organisme->mort = true;
|
||||||
m_faim = 0;
|
m_faim = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// S'accouple si besoin
|
// S'accouple si besoin
|
||||||
/* ... */
|
/* ... */
|
||||||
|
|
||||||
if(m_age == m_age_max) { // meurt si trop vieux
|
if(m_age > m_age_max || m_faim > m_faim_max) { // meurt si trop vieux ou trop faim
|
||||||
delete this;
|
mort = true;
|
||||||
} else {
|
} else {
|
||||||
++m_age; // augmente l'âge
|
++m_age; // augmente l'âge
|
||||||
++m_faim; // augmente la faim
|
++m_faim; // augmente la faim
|
||||||
|
|
|
@ -17,7 +17,7 @@ Sel::~Sel(void) {
|
||||||
|
|
||||||
void Sel::action(void) {
|
void Sel::action(void) {
|
||||||
if(m_age == 1) { // devient de l'herbe au bout d'un tour
|
if(m_age == 1) { // devient de l'herbe au bout d'un tour
|
||||||
delete this;
|
mort = true;
|
||||||
} else {
|
} else {
|
||||||
++m_age;
|
++m_age;
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,3 +45,14 @@ bool Univers::enVie(void) const noexcept {
|
||||||
}
|
}
|
||||||
return true; // sinon l'univers est vivant
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Reference in a new issue