Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SkaTrumpet en 29 Marzo 2016, 04:32 am



Título: Ayuda Juego De la Vida-Conway graficos
Publicado por: SkaTrumpet en 29 Marzo 2016, 04:32 am
Hola comunidad¡
Queria solicitar su ayuda por que staba realizando el juego de la vida del matematico conway con la bilbioteca graph.h
Solo que esta no respeta la regla que si el estado de la celda es "vida" y no tiene alado ninguna celda "viva" esta pasa a estado "muerto"
Gracias de ante mano.
P.D:El estado vivo se representa con el color azul=1 y el muerto con el negro=0
Código
  1. #include <graphics.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. void casilla(int x,int y);
  5. void tablero();
  6. void verifica();
  7. int  vecino(int x,int y);
  8. void condiciones(int estado,int v,int x,int y);
  9.  
  10. int main()
  11. {
  12.    initwindow(700,500,"Juego de la vida");
  13.    tablero();
  14.    verifica();
  15.    closegraph();
  16. }
  17. void casilla(int x,int y)
  18. {
  19.    int c;
  20.    c = rand() % 8 ;
  21.    setfillstyle(1,1);
  22.    rectangle(x,y,x+10,y+10);
  23.    if(c==2 || c==3)
  24.        floodfill(x+5,y+5,WHITE);
  25. }
  26. void tablero()
  27. {
  28.    int x,y;
  29.    for(y=0;y<getmaxy();y+=10)
  30.      for(x=0;x<getmaxx();x+=10)
  31.        casilla(x,y);
  32. }
  33. void verifica()
  34. {
  35.    int x,y,e,v,prueba=1;//e=estado v=vecinos
  36.    for(y=5;y<getmaxy();y+=10)
  37.    for(x=5;x<getmaxx();x+=10)
  38.    {
  39.        e=getpixel(x,y);
  40.        v=vecino(x,y);
  41.        condiciones(e,v,x,y);
  42.    }
  43.    verifica();
  44. }
  45. int vecino(int x,int y)
  46. {
  47.    int c=0,i,j;
  48.    int limx=x+10,limy=y+10;
  49.    for(i=x-10;i<=limx;i+=10)
  50.            for(j=y-10;j<=limy;j+=10)
  51.                if(limx!=x && limy!=y)
  52.                    if(x > 0 && x < getmaxx())
  53.                        if( y > 0 && y < getmaxy())
  54.                            if(getpixel(i,j)==1)
  55.                                c++;
  56.    return(c);
  57. }
  58. void condiciones(int estado,int v,int x,int y)
  59. {
  60.    if(estado==1 && v==0)
  61.    {
  62.        setfillstyle(1,0);
  63.        floodfill(x,y,WHITE);
  64.    }
  65.    if(estado==1 && v>=3)
  66.    {
  67.        setfillstyle(1,0);
  68.        floodfill(x,y,WHITE);
  69.    }
  70.    if(estado==0 && v==3)
  71.    {
  72.        setfillstyle(1,1);
  73.        floodfill(x,y,WHITE);
  74.    }
  75. }
  76.  
  77.  
  78.  


Título: Re: Ayuda Juego De la Vida-Conway graficos
Publicado por: LaiaxanIV en 29 Marzo 2016, 09:24 am
No he podido probar el programa para asegurarme que la opción que te voy a dar sea correcta ya que no dispongo de graphics.h xD
Supongo que la función vecino devuelve el número de celdas vivas adyacentes a la celda que buscas. El problema parece estar en que también miras la propia celda por lo cual la primera condicion de condiciones() no se va a cumplir. Seria suficiente poniendo otra condición dentro de vecino que fuese
if(x != i && y != j)...
Si no llegase a ser eso, saca por pantalla la x,y y v en condiciones()


Título: Re: Ayuda Juego De la Vida-Conway graficos
Publicado por: MAFUS en 29 Marzo 2016, 18:30 pm
Por lo que entiendo de tu código el control de las casillas vivas y muertas lo haces con el color de los píxeles.
Te sería más sencillo si separaras la lógica de la presentación: una tabla de X x X de bools o ints, según te vaya mejor.
Por otra parte el juego debe hacerse con dos tableros, uno con la representación y el otro será una copia para trabajar. Esto es así porqué el cálculo de la época actual debe hacerse según la época directamente anterior; si modificas la tabla de la que obtienes los datos el juego no tendrá el comportamiento esperado.
Debes tener en cuenta los límites del mundo: si estás calculando la esquina superior izquierda no puedes mirar que hay ni en la fila superior ni en la columna que está más a su izquierda porqué no existen, o puedes  juntar los límites haciendo que la izquierda se junte con la derecha y arriba con abajo.