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:
parent
b82bad7720
commit
654d1a4bec
2 changed files with 59 additions and 45 deletions
|
@ -12,12 +12,20 @@
|
||||||
class Univers {
|
class Univers {
|
||||||
friend class Organisme;
|
friend class Organisme;
|
||||||
|
|
||||||
const int _m, _n, _tailleUnivers;
|
const int _m, _n, _tailleUnivers; // dimensions de l'univers
|
||||||
int _tour, _nbAnimaux;
|
int _tour; // tour
|
||||||
int * _plateau;
|
int * _plateau; // tableau représentant l'univers
|
||||||
std::vector<int> indexLibres;
|
|
||||||
|
/* 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:
|
public:
|
||||||
|
const int ID; // ID unique pour chaque univers
|
||||||
|
|
||||||
Univers(int, int);
|
Univers(int, int);
|
||||||
~Univers(void);
|
~Univers(void);
|
||||||
|
|
||||||
|
@ -26,7 +34,7 @@ class Univers {
|
||||||
|
|
||||||
/* Modifie un organisme
|
/* Modifie un organisme
|
||||||
* Attention, écrase l'organisme précédent */
|
* Attention, écrase l'organisme précédent */
|
||||||
void modificationOrganisme(Organisme *, int);
|
// void modificationOrganisme(Organisme *, int);
|
||||||
|
|
||||||
// Affiche l'univers à l'instant présent
|
// Affiche l'univers à l'instant présent
|
||||||
void affichage(void) const noexcept;
|
void affichage(void) const noexcept;
|
||||||
|
|
|
@ -1,99 +1,105 @@
|
||||||
#include "../includes/univers.hpp"
|
#include "../includes/univers.hpp"
|
||||||
#include "../includes/herbe.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) {
|
// Initialisation du plateau avec que des 0
|
||||||
_plateau = new int[_tailleUnivers];
|
_plateau = new int[_tailleUnivers]();
|
||||||
|
|
||||||
// Remplie toutes les valeurs du tableau avec l'ID de l'herbe
|
// Stocke tous les index libres du plateau
|
||||||
Herbe herbe;
|
std::vector<int> indexLibres;
|
||||||
std::fill_n(_plateau, _tailleUnivers, herbe.id());
|
|
||||||
|
|
||||||
// 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++)
|
for(int i = 0; i < _tailleUnivers; i++)
|
||||||
indexLibres.push_back(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::random_device nombreAleatoire;
|
||||||
std::default_random_engine graine(nombreAleatoire());
|
std::default_random_engine graine(nombreAleatoire());
|
||||||
std::shuffle(indexLibres.begin(), indexLibres.end(), graine);
|
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
|
// Remplie quelques valeurs du tableau avec de l'herbe
|
||||||
while(indexLibres.size() > (uint64_t)_tailleUnivers - _tailleUnivers / 4)
|
for(int i = indexLibres.back(); indexLibres.size() > (uint64_t)_tailleUnivers - _tailleUnivers / 2; indexLibres.pop_back())
|
||||||
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) {
|
Univers::~Univers(void) {
|
||||||
delete[] _plateau;
|
delete[] _plateau; // on détruit notre plateau
|
||||||
}
|
}
|
||||||
|
|
||||||
void Univers::ajoutAnimaux(std::vector<Animal*> animaux) {
|
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.");
|
throw std::domain_error("Trop d'organismes pour l'univers.");
|
||||||
|
|
||||||
while(!animaux.empty()) {
|
while(!animaux.empty()) { // on rajoute les animaux stockés dans le vecteur
|
||||||
_plateau[indexLibres.back()] = animaux.back()->id(); // on place notre animal
|
_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
|
animaux.pop_back(); // on retire l'animal du vecteur
|
||||||
_nbAnimaux++; // incrémente le nombre d'animaux
|
listeUnivers[ID].first.pop_back(); // on retire l'index du vecteur
|
||||||
indexLibres.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)
|
if(index > _tailleUnivers)
|
||||||
throw std::range_error("Impossible de placer un organisme à l'index spécifié.");
|
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;
|
std::cout << "----------------------" << std::endl;
|
||||||
|
|
||||||
auto it = std::find(indexLibres.begin(), indexLibres.end(), index);
|
auto it = std::find(listeUnivers[ID].first.begin(), listeUnivers[ID].first.end(), index);
|
||||||
if(it == indexLibres.end()) { // si index non libre (pas présent dans le vecteur)
|
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
|
if(organisme->ID <= 0) // si c'est non vivant
|
||||||
indexLibres.push_back(index); // on le rajoute
|
listeUnivers[ID].first.push_back(index); // on le rajoute
|
||||||
} else { // si index libre (présent dans le vecteur)
|
} 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
|
_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;
|
std::cout << "----------------------" << std::endl;
|
||||||
}
|
} */
|
||||||
|
|
||||||
void Univers::affichage(void) const noexcept {
|
void Univers::affichage(void) const noexcept {
|
||||||
for(int i = 0; i < _n * 4; i++)
|
for(int i = 0; i < _n * 4; i++)
|
||||||
if(i == 0)
|
if(i == 0)
|
||||||
std::cout << "┌";
|
std::cout << "┌"; // coin supérieur gauche
|
||||||
else
|
else
|
||||||
std::cout << "─";
|
std::cout << "─"; // haut
|
||||||
std::cout << "┐" << std::endl;
|
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 i = 0; i < _tailleUnivers; i += _n) {
|
||||||
for(int j = 0; j < _n; j++) {
|
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)
|
if(j == _n - 1)
|
||||||
std::cout << " │ ";
|
std::cout << " │ "; // côté droit
|
||||||
else
|
else
|
||||||
std::cout << " ";
|
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;
|
std::cout << std::endl;
|
||||||
for(int i = 0; i < _n * 4; i++)
|
for(int i = 0; i < _n * 4; i++)
|
||||||
if(i == 0)
|
if(i == 0)
|
||||||
std::cout << "└";
|
std::cout << "└"; // coin inférieur gauche
|
||||||
else
|
else
|
||||||
std::cout << "─";
|
std::cout << "─"; // bas
|
||||||
std::cout << "┘" << std::endl;
|
std::cout << "┘" << std::endl; // coin inférieur droit
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Univers::enVie(void) const noexcept {
|
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
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue