"Juego de la vida" en C

Iniciado por folostia, 21 Enero 2012, 09:57 AM

0 Miembros y 2 Visitantes están viendo este tema.

folostia

¿Alguien sabe cómo se hace el juego de la vida en C? nos lo ha mandado hacer el trabajo y sé como funciona pero no tengo ni idea de programarlo y ella se niega a explicarnos nada...  >:(

no pido que me lo hagáis pero a ver si alguien sabe más o menos cómo hacerlo
"Antes de que un software pueda ser reusable, primero ha de ser usable." (Ralph Johnson)
Usuario Linux:547941

rir3760

Las reglas del juego de la vida las puedes encontrar en cinco minutos cortesía de un buscador decente como Google.

En cuanto al algoritmo, este es:
Imprimir la generación actual (generación inicial)
Incrementar el numero de generaciones

Mientras no se alcance el numero de generaciones requerido
   Calcular la siguiente generación
   Imprimir la generación

Eso te debe sugerir que solo se trata de un bucle llamando a funciones de soporte: una para crear una generación en base a la actual y otra para imprimirla.

Para almacenar la generación actual debes utilizar una matriz, eso se implementa en C mediante un array de arrays de caracteres (por ejemplo "char gen[10][10]") con el valor 1 si hay una célula viva y 0 en caso contrario.

Para la generación siguiente debes recorrer cada una de las celdas de la matriz actual verificando su estado (numero de vecinos): si eso resulta en una célula viva o muerta lo "anotas" en otra matriz (esa es la nueva generación).

Suena engorroso (tedioso) pero no es difícil.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Noxors

Cita de: IR.M en 21 Enero 2012, 09:57 AM
¿Alguien sabe cómo se hace el juego de la vida en C? nos lo ha mandado hacer el trabajo y sé como funciona pero no tengo ni idea de programarlo y ella se niega a explicarnos nada...  >:(

no pido que me lo hagáis pero a ver si alguien sabe más o menos cómo hacerlo

Ni siquiera os ha dado el codigo del dibujo del cuadro?

Yo tuve que hacerlo hace 2 meses, no tiene mucha dificiltad. Ahora mismo he de marcharme al trabajo, pero cuando vuelva te echo un cable.

Al mio lo que le pasa es que en la generacion que yo inserto celulas me sale el cuadro, pero cuando paso a la siguiente generacion ya el cuadro dice que desaparece y no aparece mas xDD

NoX

folostia

Cita de: Noxors en 22 Enero 2012, 17:26 PM
Ni siquiera os ha dado el codigo del dibujo del cuadro?

Yo tuve que hacerlo hace 2 meses, no tiene mucha dificiltad. Ahora mismo he de marcharme al trabajo, pero cuando vuelva te echo un cable.

Al mio lo que le pasa es que en la generacion que yo inserto celulas me sale el cuadro, pero cuando paso a la siguiente generacion ya el cuadro dice que desaparece y no aparece mas xDD

NoX
Lo único que nos dio fue el en qué consiste el juego,nada más,y aún por encima se niega  ayudarnos...
"Antes de que un software pueda ser reusable, primero ha de ser usable." (Ralph Johnson)
Usuario Linux:547941

El_Java

#4
Yo lo hice hace algun tiempo en C++, y el proceso que usé fue más o menos este:
------
vector<vector<char> > mapa, copia; //son dos matrices de chars, pero usando la STL
Entrada de datos // lees el mapa
copia = mapa
Procesamiento:

  • bucle for para recorrer el numero de instantes:
  • dos bucles for recorriendo el mapa
  •   si se cumple las condiciones hacer los cambios sobre copia
  • mapa = copia
Fin procesamiento.
Salida. //muestras el mapa
---
Espero que lo puedas entender.

PD: En que universidad estás estudiando?

Noxors

Bueno yo solo te facilitare el codigo que dibuja el cuadro, despues de ahí tendras que apañartelas tu solo, ya que supongo que es lo unico que aun no te habran explicado. Te va bien?

NoX

folostia

Cita de: Noxors en 22 Enero 2012, 20:05 PM
Bueno yo solo te facilitare el codigo que dibuja el cuadro, despues de ahí tendras que apañartelas tu solo, ya que supongo que es lo unico que aun no te habran explicado. Te va bien?

NoX
Cualquier ayuda es bien recibida,lo malo es que tengo que hacer varios trabajos y no tengo mucho tiempo.

Muchísimas gracias,el resto lo hago yo porque si no tampoco aprendo nada.

un cordial saludo y,otra vez,gracias  :)
"Antes de que un software pueda ser reusable, primero ha de ser usable." (Ralph Johnson)
Usuario Linux:547941

Noxors

#7
Aqui te lo dejo, revisa los cierres {} ya que he copiado el codigo del mio sin mirar demasiado donde abrian y cerraban las claves jeje.

Este codigo es mas o menos el que nos dieron a nosotros para posicionar el cursor, dibujar el cuadro y pintar una celula, nosotros teniamos que hacer el resto.

Los comentarios estan en catalan, (cosas del sistema de educacion de aqui xD)

#include <stdio.h>
#include <stdlib.h>
#include <conio2.h>

#define FILES 24
#define COLUMNES 80

#define FINAL 'z'
#define CELULA 2

#define AMUNT 72
#define AVALL 80
#define ESQUERRA 75
#define DRETA 77

void dibuixa_quadre(void);

int medcols,medfils; //Per a posicionar el cursos

int main (void)
{

int x=0,x2=0; //Per a recollir les tecles que prem l'usuari


clrscr(); //Serveix per esborrar la pantalla de la consola

dibuixa_quadre(); //Dibuixem el requadre

medcols = COLUMNES / 2; medfils = FILES / 2;

/* Funcio gotoxy(x,y)
Serveix per a posicionarse a una coordenada determinada de la consola.
Apareix a la nova llibreria instal·lada conio2.h */

gotoxy(medcols,medfils); //Posicionarse al mig

/*Mentre l'usuari no permi la tecla z el programa no arribara al seu final.
Podeu ficar un altre lletra si us interesa modificant la constant */

while(x != FINAL)
{
x= getch(); //Recollir una tecla de l'usuari sense mostrar-la per pantalla

if(x==224) //Codi ASCI estes.
{
x2=getch();

switch (x2)
{
case AMUNT:
if (medfils -2 > 0) medfils -=2;
break;
case AVALL:
if(medfils + 2 <=FILES) medfils +=2;
break;
case ESQUERRA:
if (medcols -2 >0) medcols -=2;
break;
case DRETA:
if (medcols +2 < COLUMNES) medcols+=2;
break;
}

gotoxy(medcols,medfils);

}
// Si premem l'espai llavors pintem una cel·lula

if(x==32)
{
if (mundo[medfils-1][medcols-1]) {
printf (" ");
mundo [medfils-1][medcols-1]=0;
}
else {
printf("%c", CELULA);
mundo[medfils-1][medcols-1]=1;
}
gotoxy(medcols,medfils);

}


void dibuixa_quadre (void)
{
int i=0, j=0;

gotoxy (1,1);

//Linia inicial del quadre

printf("%c%c",201,205);

for(i=0; i<38; i++)
{
printf("%c%c",203,205);
}

printf("%c\n",187);


for(j=0; j < 12; j++)
{
//Linies verticals
for(i=0; i < 39; i++)
{
printf("%c ",186);
}

printf("%c\n",186);

//Linies intermitges: 204,206,185
if(j != 11)
{
printf("%c%c",204,205);

for(i=0; i<38; i++)
{
printf("%c%c",206,205);
}

printf("%c\n",185);
}
}
// Linea de tancament 200,202,188
printf("%c%c",200,205);

for(i=0; i < 38; i++)
{
printf("%c%c",202,205);
}
printf("%c",188);
}


Y te dejo mi ejecutable para que veas como me quedó a mi.
Lh: No se pueden postear ejecutables en esta sección

Cualquier duda, aqui estoy :)


NoX