6 oct 2013

Juego de la vida en C

Hola, esta ves les muestro un programa que realice en C, y este es el juego de la vida, a mi parecer es un programa bastante bueno de implementar si se esta aprendiendo a programar y esto es debido al uso de funciones que se utilizan para su creación.

El código de este programa lo muestro a continuación, no explico el código ya que a mi parecer es algo sencillo de entender, pero si a alguien tiene dudas me lo pueden hacer saber y con mucho gusto les explico cada linea del archivo.

Sin mas que decir muestro el código.


/***********IMPLEMENTACION DEL JUEGO DE LA VIDA****************
** Autor: Jonathan Cruz Orozco.
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <time.h>

//cantidad de filas y columnas
#define COLS 40
#define FILS 20

//ciclo de repeticiones
#define NoCicloVida 200

//numero minimo de celulas vivas que han de rodear a una celula viva para que no se muera
#define NoMin 2 //2
//numero maximo de celulas vivas que han de rodear a una celula viva para que no se muera
#define NoMax 3 //4
//numero minimo de celulas vivas que han de rodear a una celula muerta para que vuelva a vivir
#define NoMinVive 2 //2
//numero maximo de celulas vivas que han de rodear a una celula muerta para que vuelva a vivir
#define NoMaxVive 3 //3

//espacio donde estaran las celulas
char vecindad[FILS][COLS];

//Reglas para vivir o morir
int vida[4] = {NoMin,NoMax,NoMinVive,NoMaxVive};

/*****************************+FUNCIONES PROTOTIPO+***************************/
void vecindadInicial();
void poblarVecindad();
void pintarVecindad();
int analizarVecinos(int,int);
void cicloCelular();
/*****************************************************************************/

void vecindadInicial(){
    int i,j;
    for (i = 0; i < FILS; i++){
        for (j = 0; j < COLS; j++){
            vecindad[i][j] = '_';
        }
    }
}

void poblarVecindad(){
int fil,x,y;
srand(time(NULL));

//crear celulas de manera aleatoria
for (fil = 0; fil < COLS; ++fil){
y = rand()%COLS;
x = rand()%FILS;
if(vecindad[x][y]=='_')
vecindad[x][y]='O';
}
}

void pintarVecindad(){
    int i,j;
    for (i = 0; i < FILS; i++){
            printf("\n");
        for (j = 0; j < COLS; j++){
            printf("%c",vecindad[i][j] );
        }
    }
    printf("\n");
}

/*******************************
****                        ****
****        |_|_|_|         ****
****        |_|_|_|         ****
****        |_|_|_|         ****
****                        ****
********************************/

int analizarVecinos(int posf, int posc){
//contador de celulas (vecinos)
int vecinos = 0;
if(posf-1 >= 0 && posc-1 >= 0)
if(vecindad[posf-1][posc-1] == 'O')
vecinos++;
if(posf-1 >= 0)
if(vecindad[posf-1][posc] == 'O')
vecinos++;
if(posf-1 >= 0 && posc+1 <= COLS-1)
if(vecindad[posf-1][posc+1] == 'O')
vecinos++;
if(posc-1 >= 0)
if(vecindad[posf][posc-1] == 'O')
vecinos++;
if(posc+1 <= COLS-1)
if(vecindad[posf][posc+1] == '0')
vecinos++;
if(posf+1 <= FILS-1 && posc-1 >= 0)
if(vecindad[posf+1][posc-1] == 'O')
vecinos++;
if(posf+1 <= FILS-1)
if(vecindad[posf+1][posc] == 'O')
vecinos++;
if(posf+1 <= FILS-1 && posc+1 <= COLS-1)
if(vecindad[posf+1][posc+1] == 'O')
vecinos++;

return vecinos;
}

void cicloCelular(){
int fil,col;
int n_vecinos;

//ciclo principal
for(fil = 0; fil < FILS; fil++){
for(col = 0; col < COLS; col++){
n_vecinos = analizarVecinos(fil,col);

//condiciones para que una celula no muera
if(vecindad[fil][col] == '_'){
if(n_vecinos == NoMinVive || n_vecinos == NoMaxVive)
vecindad[fil][col] = 'O';
else
vecindad[fil][col] = '_';
}
else if(vecindad[fil][col] == 'O'){
if(n_vecinos == NoMin || n_vecinos == NoMax)
vecindad[fil][col] = 'O';
else
vecindad[fil][col] = '_';
}
}
}
}

/* Funcion principal del programa*/
int main(int argc, char *argv[])
{
int i=0;

vecindadInicial();
poblarVecindad();
    
while(i < NoCicloVida){
pintarVecindad();
usleep(100000);
system("clear");
cicloCelular();
i++;
}

return 0;
}

7 comentarios:

  1. Hola me puedes ayudar con el juego de la vida pero en html?? porfa

    ResponderEliminar
  2. Mi correo es vivianaduque@usc.edu.co

    ResponderEliminar
    Respuestas
    1. Perdon por la tardanza creo q lo quoeres se puede hacer con javascript o con un applet d java.
      Espero mas detalles
      Saludos.

      Eliminar
  3. hola, mira sera que me puedes ayudar diciendome las limitaciones de la funcion : analizarVecinos(int posf, int posc) y como esa funcion interactua con otra?

    ResponderEliminar
    Respuestas
    1. Las limitaciones de la función básicamente es que solo puede analizar los "vecinos" ,(celdas alrededor de las coordenadas que se pasan como parámetros), de una célula, y la manera que tiene de interactuar con otra función es pasándole la cantidad de células vivas (vecinos) que encontro alrededor de la célula que se analizo.(esta célula se encuentra en las coordenadas que se reciben como parámetros en analizarVecinos(int posf, int posc))

      Espero que mi explicación haya sido de tu ayuda... XD

      Eliminar