Ajouts et modifications

- ID unique par univers dans une map contenant les index libres + les organismes présent
- nombre d'animaux donnée en fonction du vecteur contenant la liste des organismes présent dans l'univers
- Mise en commentaire de la méthode modifiant un organisme
- Modifications des commentaires
- l'herbe ne compose plus 100% de l'univers lors de la création
This commit is contained in:
Mylloon 2022-04-04 00:15:42 +02:00
parent b82bad7720
commit 654d1a4bec
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
2 changed files with 59 additions and 45 deletions

View file

@ -12,12 +12,20 @@
class Univers {
friend class Organisme;
const int _m, _n, _tailleUnivers;
int _tour, _nbAnimaux;
int * _plateau;
std::vector<int> 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<int, std::pair<std::vector<int>, std::vector<Organisme*>>> 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;

View file

@ -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<int> 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<Animal*> 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
}