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
|
||||
Animal(int, int, int, int, int);
|
||||
|
||||
virtual ~Animal(void);
|
||||
~Animal(void);
|
||||
|
||||
// Animal carnivore ?
|
||||
virtual bool carnivore(void) const noexcept = 0;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -29,13 +29,14 @@ void Mouton::action(void) {
|
|||
|
||||
m_index = cases_possible[static_cast<uint64_t>(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<Herbe *>(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<Herbe *>(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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue