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:
parent
374b8d8fd5
commit
4a36eebed1
7 changed files with 32 additions and 10 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue