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
|
||||
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
|
||||
|
|
|
@ -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<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
|
||||
|
||||
m_reproduire -= m_attente_reproduction; // doit attendre avant de pouvoir se reproduire encore
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include <map>
|
||||
#include <system_error>
|
||||
#include <iostream>
|
||||
|
||||
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<int, std::pair<int, int>> position(void) const noexcept;
|
||||
|
||||
// Renvoie les coordonées de l'organisme en format "echequier"
|
||||
|
|
|
@ -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<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
|
||||
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<int> 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<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`
|
||||
univers->nettoyageMorts();
|
||||
|
||||
affichage(univers);
|
||||
}
|
||||
|
||||
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(auto proie = dynamic_cast<Mouton *>(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;
|
||||
}
|
||||
|
|
|
@ -38,6 +38,7 @@ void Mouton::action(void) {
|
|||
if(organisme->position().first == m_index) { // si 1 organisme sur ma position
|
||||
if(dynamic_cast<Herbe *>(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;
|
||||
}
|
||||
|
|
Reference in a new issue