diff --git a/includes/univers.hpp b/includes/univers.hpp index 301010f..e7e8418 100644 --- a/includes/univers.hpp +++ b/includes/univers.hpp @@ -12,12 +12,20 @@ class Univers { friend class Organisme; - const int _m, _n, _tailleUnivers; - int _tour, _nbAnimaux; - int * _plateau; - std::vector indexLibres; + const int _m, _n, _tailleUnivers; // dimensions de l'univers + int _tour; // tour + int * _plateau; // tableau représentant l'univers + + /* Stocke pour chaque numéro d'univers : + * - les index libres (non occupés) + * - les organismes présent dans l'univers */ + inline static std::map, std::vector>> listeUnivers; + + inline static int __totalID; // s'incrémente à chaque création d'univers public: + const int ID; // ID unique pour chaque univers + Univers(int, int); ~Univers(void); @@ -26,7 +34,7 @@ class Univers { /* Modifie un organisme * Attention, écrase l'organisme précédent */ - void modificationOrganisme(Organisme *, int); + // void modificationOrganisme(Organisme *, int); // Affiche l'univers à l'instant présent void affichage(void) const noexcept; diff --git a/src/univers.cpp b/src/univers.cpp index 0a8fe7e..81e69c8 100644 --- a/src/univers.cpp +++ b/src/univers.cpp @@ -1,99 +1,105 @@ #include "../includes/univers.hpp" #include "../includes/herbe.hpp" -// -------- Univers -------- +Univers::Univers(int longueur, int largeur): _m(longueur), _n(largeur), _tailleUnivers(longueur * largeur), _tour(0), ID(__totalID + 1) { + __totalID = ID; // + 1 aux ID -Univers::Univers(int m, int n): _m(m), _n(n), _tailleUnivers(m * n), _tour(0), _nbAnimaux(0) { - _plateau = new int[_tailleUnivers]; + // Initialisation du plateau avec que des 0 + _plateau = new int[_tailleUnivers](); - // Remplie toutes les valeurs du tableau avec l'ID de l'herbe - Herbe herbe; - std::fill_n(_plateau, _tailleUnivers, herbe.id()); + // Stocke tous les index libres du plateau + std::vector indexLibres; - // On ajoute tous les index possibles + // On ajoute tous les index possibles car pour l'instant le plateau est vide for(int i = 0; i < _tailleUnivers; i++) indexLibres.push_back(i); - // On mélange notre vecteur + // On mélange notre vecteur d'index non occupés std::random_device nombreAleatoire; std::default_random_engine graine(nombreAleatoire()); std::shuffle(indexLibres.begin(), indexLibres.end(), graine); - //std::random_shuffle(indexLibres.begin(), indexLibres.end()); // random pas vraiment random pour les tests - // On en retire quelque un pour évité de saturé notre univers - while(indexLibres.size() > (uint64_t)_tailleUnivers - _tailleUnivers / 4) - indexLibres.pop_back(); + // Remplie quelques valeurs du tableau avec de l'herbe + for(int i = indexLibres.back(); indexLibres.size() > (uint64_t)_tailleUnivers - _tailleUnivers / 2; indexLibres.pop_back()) + _plateau[indexLibres.back()] = Herbe(ID, i / _n, i % _n).ID; + + /* On stocke notre vecteur contenant nos index libres + * dans la liste des univers, en l'associant à notre + * ID unique d'univers */ + listeUnivers[ID].first = indexLibres; } Univers::~Univers(void) { - delete[] _plateau; + delete[] _plateau; // on détruit notre plateau } void Univers::ajoutAnimaux(std::vector animaux) { - if(animaux.size() > indexLibres.size()) + if(animaux.size() > listeUnivers[ID].first.size()) // si il n'y a plus d'index de libres throw std::domain_error("Trop d'organismes pour l'univers."); - while(!animaux.empty()) { - _plateau[indexLibres.back()] = animaux.back()->id(); // on place notre animal + while(!animaux.empty()) { // on rajoute les animaux stockés dans le vecteur + _plateau[listeUnivers[ID].first.back()] = animaux.back()->ID; // on place l'ID unique de l'animal animaux.pop_back(); // on retire l'animal du vecteur - _nbAnimaux++; // incrémente le nombre d'animaux - indexLibres.pop_back(); // on retire l'index du vecteur + listeUnivers[ID].first.pop_back(); // on retire l'index du vecteur } } -void Univers::modificationOrganisme(Organisme * organisme, int index) { +/* void Univers::modificationOrganisme(Organisme * organisme, int index) { if(index > _tailleUnivers) throw std::range_error("Impossible de placer un organisme à l'index spécifié."); - _plateau[index] = organisme->id(); // on place notre organisme + _plateau[index] = organisme->ID; // on place notre organisme - std::cout << "indexLibres.size() -> " << indexLibres.size() << std::endl; + std::cout << "listeUnivers[ID].size() -> " << listeUnivers[ID].first.size() << std::endl; std::cout << "----------------------" << std::endl; - auto it = std::find(indexLibres.begin(), indexLibres.end(), index); - if(it == indexLibres.end()) { // si index non libre (pas présent dans le vecteur) - if(organisme->id() <= 0) // si c'est non vivant - indexLibres.push_back(index); // on le rajoute + auto it = std::find(listeUnivers[ID].first.begin(), listeUnivers[ID].first.end(), index); + if(it == listeUnivers[ID].first.end()) { // si index non libre (pas présent dans le vecteur) + if(organisme->ID <= 0) // si c'est non vivant + listeUnivers[ID].first.push_back(index); // on le rajoute } else { // si index libre (présent dans le vecteur) - if(organisme->id() > 0) { // si c'est vivant + if(organisme->ID > 0) { // si c'est vivant _nbAnimaux++; // incrémente le nombre d'animaux - indexLibres.erase(it); // on le retire + listeUnivers[ID].first.erase(it); // on le retire } } - std::cout << "indexLibres.size() -> " << indexLibres.size() << std::endl; + std::cout << "listeUnivers[ID].size() -> " << listeUnivers[ID].first.size() << std::endl; std::cout << "----------------------" << std::endl; -} +} */ void Univers::affichage(void) const noexcept { for(int i = 0; i < _n * 4; i++) if(i == 0) - std::cout << "┌"; + std::cout << "┌"; // coin supérieur gauche else - std::cout << "─"; - std::cout << "┐" << std::endl; + std::cout << "─"; // haut + std::cout << "┐" << std::endl; // coin supérieur droit - std::cout << "│ "; + std::cout << "│ "; // premier côté gauche for(int i = 0; i < _tailleUnivers; i += _n) { for(int j = 0; j < _n; j++) { - std::cout << Organisme::correspondance(_plateau[i + j]); + std::cout << Organisme::lettre(_plateau[i + j]); if(j == _n - 1) - std::cout << " │ "; + std::cout << " │ "; // côté droit else std::cout << " "; } - if(i != _tailleUnivers - _n) std::cout << std::endl << "│ "; + if(i != _tailleUnivers - _n) std::cout << std::endl << "│ "; // saut de ligne et suite du côté gauche } std::cout << std::endl; for(int i = 0; i < _n * 4; i++) if(i == 0) - std::cout << "└"; + std::cout << "└"; // coin inférieur gauche else - std::cout << "─"; - std::cout << "┘" << std::endl; + std::cout << "─"; // bas + std::cout << "┘" << std::endl; // coin inférieur droit } bool Univers::enVie(void) const noexcept { - return _nbAnimaux > 0; + for(auto organisme: listeUnivers[ID].second) // on parcours les organismes de notre univers + if(organisme->animal()) // si on a un animal + return true; // renvoie true + return false; // sinon renvoie false }