diff --git a/includes/animal.hpp b/includes/animal.hpp index 0ff3874..39b5c7e 100644 --- a/includes/animal.hpp +++ b/includes/animal.hpp @@ -60,7 +60,7 @@ class Animal: public Organisme { // Déplace l'animal void deplacement(void) noexcept; - void deplacement(int) noexcept; + void deplacement(int, bool = true) noexcept; public: // Vrai si l'animal doit déposé des sédiment au sol à sa mort diff --git a/includes/animal_template.hpp b/includes/animal_template.hpp index ee8760a..3470638 100644 --- a/includes/animal_template.hpp +++ b/includes/animal_template.hpp @@ -111,7 +111,8 @@ void Animal::procreation(void) noexcept { if(!cases_possible_enfant.empty()) { // on vérifie qu'il y a de la place dans l'univers pour accueillir l'enfant std::uniform_int_distribution aleatoire_enfant(0, cases_possible_enfant.size() - 1); - new Espece(m_univers_ID, cases_possible_enfant[static_cast(aleatoire_enfant(graine))]); + auto enfant = new Espece(m_univers_ID, cases_possible_enfant[static_cast(aleatoire_enfant(graine))]); + std::cout << "'" << lettre(ID) << "' (" << ID << "/" << coordoneeeEchequier() <<") fait naître '" << lettre(enfant->ID) << "' (" << enfant->ID << "/" << enfant->coordoneeeEchequier() << ")" << std::endl; } // sinon il ne nait pas m_reproduire -= m_attente_reproduction; // doit attendre avant de pouvoir se reproduire encore diff --git a/includes/organisme.hpp b/includes/organisme.hpp index 8263327..0adbc85 100644 --- a/includes/organisme.hpp +++ b/includes/organisme.hpp @@ -3,6 +3,7 @@ #include #include +#include class Organisme { inline static int m_total_ID; // permet d'incrémenter de 1 l'ID de chaque organisme @@ -39,7 +40,7 @@ class Organisme { // Définit le comportement de l'organisme à chaque tour virtual void action(void) = 0; - // Renvoie les positions exact de l'organisme dans l'univers donnée + // Renvoie les positions exact de l'organisme dans l'univers donnée (index/x;y) std::pair> position(void) const noexcept; // Renvoie les coordonées de l'organisme en format "echequier" diff --git a/src/animal.cpp b/src/animal.cpp index be41376..94cc9c9 100644 --- a/src/animal.cpp +++ b/src/animal.cpp @@ -124,15 +124,32 @@ int Animal::choixGenre(void) const noexcept { return aleatoire(graine); } -void Animal::deplacement(int index) noexcept { - // Si l'animal n'est pas entrain de s'accoupler - if(m_partenaire == nullptr) { +void Animal::deplacement(int index, bool verification) noexcept { + // Si l'animal n'est pas entrain de s'accoupler et s'il n'est pas déjà à destination + if(m_partenaire == nullptr && index != m_index) { + if(verification) { + // On vérifie que la destination est possible + std::vector vec = casesAlentours(); + + auto debut = vec.begin(); + auto fin = vec.end(); + auto it = std::find(debut, fin, index); + if(it == fin) { + std::cerr << "Impossible de déplacer l'animal vers cette position." << std::endl; + return; + } + } + // Ajoute l'index actuel au vecteurs des index libres Univers::m_index_libres_univers[m_univers_ID].second.push_back(m_index); + std::cout << "'" << lettre(ID) << "' (" << ID << ") " << coordoneeeEchequier() << " -> "; + // Déplace l'animal m_index = index; + std::cout << coordoneeeEchequier() << std::endl; + // Retire la nouvel position du vecteur des index libre auto debut = Univers::m_index_libres_univers[m_univers_ID].second.begin(); auto fin = Univers::m_index_libres_univers[m_univers_ID].second.end(); @@ -144,8 +161,7 @@ void Animal::deplacement(int index) noexcept { } -void Animal::deplacement(void) noexcept { - // Déplacement aléatoire +void Animal::deplacement(void) noexcept { // déplacement aléatoire std::vector cases_possible = casesPossible(); // On rajoute l'index actuel car l'animal peut décidé de rester sur place cases_possible.push_back(m_index); @@ -154,5 +170,5 @@ void Animal::deplacement(void) noexcept { std::default_random_engine graine(nombre_aleatoire()); std::uniform_int_distribution aleatoire(0, cases_possible.size() - 1); - deplacement(cases_possible[static_cast(aleatoire(graine))]); + deplacement(cases_possible[static_cast(aleatoire(graine))], false); } diff --git a/src/evenement.cpp b/src/evenement.cpp index 7f5e71b..4de0424 100644 --- a/src/evenement.cpp +++ b/src/evenement.cpp @@ -164,6 +164,8 @@ void Evenement::lancerSimulation(Univers * univers) { // Supprime les organismes mort du vecteur `Univers::m_organismes_univers` univers->nettoyageMorts(); + + affichage(univers); } 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 0fa412d..d6b2eb6 100644 --- a/src/loup.cpp +++ b/src/loup.cpp @@ -40,8 +40,9 @@ void Loup::action(void) { if(organisme->position().first == it) { // si 1 organisme sur la position if(auto proie = dynamic_cast(organisme)) { // si c'est un mouton proie->m_deposer_sediment = false; - organisme->mortOrganisme(organisme->m_superposable); + proie->mortOrganisme(proie->m_superposable); m_faim = 0; + std::cout << "'" << lettre(ID) << "' (" << ID << "/" << coordoneeeEchequier() << ") mange '" << lettre(proie->ID) << "' (" << proie->ID << "/" << proie->coordoneeeEchequier() << ")" << std::endl; deplacement(proie->position().first); break; } diff --git a/src/mouton.cpp b/src/mouton.cpp index 44a08a9..09b1991 100644 --- a/src/mouton.cpp +++ b/src/mouton.cpp @@ -38,6 +38,7 @@ void Mouton::action(void) { if(organisme->position().first == m_index) { // si 1 organisme sur ma position if(dynamic_cast(organisme)) { // si c'est de l'herbe organisme->mortOrganisme(organisme->m_superposable); + std::cout << "'" << lettre(ID) << "' (" << ID << "/" << coordoneeeEchequier() << ") mange '" << lettre(organisme->ID) << "' (" << organisme->ID << "/" << organisme->coordoneeeEchequier() << ")" << std::endl; m_faim = 0; break; }