Modifications

- Logs qui montrent ce que fais l'univers
- Affichage à chaque étape de l'univers
- Ajout d'une vérification si besoin lors du déplacement de l'animal
This commit is contained in:
Mylloon 2022-04-18 03:12:14 +02:00
parent 374b8d8fd5
commit 4a36eebed1
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
7 changed files with 32 additions and 10 deletions

View file

@ -60,7 +60,7 @@ class Animal: public Organisme {
// Déplace l'animal // Déplace l'animal
void deplacement(void) noexcept; void deplacement(void) noexcept;
void deplacement(int) noexcept; void deplacement(int, bool = true) noexcept;
public: public:
// Vrai si l'animal doit déposé des sédiment au sol à sa mort // Vrai si l'animal doit déposé des sédiment au sol à sa mort

View file

@ -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 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<int> aleatoire_enfant(0, cases_possible_enfant.size() - 1); std::uniform_int_distribution<int> aleatoire_enfant(0, cases_possible_enfant.size() - 1);
new Espece(m_univers_ID, cases_possible_enfant[static_cast<uint64_t>(aleatoire_enfant(graine))]); auto enfant = new Espece(m_univers_ID, cases_possible_enfant[static_cast<uint64_t>(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 } // sinon il ne nait pas
m_reproduire -= m_attente_reproduction; // doit attendre avant de pouvoir se reproduire encore m_reproduire -= m_attente_reproduction; // doit attendre avant de pouvoir se reproduire encore

View file

@ -3,6 +3,7 @@
#include <map> #include <map>
#include <system_error> #include <system_error>
#include <iostream>
class Organisme { class Organisme {
inline static int m_total_ID; // permet d'incrémenter de 1 l'ID de chaque 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 // Définit le comportement de l'organisme à chaque tour
virtual void action(void) = 0; 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<int, std::pair<int, int>> position(void) const noexcept; std::pair<int, std::pair<int, int>> position(void) const noexcept;
// Renvoie les coordonées de l'organisme en format "echequier" // Renvoie les coordonées de l'organisme en format "echequier"

View file

@ -124,15 +124,32 @@ int Animal::choixGenre(void) const noexcept {
return aleatoire(graine); return aleatoire(graine);
} }
void Animal::deplacement(int index) noexcept { void Animal::deplacement(int index, bool verification) noexcept {
// Si l'animal n'est pas entrain de s'accoupler // Si l'animal n'est pas entrain de s'accoupler et s'il n'est pas déjà à destination
if(m_partenaire == nullptr) { if(m_partenaire == nullptr && index != m_index) {
if(verification) {
// On vérifie que la destination est possible
std::vector<int> 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 // Ajoute l'index actuel au vecteurs des index libres
Univers::m_index_libres_univers[m_univers_ID].second.push_back(m_index); Univers::m_index_libres_univers[m_univers_ID].second.push_back(m_index);
std::cout << "'" << lettre(ID) << "' (" << ID << ") " << coordoneeeEchequier() << " -> ";
// Déplace l'animal // Déplace l'animal
m_index = index; m_index = index;
std::cout << coordoneeeEchequier() << std::endl;
// Retire la nouvel position du vecteur des index libre // Retire la nouvel position du vecteur des index libre
auto debut = Univers::m_index_libres_univers[m_univers_ID].second.begin(); auto debut = Univers::m_index_libres_univers[m_univers_ID].second.begin();
auto fin = Univers::m_index_libres_univers[m_univers_ID].second.end(); 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 { void Animal::deplacement(void) noexcept { // déplacement aléatoire
// Déplacement aléatoire
std::vector<int> cases_possible = casesPossible(); std::vector<int> cases_possible = casesPossible();
// On rajoute l'index actuel car l'animal peut décidé de rester sur place // On rajoute l'index actuel car l'animal peut décidé de rester sur place
cases_possible.push_back(m_index); cases_possible.push_back(m_index);
@ -154,5 +170,5 @@ void Animal::deplacement(void) noexcept {
std::default_random_engine graine(nombre_aleatoire()); std::default_random_engine graine(nombre_aleatoire());
std::uniform_int_distribution<int> aleatoire(0, cases_possible.size() - 1); std::uniform_int_distribution<int> aleatoire(0, cases_possible.size() - 1);
deplacement(cases_possible[static_cast<uint64_t>(aleatoire(graine))]); deplacement(cases_possible[static_cast<uint64_t>(aleatoire(graine))], false);
} }

View file

@ -164,6 +164,8 @@ void Evenement::lancerSimulation(Univers * univers) {
// Supprime les organismes mort du vecteur `Univers::m_organismes_univers` // Supprime les organismes mort du vecteur `Univers::m_organismes_univers`
univers->nettoyageMorts(); univers->nettoyageMorts();
affichage(univers);
} }
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;

View file

@ -40,8 +40,9 @@ void Loup::action(void) {
if(organisme->position().first == it) { // si 1 organisme sur la position if(organisme->position().first == it) { // si 1 organisme sur la position
if(auto proie = dynamic_cast<Mouton *>(organisme)) { // si c'est un mouton if(auto proie = dynamic_cast<Mouton *>(organisme)) { // si c'est un mouton
proie->m_deposer_sediment = false; proie->m_deposer_sediment = false;
organisme->mortOrganisme(organisme->m_superposable); proie->mortOrganisme(proie->m_superposable);
m_faim = 0; m_faim = 0;
std::cout << "'" << lettre(ID) << "' (" << ID << "/" << coordoneeeEchequier() << ") mange '" << lettre(proie->ID) << "' (" << proie->ID << "/" << proie->coordoneeeEchequier() << ")" << std::endl;
deplacement(proie->position().first); deplacement(proie->position().first);
break; break;
} }

View file

@ -38,6 +38,7 @@ void Mouton::action(void) {
if(organisme->position().first == m_index) { // si 1 organisme sur ma position if(organisme->position().first == m_index) { // si 1 organisme 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
organisme->mortOrganisme(organisme->m_superposable); organisme->mortOrganisme(organisme->m_superposable);
std::cout << "'" << lettre(ID) << "' (" << ID << "/" << coordoneeeEchequier() << ") mange '" << lettre(organisme->ID) << "' (" << organisme->ID << "/" << organisme->coordoneeeEchequier() << ")" << std::endl;
m_faim = 0; m_faim = 0;
break; break;
} }