Sépare les organismes présent dans l'univers et les index libres
This commit is contained in:
parent
49da1c0d43
commit
ed2bfbb2a3
5 changed files with 28 additions and 24 deletions
|
@ -17,7 +17,8 @@ class Univers {
|
||||||
const int m_longueur, m_largeur, m_taille_univers; // dimensions de l'univers
|
const int m_longueur, m_largeur, m_taille_univers; // dimensions de l'univers
|
||||||
int m_tour; // âge de l'univers
|
int m_tour; // âge de l'univers
|
||||||
|
|
||||||
inline static std::map<int, std::pair<int, int>> m_dimensions_univers; // Dimensions de l'univers (largeur, longueur)
|
// Stocke pour chaque ID d'univers les dimensions de l'univers (largeur, longueur)
|
||||||
|
inline static std::map<int, std::pair<int, int>> m_dimensions_univers;
|
||||||
|
|
||||||
inline static int m_total_ID; // s'incrémente à chaque création d'univers
|
inline static int m_total_ID; // s'incrémente à chaque création d'univers
|
||||||
|
|
||||||
|
@ -25,10 +26,13 @@ class Univers {
|
||||||
static void melange(std::vector<int> * vecteur);
|
static void melange(std::vector<int> * vecteur);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Stocke pour chaque numéro d'univers :
|
// Stocke pour chaque ID d'univers les organismes présent dans l'univers
|
||||||
// - les index libres (non occupés)
|
inline static std::map<int, std::vector<Organisme*>> m_organismes_univers;
|
||||||
// - les organismes présent dans l'univers
|
|
||||||
inline static std::map<int, std::pair<std::vector<int>, std::vector<Organisme*>>> m_liste_univers;
|
// Stocke pour chaque ID d'univers les index libres
|
||||||
|
// first => organismes qui peuvent se superposer (herbe, sel...)
|
||||||
|
// second => organismes qui ne le peuvent pas (animaux)
|
||||||
|
inline static std::map<int, std::pair<std::vector<int>, std::vector<int>>> m_index_libres_univers;
|
||||||
|
|
||||||
const int ID; // ID unique pour chaque univers
|
const int ID; // ID unique pour chaque univers
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ void Evenement::affichage(Univers * univers, const bool traits) noexcept {
|
||||||
|
|
||||||
// On génère le plateau pour l'affichage
|
// On génère le plateau pour l'affichage
|
||||||
int * plateau = new int[univers->m_taille_univers]();
|
int * plateau = new int[univers->m_taille_univers]();
|
||||||
for(auto it: univers->m_liste_univers[univers->ID].second) {
|
for(auto it: univers->m_organismes_univers[univers->ID]) {
|
||||||
// Vérification : un animal doit avoir la priorité sur
|
// Vérification : un animal doit avoir la priorité sur
|
||||||
// un autre organisme dans l'affichage
|
// un autre organisme dans l'affichage
|
||||||
if(plateau[it->position(univers->ID).first] == 0) { // pas de souci, aucun organisme à cette position
|
if(plateau[it->position(univers->ID).first] == 0) { // pas de souci, aucun organisme à cette position
|
||||||
|
@ -152,10 +152,10 @@ void Evenement::lancerSimulation(Univers * univers) {
|
||||||
// A la fin de chaque tour, on incrémente de 1 le nombre de tours
|
// A la fin de chaque tour, on incrémente de 1 le nombre de tours
|
||||||
while(univers->enVie()) {
|
while(univers->enVie()) {
|
||||||
// On trie les organismes en fonction de leur vitesse
|
// On trie les organismes en fonction de leur vitesse
|
||||||
std::sort(univers->m_liste_univers[univers->ID].second.begin(), univers->m_liste_univers[univers->ID].second.end(), comp_organisme());
|
std::sort(univers->m_organismes_univers[univers->ID].begin(), univers->m_organismes_univers[univers->ID].end(), comp_organisme());
|
||||||
|
|
||||||
// Pour tout les organismes de notre univers
|
// Pour tout les organismes de notre univers
|
||||||
for(auto it: univers->m_liste_univers[univers->ID].second) {
|
for(auto it: univers->m_organismes_univers[univers->ID]) {
|
||||||
it->action(); // Fais ce qu'il a à faire pendant son tour
|
it->action(); // Fais ce qu'il a à faire pendant son tour
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,32 +2,32 @@
|
||||||
#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 int index): m_univers_ID(univers_ID), m_index(index), ID(m_total_ID + 1) {
|
||||||
if(Univers::m_liste_univers[m_univers_ID].first.size() == 0) { // si il n'y a plus d'index de libres
|
if(Univers::m_index_libres_univers[m_univers_ID].first.size() == 0) { // 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.");
|
||||||
}
|
}
|
||||||
m_total_ID = ID; // + 1 aux ID
|
m_total_ID = ID; // + 1 aux ID
|
||||||
Univers::m_liste_univers[m_univers_ID].second.push_back(this);
|
Univers::m_organismes_univers[m_univers_ID].push_back(this);
|
||||||
|
|
||||||
// Supprime l'index maintenant pris par un organisme
|
// Supprime l'index maintenant pris par un organisme
|
||||||
auto debut = Univers::m_liste_univers[m_univers_ID].first.begin();
|
auto debut = Univers::m_index_libres_univers[m_univers_ID].first.begin();
|
||||||
auto fin = Univers::m_liste_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, index);
|
||||||
if(it != fin) {
|
if(it != fin) {
|
||||||
Univers::m_liste_univers[m_univers_ID].first.erase(it);
|
Univers::m_index_libres_univers[m_univers_ID].first.erase(it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Organisme::Organisme(const int univers_ID): Organisme(univers_ID, Univers::m_liste_univers[univers_ID].first.back()) {}
|
Organisme::Organisme(const int univers_ID): Organisme(univers_ID, Univers::m_index_libres_univers[univers_ID].first.back()) {}
|
||||||
|
|
||||||
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
|
||||||
Univers::m_liste_univers[m_univers_ID].first.push_back(m_index);
|
Univers::m_index_libres_univers[m_univers_ID].first.push_back(m_index);
|
||||||
// Attention: si l'organisme meurt après avoir été mangé, il faut bien faire
|
// Attention: si l'organisme meurt après avoir été mangé, il faut bien faire
|
||||||
// attention que l'index libre soit véritablement libre et pas qu'il soit enfaite
|
// attention que l'index libre soit véritablement libre et pas qu'il soit enfaite
|
||||||
// prit par l'assassin de notre organisme actuel
|
// prit par l'assassin de notre organisme actuel
|
||||||
|
|
||||||
// On remélange notre vecteur
|
// On remélange notre vecteur
|
||||||
Univers::melange(&Univers::m_liste_univers[m_univers_ID].first);
|
Univers::melange(&Univers::m_index_libres_univers[m_univers_ID].first);
|
||||||
}
|
}
|
||||||
|
|
||||||
char Organisme::lettre(const int id) noexcept {
|
char Organisme::lettre(const int id) noexcept {
|
||||||
|
|
|
@ -11,11 +11,11 @@ Sel::Sel(const int univers_ID): Organisme(univers_ID) {
|
||||||
|
|
||||||
Sel::~Sel(void) {
|
Sel::~Sel(void) {
|
||||||
// On se supprime du vecteur
|
// On se supprime du vecteur
|
||||||
auto debut = Univers::m_liste_univers[m_univers_ID].second.begin();
|
auto debut = Univers::m_organismes_univers[m_univers_ID].begin();
|
||||||
auto fin = Univers::m_liste_univers[m_univers_ID].second.end();
|
auto fin = Univers::m_organismes_univers[m_univers_ID].end();
|
||||||
auto it = std::find(debut, fin, this);
|
auto it = std::find(debut, fin, this);
|
||||||
if(it != fin) {
|
if(it != fin) {
|
||||||
Univers::m_liste_univers[m_univers_ID].second.erase(it);
|
Univers::m_organismes_univers[m_univers_ID].erase(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
// On ajoute une herbe à la place
|
// On ajoute une herbe à la place
|
||||||
|
|
|
@ -9,14 +9,14 @@ Univers::Univers(const int longueur, const int largeur): m_longueur(longueur),
|
||||||
|
|
||||||
// On ajoute tous les index possibles car pour l'instant le plateau est vide
|
// On ajoute tous les index possibles car pour l'instant le plateau est vide
|
||||||
for(int i = 0; i < m_taille_univers; ++i) {
|
for(int i = 0; i < m_taille_univers; ++i) {
|
||||||
m_liste_univers[ID].first.push_back(i);
|
m_index_libres_univers[ID].first.push_back(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
// On mélange notre vecteur d'index non occupés
|
// On mélange notre vecteur d'index non occupés
|
||||||
melange(&m_liste_univers[ID].first);
|
melange(&m_index_libres_univers[ID].first);
|
||||||
|
|
||||||
// Remplie quelques valeurs du tableau avec de l'herbe
|
// Remplie quelques valeurs du tableau avec de l'herbe
|
||||||
while(m_liste_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)) {
|
||||||
// cast static grâce à "-Wold-style-cast" et "-Wsign-conversion"
|
// cast static grâce à "-Wold-style-cast" et "-Wsign-conversion"
|
||||||
new Herbe(ID);
|
new Herbe(ID);
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ Univers::Univers(const int longueur, const int largeur): m_longueur(longueur),
|
||||||
}
|
}
|
||||||
|
|
||||||
Univers::~Univers(void) {
|
Univers::~Univers(void) {
|
||||||
for(auto it: m_liste_univers[ID].second) { // Supprime les organismes présent dans l'univers
|
for(auto it: m_organismes_univers[ID]) { // Supprime les organismes présent dans l'univers
|
||||||
delete it;
|
delete it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ void Univers::melange(std::vector<int> * vecteur) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Univers::enVie(void) const noexcept {
|
bool Univers::enVie(void) const noexcept {
|
||||||
for(auto organisme: m_liste_univers[ID].second) { // on parcours les organismes de notre univers
|
for(auto organisme: m_organismes_univers[ID]) { // on parcours les organismes de notre univers
|
||||||
if(dynamic_cast<Animal *>(organisme)) { // si c'est un animal
|
if(dynamic_cast<Animal *>(organisme)) { // si c'est un animal
|
||||||
return true; // renvoie true
|
return true; // renvoie true
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue