Ajouts et modifications
- Affichage de l'univers - Vecteur qui liste les index libres (rangés aléatoirement) - ID maintenant des short
This commit is contained in:
parent
d89af503e9
commit
7971c8b4f1
2 changed files with 59 additions and 29 deletions
73
univers.cpp
73
univers.cpp
|
@ -2,43 +2,70 @@
|
|||
|
||||
// -------- Univers --------
|
||||
|
||||
Univers::Univers(int m, int n): _m(m), _n(n), _tailleUnivers(m * n), _tailleMax(_tailleUnivers - _tailleUnivers / 4), _tour(0), _nbAnimaux(0) {
|
||||
Univers::Univers(int m, int n): _m(m), _n(n), _tailleUnivers(m * n), _tour(0), _nbAnimaux(0) {
|
||||
_plateau = new int[m * n](); // initialise toutes les valeurs du tableau à 0
|
||||
|
||||
// On ajoute tous les index possibles
|
||||
for(int i = 0; i < _tailleUnivers; i++)
|
||||
indexLibres.push_back(i);
|
||||
|
||||
// On mélange notre vecteur
|
||||
std::random_device nombreAleatoire;
|
||||
std::default_random_engine graine(nombreAleatoire());
|
||||
std::shuffle(indexLibres.begin(), indexLibres.end(), graine);
|
||||
|
||||
// On en retire quelque un pour évité de saturé notre univers
|
||||
while(indexLibres.size() > (uint64_t)_tailleUnivers - _tailleUnivers / 4)
|
||||
indexLibres.pop_back();
|
||||
}
|
||||
|
||||
Univers::~Univers(void) {
|
||||
delete[] _plateau;
|
||||
indexLibres.clear();
|
||||
}
|
||||
|
||||
void Univers::ajoutAnimaux(std::vector<Animal*> animaux) {
|
||||
const int nbOrganismeFinales = _nbAnimaux + animaux.size();
|
||||
if(nbOrganismeFinales > _tailleMax)
|
||||
if(animaux.size() > indexLibres.size())
|
||||
throw std::domain_error("Trop d'organismes pour l'univers.");
|
||||
|
||||
/* ici crée un truc qui stocke tous les index possible
|
||||
* pour éviter d'avoir a faire un random sur des index
|
||||
* déjà occupé par autre chose.
|
||||
* -> Quelque chose qui appartient directement à la classe ?
|
||||
* -> map/filter? */
|
||||
|
||||
while(_nbAnimaux < nbOrganismeFinales) {
|
||||
int i = rand() % _tailleUnivers; // case aléatoire
|
||||
if(_plateau[i] == 0) { // si on est sur de l'herbe
|
||||
_plateau[i] = animaux.back()->id(); // on place notre animal
|
||||
animaux.pop_back(); // on le retire du vecteur
|
||||
|
||||
_nbAnimaux++;
|
||||
}
|
||||
while(!animaux.empty()) {
|
||||
_plateau[indexLibres.back()] = animaux.back()->id(); // on place notre animal
|
||||
animaux.pop_back(); // on retire l'animal du vecteur
|
||||
indexLibres.pop_back(); // on retire l'index du vecteur
|
||||
}
|
||||
}
|
||||
|
||||
void Univers::ajoutOrganisme(Organisme * organisme, int index) {
|
||||
if(index > _tailleMax)
|
||||
throw std::range_error("Impossible de placer un organisme à l'index spécifié");
|
||||
if(index > _tailleUnivers)
|
||||
throw std::range_error("Impossible de placer un organisme à l'index spécifié.");
|
||||
|
||||
_plateau[index] = organisme->id(); // on place notre organisme
|
||||
}
|
||||
|
||||
void Univers::affichage(void) {
|
||||
for(int i = 0; i < _n * 5; i++)
|
||||
if(i == 0)
|
||||
std::cout << "┌";
|
||||
else
|
||||
std::cout << "─";
|
||||
std::cout << "┐" << std::endl;
|
||||
|
||||
std::cout << "│ ";
|
||||
for(int i = 0; i < _tailleUnivers; i += _n) {
|
||||
for(int j = 0; j < _n; j++)
|
||||
printf("%2d │ ", _plateau[i + j]);
|
||||
if(i != _tailleUnivers - _n) std::cout << std::endl << "│ ";
|
||||
}
|
||||
|
||||
std::cout << std::endl;
|
||||
for(int i = 0; i < _n * 5; i++)
|
||||
if(i == 0)
|
||||
std::cout << "└";
|
||||
else
|
||||
std::cout << "─";
|
||||
std::cout << "┘" << std::endl;
|
||||
}
|
||||
|
||||
bool Univers::enVie(void) const noexcept {
|
||||
return _nbAnimaux > 0;
|
||||
}
|
||||
|
@ -64,7 +91,7 @@ Herbe::Herbe(void): Organisme() {
|
|||
|
||||
}
|
||||
|
||||
int Herbe::id(void) const noexcept {
|
||||
short Herbe::id(void) const noexcept {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -75,7 +102,7 @@ Sel::Sel(void): Organisme() {
|
|||
|
||||
}
|
||||
|
||||
int Sel::id(void) const noexcept {
|
||||
short Sel::id(void) const noexcept {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -90,7 +117,7 @@ bool Mouton::carnivore(void) const noexcept {
|
|||
return false;
|
||||
}
|
||||
|
||||
int Mouton::id(void) const noexcept {
|
||||
short Mouton::id(void) const noexcept {
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -105,6 +132,6 @@ bool Loup::carnivore(void) const noexcept {
|
|||
return false;
|
||||
}
|
||||
|
||||
int Loup::id(void) const noexcept {
|
||||
short Loup::id(void) const noexcept {
|
||||
return 2;
|
||||
}
|
||||
|
|
15
univers.hpp
15
univers.hpp
|
@ -3,6 +3,8 @@
|
|||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <random>
|
||||
|
||||
class Organisme;
|
||||
class Animal;
|
||||
|
@ -10,9 +12,10 @@ class Animal;
|
|||
class Univers {
|
||||
friend class Organisme;
|
||||
|
||||
const int _m, _n, _tailleUnivers, _tailleMax;
|
||||
const int _m, _n, _tailleUnivers;
|
||||
int _tour, _nbAnimaux;
|
||||
int * _plateau;
|
||||
std::vector<int> indexLibres;
|
||||
|
||||
public:
|
||||
Univers(int, int);
|
||||
|
@ -40,7 +43,7 @@ class Organisme {
|
|||
* Si `ID < 0` -> non vivant
|
||||
* Si `ID > 0` -> vivant
|
||||
* Si `ID == 0` -> Herbe */
|
||||
virtual int id(void) const noexcept = 0;
|
||||
virtual short id(void) const noexcept = 0;
|
||||
};
|
||||
|
||||
class Animal: public Organisme {
|
||||
|
@ -56,7 +59,7 @@ class Herbe: public Organisme {
|
|||
Herbe(void);
|
||||
|
||||
// Représenté par "0" dans l'univers
|
||||
int id(void) const noexcept;
|
||||
short id(void) const noexcept;
|
||||
};
|
||||
|
||||
class Sel: public Organisme {
|
||||
|
@ -64,7 +67,7 @@ class Sel: public Organisme {
|
|||
Sel(void);
|
||||
|
||||
// Représenté par "-1" dans l'univers
|
||||
int id(void) const noexcept;
|
||||
short id(void) const noexcept;
|
||||
};
|
||||
|
||||
class Mouton: public Animal {
|
||||
|
@ -74,7 +77,7 @@ class Mouton: public Animal {
|
|||
bool carnivore(void) const noexcept;
|
||||
|
||||
// Représenté par "1" dans l'univers
|
||||
int id(void) const noexcept;
|
||||
short id(void) const noexcept;
|
||||
};
|
||||
|
||||
|
||||
|
@ -85,7 +88,7 @@ class Loup: public Animal {
|
|||
bool carnivore(void) const noexcept;
|
||||
|
||||
// Représenté par "2" dans l'univers
|
||||
int id(void) const noexcept;
|
||||
short id(void) const noexcept;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Reference in a new issue