Sépare les index libres pour les animaux du reste pour bien avoir m * n cases dispos
This commit is contained in:
parent
ed2bfbb2a3
commit
bc629b2374
4 changed files with 45 additions and 20 deletions
|
@ -20,11 +20,8 @@ class Organisme {
|
||||||
public:
|
public:
|
||||||
const int ID; // ID unique pour chaque organisme
|
const int ID; // ID unique pour chaque organisme
|
||||||
|
|
||||||
// ID de l'Univers, index dans l'univers
|
// ID de l'Univers, type de l'organisme, index dans l'univers
|
||||||
Organisme(int, int);
|
Organisme(int, bool = true, int = -1);
|
||||||
|
|
||||||
// ID de l'Univers (index aléatoire)
|
|
||||||
Organisme(int);
|
|
||||||
|
|
||||||
virtual ~Organisme(void);
|
virtual ~Organisme(void);
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
#include "../includes/animal.hpp"
|
#include "../includes/animal.hpp"
|
||||||
|
|
||||||
Animal::Animal(const int univers_ID, const int index, const int age_max,
|
Animal::Animal(const int univers_ID, const int index, const int age_max,
|
||||||
const int faim_max, const int p_vitesse): Organisme(univers_ID, index),
|
const int faim_max, const int p_vitesse): Organisme(univers_ID, false, index),
|
||||||
m_age_max(age_max),
|
m_age_max(age_max),
|
||||||
m_faim_max(faim_max),
|
m_faim_max(faim_max),
|
||||||
vitesse(p_vitesse) { }
|
vitesse(p_vitesse) { }
|
||||||
|
|
||||||
Animal::Animal(const int univers_ID, const int age_max,
|
Animal::Animal(const int univers_ID, const int age_max,
|
||||||
const int faim_max, const int p_vitesse): Organisme(univers_ID),
|
const int faim_max, const int p_vitesse): Organisme(univers_ID, false),
|
||||||
m_age_max(age_max),
|
m_age_max(age_max),
|
||||||
m_faim_max(faim_max),
|
m_faim_max(faim_max),
|
||||||
vitesse(p_vitesse) { }
|
vitesse(p_vitesse) { }
|
||||||
|
|
|
@ -1,23 +1,49 @@
|
||||||
#include "../includes/univers.hpp"
|
#include "../includes/univers.hpp"
|
||||||
#include "../includes/organisme.hpp"
|
#include "../includes/organisme.hpp"
|
||||||
|
|
||||||
Organisme::Organisme(const int univers_ID, const int index): m_univers_ID(univers_ID), m_index(index), ID(m_total_ID + 1) {
|
Organisme::Organisme(const int univers_ID, const bool superposable, const int index): m_univers_ID(univers_ID), m_index(index), ID(m_total_ID + 1) {
|
||||||
if(Univers::m_index_libres_univers[m_univers_ID].first.size() == 0) { // si il n'y a plus d'index de libres
|
// S'il n'y a plus d'index de libres
|
||||||
throw std::domain_error("Trop d'organismes pour l'univers.");
|
if(superposable) {
|
||||||
|
if(Univers::m_index_libres_univers[m_univers_ID].first.size() == 0) {
|
||||||
|
throw std::domain_error("Trop d'organismes \"superposable\" dans l'univers.");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(Univers::m_index_libres_univers[m_univers_ID].second.size() == 0) {
|
||||||
|
throw std::domain_error("Trop d'organismes \"non-superposable\" dans l'univers.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_total_ID = ID; // + 1 aux ID
|
m_total_ID = ID; // + 1 aux ID
|
||||||
|
|
||||||
|
// Ajoute l'organisme à la liste des organismes de l'univers
|
||||||
Univers::m_organismes_univers[m_univers_ID].push_back(this);
|
Univers::m_organismes_univers[m_univers_ID].push_back(this);
|
||||||
|
|
||||||
// Supprime l'index maintenant pris par un organisme
|
// Assigne un index à l'organisme dans l'univers
|
||||||
|
if(superposable) {
|
||||||
|
if(index == -1) { // aléatoire si non-renseigné
|
||||||
|
m_index = Univers::m_index_libres_univers[univers_ID].first.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retire l'index de la liste des index libres (superposable)
|
||||||
auto debut = Univers::m_index_libres_univers[m_univers_ID].first.begin();
|
auto debut = Univers::m_index_libres_univers[m_univers_ID].first.begin();
|
||||||
auto fin = Univers::m_index_libres_univers[m_univers_ID].first.end();
|
auto fin = Univers::m_index_libres_univers[m_univers_ID].first.end();
|
||||||
auto it = std::find(debut, fin, index);
|
auto it = std::find(debut, fin, m_index);
|
||||||
if(it != fin) {
|
if(it != fin) {
|
||||||
Univers::m_index_libres_univers[m_univers_ID].first.erase(it);
|
Univers::m_index_libres_univers[m_univers_ID].first.erase(it);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if(index == -1) { // aléatoire si non-renseigné
|
||||||
|
m_index = Univers::m_index_libres_univers[univers_ID].second.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
Organisme::Organisme(const int univers_ID): Organisme(univers_ID, Univers::m_index_libres_univers[univers_ID].first.back()) {}
|
// Retire l'index de la liste des index libres (non-superposable)
|
||||||
|
auto debut = Univers::m_index_libres_univers[m_univers_ID].second.begin();
|
||||||
|
auto fin = Univers::m_index_libres_univers[m_univers_ID].second.end();
|
||||||
|
auto it = std::find(debut, fin, m_index);
|
||||||
|
if(it != fin) {
|
||||||
|
Univers::m_index_libres_univers[m_univers_ID].second.erase(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Organisme::~Organisme(void) {
|
Organisme::~Organisme(void) {
|
||||||
// On remet notre index dans le vecteur des index vide
|
// On remet notre index dans le vecteur des index vide
|
||||||
|
|
|
@ -7,13 +7,15 @@ Univers::Univers(const int longueur, const int largeur): m_longueur(longueur),
|
||||||
ID(m_total_ID + 1) {
|
ID(m_total_ID + 1) {
|
||||||
m_total_ID = ID; // + 1 aux ID
|
m_total_ID = ID; // + 1 aux ID
|
||||||
|
|
||||||
// On ajoute tous les index possibles car pour l'instant le plateau est vide
|
// On ajoute tous les index possibles car pour l'instant car le plateau est vide
|
||||||
for(int i = 0; i < m_taille_univers; ++i) {
|
for(int i = 0; i < m_taille_univers; ++i) {
|
||||||
m_index_libres_univers[ID].first.push_back(i);
|
m_index_libres_univers[ID].first.push_back(i);
|
||||||
|
m_index_libres_univers[ID].second.push_back(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
// On mélange notre vecteur d'index non occupés
|
// On mélange nos vecteur d'index non occupés
|
||||||
melange(&m_index_libres_univers[ID].first);
|
melange(&m_index_libres_univers[ID].first);
|
||||||
|
melange(&m_index_libres_univers[ID].second);
|
||||||
|
|
||||||
// Remplie quelques valeurs du tableau avec de l'herbe
|
// Remplie quelques valeurs du tableau avec de l'herbe
|
||||||
while(m_index_libres_univers[ID].first.size() > static_cast<uint64_t>(m_taille_univers - m_taille_univers / 2)) {
|
while(m_index_libres_univers[ID].first.size() > static_cast<uint64_t>(m_taille_univers - m_taille_univers / 2)) {
|
||||||
|
|
Reference in a new issue