Ajout de l'ordre de passage des organismes à chaque tour dépendant de la vitesse de l'organisme

This commit is contained in:
Mylloon 2022-04-06 20:14:01 +02:00
parent e5dd9cc89b
commit 3053a940cf
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
6 changed files with 66 additions and 11 deletions

View file

@ -1,6 +1,8 @@
#ifndef ECOSYSTEME_ANIMAL_HPP
#define ECOSYSTEME_ANIMAL_HPP 1
#include <random>
#include "organisme.hpp"
/* Un animal possède une vitesse, plus il est rapide,
@ -13,8 +15,6 @@
class Animal: public Organisme {
protected:
const int m_vitesse; // vitesse de l'organisme
const int m_age_max; // age maximale que peut atteindre l'organisme
const int m_faim_max; // faim maximal que peut atteindre l'animal avant de mourir
@ -25,10 +25,12 @@ class Animal: public Organisme {
bool m_reproduire = true; // est-ce que l'animal peut se reproduire ?
// Renvoie une vitesse aléatoire
// Renvoie une vitesse aléatoire (+ élevé = + rapide)
virtual int generationVitesse(void) const noexcept = 0;
public:
const int vitesse; // vitesse de l'organisme
// ID de l'univers, age max, faim max, vitesse
Animal(int, int, int, int);

View file

@ -20,6 +20,37 @@ struct Evenement {
// Affiche un univers, possibilité d'afficher les
// traits séparant les valeurs du tableaux (par défaut : non)
static void affichage(Univers *, bool = false) noexcept;
private:
struct comp {
bool operator()(Organisme * organisme_a, Organisme * organisme_b) const {
int vitesse_a, vitesse_b;
// Si l'organisme est un animal, on utilises sa vitesse pour
// la comparaison, sinon on dit que la vitesse == - 1
if(Animal * animal_a = dynamic_cast<Animal *>(organisme_a)) {
vitesse_a = animal_a->vitesse;
} else {
vitesse_a = -1;
}
if(Animal * animal_b = dynamic_cast<Animal *>(organisme_b)) {
vitesse_b = animal_b->vitesse;
} else {
vitesse_b = -1;
}
// Si les vitesses sont égales, alors c'est l'ID
// (un peu comme la date de création / age) de l'organisme
// qui décide car + l'ID est faible, + tôt l'organisme à été
// créer, et on part du principe que + on est jeune + on est rapide
if(vitesse_a == vitesse_b) { // cas rare
return organisme_a->ID > organisme_b->ID;
}
return vitesse_a > vitesse_b;
}
};
};
#endif

View file

@ -1,16 +1,16 @@
#include "../includes/animal.hpp"
Animal::Animal(const int univers_ID, const int index, const int age_max,
const int faim_max, const int vitesse): Organisme(univers_ID, index),
m_vitesse(vitesse),
const int faim_max, const int p_vitesse): Organisme(univers_ID, index),
m_age_max(age_max),
m_faim_max(faim_max) { }
m_faim_max(faim_max),
vitesse(p_vitesse) { }
Animal::Animal(const int univers_ID, const int age_max,
const int faim_max, const int vitesse): Organisme(univers_ID),
m_vitesse(vitesse),
const int faim_max, const int p_vitesse): Organisme(univers_ID),
m_age_max(age_max),
m_faim_max(faim_max) { }
m_faim_max(faim_max),
vitesse(p_vitesse) { }
Animal::~Animal(void) { }

View file

@ -140,4 +140,18 @@ void Evenement::affichage(Univers * univers, const bool traits) noexcept {
void Evenement::lancerSimulation(Univers * univers) {
std::cout << "Lancement de la simulation pour l'univers n°" << univers->ID << "..." << std::endl;
while(univers->enVie()) {
// On trie les organismes en fonction de leur vitesse
std::sort(univers->m_liste_univers[univers->ID].second.begin(), univers->m_liste_univers[univers->ID].second.end(), comp());
for(auto it: univers->m_liste_univers[univers->ID].second) {
if(Animal * c = dynamic_cast<Animal *>(it)) {
std::cout << it->lettre(it->ID) << " (" << it->ID << ") : " << c->vitesse << std::endl;
} else {
std::cout << it->lettre(it->ID) << " (" << it->ID << ");" << std::endl;
}
}
break;
}
}

View file

@ -11,7 +11,11 @@ Loup::Loup(const int univers_ID, const int index): Animal(univers_ID, index, 60,
Loup::~Loup(void) { }
int Loup::generationVitesse(void) const noexcept {
return 0;
std::random_device nombre_aleatoire;
std::default_random_engine graine(nombre_aleatoire());
std::uniform_int_distribution<int> aleatoire(5, 20);
return aleatoire(graine);
}
bool Loup::carnivore(void) const noexcept {

View file

@ -9,7 +9,11 @@ Mouton::Mouton(const int univers_ID, const int index): Animal(univers_ID, index,
}
int Mouton::generationVitesse(void) const noexcept {
return 0;
std::random_device nombre_aleatoire;
std::default_random_engine graine(nombre_aleatoire());
std::uniform_int_distribution<int> aleatoire(0, 15);
return aleatoire(graine);
}
bool Mouton::carnivore(void) const noexcept {