Modifications

- Suppression du plateau, tout est stocké dans un vecteur lié à l'ID d'un univers
- Suppression de la méthode placant les animaux dans l'univers, ils s'insèrent maintenant directement grâce à leur constructeur
- L'affichage se base désormais sur le vecteur en récréant un plateau
This commit is contained in:
Mylloon 2022-04-04 23:23:48 +02:00
parent be2d39ee8c
commit 4929d5a997
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
2 changed files with 27 additions and 19 deletions

View file

@ -21,6 +21,8 @@ class Univers {
* - les organismes présent dans l'univers */
inline static std::map<int, std::pair<std::vector<int>, std::vector<Organisme*>>> listeUnivers;
inline static std::map<int, std::pair<int, int>> dimensionsUnivers; // Dimensions de l'univers (largeur, longueur)
inline static int __totalID; // s'incrémente à chaque création d'univers
public:

View file

@ -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<int> 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<Animal*> animaux) {
/* void Univers::ajoutAnimaux(std::vector<Animal*> 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<Animal*> 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<Animal*> 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 {