- // Nombre: El juego de la vida
- // Versión: 0.2-unix
- // Autor: user170294
- // E-mail: [email protected]
- #include <cstdlib> // rand() y srand()
- #include <ctime> // time()
- #include <iostream>
- using namespace std;
- #define ALTO 80 // Alto del tablero
- #define ANCHO 200 // Ancho del tablero
- #define VIVA 'O' // Celula VIVA
- #define MUERTA ' ' // Celula MUERTA
- #define PROBABILIDAD 10 // De cada X celulas 1 estará viva.
- void EntornoVaciar(char entorno[ALTO][ANCHO]); // Llena el entorno de celulas muertas
- void EntornoImprimir(char entorno[ALTO][ANCHO]); // Imprime el entorno en pantalla
- void EntornoEscribir(char entorno[ALTO][ANCHO]); // Escribe un entorno a mano
- void EntornoAleatorio(char entorno[ALTO][ANCHO], int probabilidad); // Genera una población aleatoria
- void EntornoEvolucionar(char entorno1[ALTO][ANCHO], char entorno2[ALTO][ANCHO]); // Evoluciona una población a la siguiente generación
- int main(void)
- {
- char entorno1[ALTO][ANCHO]; // Son necesarios dos tablas, una para mostrar y otra para evolucionar
- char entorno2[ALTO][ANCHO];
- bool scrFlip = false; // Variable de la que dependerá mostrar un entorno u otro.
- int generacion = 0; // Variable que almacena la generación actual
- srand(time(NULL)); // Inicializamos el generador de números aleatorios
- system("clear"); // Limpiamos la pantalla antes de imprimir nada
- cout << "###########################" << endl;
- cout << "# El juego de la vida #" << endl;
- cout << "###########################" << endl;
- cout << "*** Pulsa Enter para generar una población aleatoria ***";
- cin.get();
- EntornoVaciar(entorno1); // Vaciamos el entorno1
- EntornoAleatorio(entorno1, PROBABILIDAD); // Generamos una poblacion aleatoria en entorno1
- while(true) {
- system("clear");
- cout << "[ Generación: " << generacion << " ]" << endl;
- if(!scrFlip) { // Es necesario utilizar este efecto para el correcto funcionamiento de las reglas
- EntornoImprimir(entorno1);
- EntornoVaciar(entorno2);
- EntornoEvolucionar(entorno1, entorno2);
- scrFlip = true;
- } else {
- EntornoImprimir(entorno2);
- EntornoVaciar(entorno1);
- EntornoEvolucionar(entorno2, entorno1);
- scrFlip = false;
- }
- system("sleep 0.1"); // Hacer una pausa de 0.1s para que no valla demasiado rápido
- generacion++;
- }
- }
- void EntornoVaciar(char entorno[ALTO][ANCHO]) {
- for(int i=0;i<ALTO;i++)
- for(int j=0;j<ANCHO;j++)
- entorno[i][j]=MUERTA;
- }
- void EntornoImprimir(char entorno[ALTO][ANCHO]) {
- for(int i=0;i<ALTO;i++){
- for(int j=0;j<ANCHO;j++)
- cout<<entorno[i][j];
- cout<<endl;
- }
- }
- void EntornoEscribir(char entorno[ALTO][ANCHO]) {
- int aux;
- for(int i=0;i<ALTO;i++)
- for(int j=0;j<ANCHO;j++){
- aux=0;
- cout<<"celda["<<i<<"|"<<j<<"]: ";
- cin>>aux;
- entorno[i][j]=(aux==0)?MUERTA:VIVA;
- }
- }
- void EntornoAleatorio(char entorno[ALTO][ANCHO], int probabilidad) {
- int aux;
- for(int i=0;i<ALTO;i++)
- for(int j=0;j<ANCHO;j++){
- aux=rand()%probabilidad;
- entorno[i][j]=(aux==0)?VIVA:MUERTA;
- }
- }
- void EntornoEvolucionar(char entorno1[ALTO][ANCHO], char entorno2[ALTO][ANCHO]) {
- int n; //numero de celdas alrededor
- for(int i=0;i<ALTO;i++){
- for(int j=0;j<ANCHO;j++){
- n=0;
- ((i-1)<0||(j-1)<0)?:(MUERTA==entorno1[i-1][j-1])?:n++; //arriba-izquierda
- ((i-1)<0)?:(MUERTA==entorno1[i-1][j])?:n++; //arriba
- ((i-1)<0||(j+1)>=ANCHO)?:(MUERTA==entorno1[i-1][j+1])?:n++; //arriba-derecha
- ((j-1)<0)?:(MUERTA==entorno1[i][j-1])?:n++; //izquierda
- ((j+1)>=ANCHO)?:(MUERTA==entorno1[i][j+1])?:n++; //derecha
- ((i+1)>=ALTO||(j-1)<0)?:(MUERTA==entorno1[i+1][j-1])?:n++; //abajo-izquierda
- ((i+1)>=ALTO)?:(MUERTA==entorno1[i+1][j])?:n++; //abajo
- ((i+1)>=ALTO||(j+1)>=ANCHO)?:(MUERTA==entorno1[i+1][j+1])?:n++; //abajo-derecha
- if(VIVA==entorno1[i][j]){
- if(n<2)
- entorno2[i][j]=MUERTA;
- if(n==2||n==3)
- entorno2[i][j]=VIVA;
- if(n>3)
- entorno2[i][j]=MUERTA;
- }
- if(MUERTA==entorno1[i][j])
- if(n==3)
- entorno2[i][j]=VIVA;
- }
- }
- }
JuegoDeLaVida_2.0-unix_by-user170294