diff --git a/includes/univers.hpp b/includes/univers.hpp index e7e8418..6b99cb0 100644 --- a/includes/univers.hpp +++ b/includes/univers.hpp @@ -21,6 +21,8 @@ class Univers { * - les organismes présent dans l'univers */ inline static std::map, std::vector>> listeUnivers; + inline static std::map> dimensionsUnivers; // Dimensions de l'univers (largeur, longueur) + inline static int __totalID; // s'incrémente à chaque création d'univers public: diff --git a/src/univers.cpp b/src/univers.cpp index 583d36d..12584be 100644 --- a/src/univers.cpp +++ b/src/univers.cpp @@ -1,39 +1,38 @@ #include "../includes/univers.hpp" #include "../includes/herbe.hpp" -Univers::Univers(int longueur, int largeur): _m(longueur), _n(largeur), _tailleUnivers(longueur * largeur), _tour(0), ID(__totalID + 1) { +Univers::Univers(int longueur, int largeur): _m(longueur), + _n(largeur), + _tailleUnivers(longueur * largeur), + _tour(0), + ID(__totalID + 1) { __totalID = ID; // + 1 aux ID - // Initialisation du plateau avec que des 0 - _plateau = new int[_tailleUnivers](); - - // Stocke tous les index libres du plateau - std::vector indexLibres; - // 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); + listeUnivers[ID].first.push_back(i); // 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::shuffle(listeUnivers[ID].first.begin(), listeUnivers[ID].first.end(), graine); // 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; + while(listeUnivers[ID].first.size() > (uint64_t)_tailleUnivers - _tailleUnivers / 2) { + new Herbe(ID, listeUnivers[ID].first.back()); + listeUnivers[ID].first.pop_back(); + } - /* 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; + // On stocke les dimensions pour chaque univers dans une map + dimensionsUnivers[ID] = std::make_pair(largeur, longueur); } Univers::~Univers(void) { - delete[] _plateau; // on détruit notre plateau + for(auto it: listeUnivers[ID].second) + delete it; } -void Univers::ajoutAnimaux(std::vector animaux) { +/* void Univers::ajoutAnimaux(std::vector animaux) { 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."); @@ -43,7 +42,7 @@ void Univers::ajoutAnimaux(std::vector animaux) { animaux.pop_back(); // on retire l'animal du vecteur listeUnivers[ID].first.pop_back(); // on retire l'index du vecteur } -} +} */ /* void Univers::modificationOrganisme(Organisme * organisme, int index) { if(index > _tailleUnivers) @@ -70,6 +69,11 @@ void Univers::ajoutAnimaux(std::vector animaux) { } */ void Univers::affichage(void) const noexcept { + // On génère le plateau pour l'affichage + int * plateau = new int[_tailleUnivers](); + for(auto it: listeUnivers[ID].second) + plateau[it->position(ID).first] = it->ID; + for(int i = 0; i < _n * 4; i++) if(i == 0) std::cout << "┌"; // coin supérieur gauche @@ -80,7 +84,7 @@ void Univers::affichage(void) const noexcept { std::cout << "│ "; // premier côté gauche for(int i = 0; i < _tailleUnivers; i += _n) { for(int j = 0; j < _n; j++) { - std::cout << Organisme::lettre(_plateau[i + j]); + std::cout << Organisme::lettre(plateau[i + j]); if(j == _n - 1) std::cout << " │ "; // côté droit else @@ -96,6 +100,8 @@ void Univers::affichage(void) const noexcept { else std::cout << "─"; // bas std::cout << "┘" << std::endl; // coin inférieur droit + + delete[] plateau; } bool Univers::enVie(void) const noexcept {