summaryrefslogtreecommitdiff
path: root/sem_3/Programm/jeu_de_la_vie/arch/population.cpp
diff options
context:
space:
mode:
authorGaspard Coulet <gaspard.coulet@mines-ales.org>2021-04-28 23:05:53 +0200
committerGaspard Coulet <gaspard.coulet@mines-ales.org>2021-04-28 23:05:53 +0200
commit9fe033ea88c2f705ec18c232873d056e0c229d72 (patch)
tree0647dc8c51610c7336c88c04de2068ea14b21e17 /sem_3/Programm/jeu_de_la_vie/arch/population.cpp
Initial commit
Diffstat (limited to 'sem_3/Programm/jeu_de_la_vie/arch/population.cpp')
-rw-r--r--sem_3/Programm/jeu_de_la_vie/arch/population.cpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/sem_3/Programm/jeu_de_la_vie/arch/population.cpp b/sem_3/Programm/jeu_de_la_vie/arch/population.cpp
new file mode 100644
index 0000000..5655e2f
--- /dev/null
+++ b/sem_3/Programm/jeu_de_la_vie/arch/population.cpp
@@ -0,0 +1,145 @@
+#include <iostream>
+#include <cstdlib>
+#include <exception>
+#include "population.h"
+using namespace std;
+
+#define CHECK_BOUND(i,j) \
+ if (i>=N || j>=N){ \
+ std::cout<<"Accessing a Cell at ("<<i<<","<<j<<") out of range..." \
+ << " Aborting"<<std::endl; \
+ std::terminate(); \
+ }
+
+
+size_t Population::nb_voisins_vivants(size_t ci, size_t cj) const {
+ size_t cpt=0;
+ size_t imin,imax,jmin,jmax;
+ imin = ci==0?ci:ci-1;
+ imax = ci==(N-1)?ci:ci+1;
+ jmin = cj==0?cj:cj-1;
+ jmax = cj==(N-1)?cj:cj+1;
+
+ for (size_t i = imin ; i <= imax ; i++) {
+ for (size_t j = jmin ; j <= jmax ; j++) {
+ if (T[i][j].getVivante()) {
+ cpt++;
+ }
+ }
+ }
+ return cpt - (T[ci][cj].getVivante() ? 1 : 0);
+}
+
+void Population::updateColors() {
+ //calcule les cellules vivantes qui vont mourir
+ for (size_t i = 0 ; i < N ; i++) {
+ for (size_t j = 0 ; j < N ; j++) {
+ size_t voisin=nb_voisins_vivants(i, j);
+ if (voisin !=3 && voisin!=2 && T[i][j].getVivante())
+ T[i][j].doitMourir();
+ }
+ }
+}
+
+
+
+Population::Population() {
+ for (size_t i = 0 ; i < N ; i++) {
+ for (size_t j = 0 ; j < N ; j++) {
+ T[i][j].setX(i);
+ T[i][j].setY(j);
+ T[i][j].setVivante(false);
+ }
+ }
+}
+
+void Population::init(size_t n) {
+ srand(time(NULL));
+ if (nb_vivants()==0){
+ size_t i,j;
+ for (size_t k = 0 ; k < n ; k++) {
+ do {
+ i=rand()% N;
+ j=rand()% N;
+ } while ((T[i][j]).getVivante());
+ T[i][j].setVivante(true);
+ }
+ updateColors();
+ }
+}
+
+
+size_t Population::nb_cellules(Cellule::Couleur c) const {
+ size_t cpt=0;
+ for (size_t i = 0 ; i < N ; i++) {
+ for (size_t j = 0 ; j < N ; j++) {
+ if (CelluleEstDeLaCouleur(T[i][j],c)) {
+ cpt++;
+ }
+ }
+ }
+ return cpt;
+}
+
+size_t Population::nb_vivants() const { return N*N-nb_morts();}
+size_t Population::nb_deces() const { return nb_cellules(Cellule::ROUGE)+nb_cellules(Cellule::JAUNE);}
+size_t Population::nb_morts() const { return nb_cellules(Cellule::NOIR);}
+size_t Population::nb_naissances() const { return nb_cellules(Cellule::BLEU);}
+
+
+Cellule Population::getCelluleCopie(size_t i, size_t j) const {
+ CHECK_BOUND(i,j);
+ return T[i][j];
+}
+
+const Cellule& Population::getCellule(size_t i, size_t j) const{
+ CHECK_BOUND(i,j);
+ return T[i][j];
+}
+
+void Population::printCell(size_t i, size_t j) const {
+ CHECK_BOUND(i,j);
+ T[i][j].print();
+}
+
+void Population::kill(size_t i, size_t j) {
+ CHECK_BOUND(i,j);
+ T[i][j].setVivante(false);
+}
+
+void Population::birth(size_t i, size_t j) {
+ CHECK_BOUND(i,j);
+ T[i][j].setVivante(true);
+}
+
+void Population::print() const {
+ for (size_t i = 0 ; i < N + 2 ; i++) {
+ cout<<"X";
+ }
+ cout<<endl;
+ for (size_t i = 0 ; i < N ; i++) {
+ cout<<"X";
+ for (size_t j = 0 ; j < N ; j++) {
+ //T[i][j].print();
+ cout<<Couleur2String(T[i][j].getCouleur());
+ }
+ cout<<"X"<<endl;
+ }
+ for (size_t i = 0 ; i < N + 2 ; i++) {
+ cout<<"X";
+ }
+ cout<<endl;
+}
+
+Population Population::next() const {
+ Population POP(*this);
+ for (size_t i = 0 ; i < N ; i++) {
+ for (size_t j = 0 ; j < N ; j++) {
+ size_t voisin=nb_voisins_vivants(i,j);
+ (POP.T[i][j]).setVivante(voisin ==3 || (voisin==2 && T[i][j].getVivante()));
+ }
+ }
+ POP.updateColors();
+ return POP;
+}
+