-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcelda.cpp
113 lines (100 loc) · 3.17 KB
/
celda.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "celda.h"
// Constructores y destructores
Celda::Celda(unsigned int posicionX, unsigned int posicionY, unsigned int posicionZ, Tipo tipo)
{
this->setPosicionX(posicionX);
this->setPosicionY(posicionY);
this->setPosicionZ(posicionZ);
this->setTipo(tipo);
this->celula = new Celula(muerto,0,0,0); // es por tema de incluciones de archivos, en visual no anda
}
Celda::~Celda(){
if (this->celula == NULL){
throw "la celula tiene que estar definida";
}
delete this->celula;
}
// Getters
unsigned int Celda::getPosicionX()
{
return this->posicionX;
}
unsigned int Celda::getPosicionY()
{
return this->posicionY;
}
unsigned int Celda::getPosicionZ()
{
return this->posicionZ;
}
Tipo Celda::getTipo()
{
return this->tipo;
}
Celula *Celda::getCelula()
{
return this->celula;
}
// Setters
void Celda::setPosicionX(unsigned int nuevaPosicionX = 0)
{
this->posicionX = nuevaPosicionX;
}
void Celda::setPosicionY(unsigned int nuevaPosicionY = 0)
{
this->posicionY = nuevaPosicionY;
}
void Celda::setPosicionZ(unsigned int nuevaPosicionZ = 0)
{
this->posicionZ = nuevaPosicionZ;
}
void Celda::setTipo(Tipo nuevoTipo = estandar)
{
this->tipo = nuevoTipo;
}
// Funciones
void Celda::actualizarEstadoCelula(unsigned int celulasVecinas, unsigned int x1, unsigned int x2, unsigned int x3, Lista<Celda *> *listaVecinasVivas)
{
if (getTipo() == procreadora)
{
x1 = x1 - 1;
}
if ((celulasVecinas == x1) && (getCelula()->getEstado() == muerto) && (getTipo() != contaminada))
{
getCelula()->setEstado(vivo);
actualizaGenesCelula(listaVecinasVivas);
}
else if ((celulasVecinas < x2 || celulasVecinas > x3) && (getCelula()->getEstado() == vivo))
{
getCelula()->setEstado(muerto);
};
}
void Celda::actualizaGenesCelula(Lista<Celda *> *listaVecinasVivas)
{
if (listaVecinasVivas == NULL)
{
throw "no se pueden cambiar los genes si no tengo una lista de progenitoras";
}
if (this->getCelula()->getEstado() == vivo)
{
AdministradorDeGen *nuevoGen = new AdministradorDeGen(255);
for (unsigned int i = 0; i < listaVecinasVivas->contarElementos(); i++)
{
switch (i)
{
case 1:
getCelula()->setGen1(nuevoGen->generar(listaVecinasVivas->obtener(i+1)->getCelula()->getGen1(), listaVecinasVivas->obtener(i)->getCelula()->getGen2(), listaVecinasVivas->obtener(i)->getCelula()->getGen3()).getCargaGenetica());
break;
case 2:
getCelula()->setGen2(nuevoGen->generar(listaVecinasVivas->obtener(i+1)->getCelula()->getGen1(), listaVecinasVivas->obtener(i)->getCelula()->getGen2(), listaVecinasVivas->obtener(i)->getCelula()->getGen3()).getCargaGenetica());
break;
case 3:
getCelula()->setGen3(nuevoGen->generar(listaVecinasVivas->obtener(i+1)->getCelula()->getGen1(), listaVecinasVivas->obtener(i)->getCelula()->getGen2(), listaVecinasVivas->obtener(i)->getCelula()->getGen3()).getCargaGenetica());
break;
default:
break;
}
}
delete nuevoGen;
}
}