Ayuda Juego De la Vida-Conway graficos

Iniciado por SkaTrumpet, 29 Marzo 2016, 04:32 AM

0 Miembros y 1 Visitante están viendo este tema.

SkaTrumpet

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
#include <graphics.h>
#include <stdio.h>
#include <time.h>
void casilla(int x,int y);
void tablero();
void verifica();
int  vecino(int x,int y);
void condiciones(int estado,int v,int x,int y);

int main()
{
    initwindow(700,500,"Juego de la vida");
    tablero();
    verifica();
    closegraph();
}
void casilla(int x,int y)
{
    int c;
    c = rand() % 8 ;
    setfillstyle(1,1);
    rectangle(x,y,x+10,y+10);
    if(c==2 || c==3)
        floodfill(x+5,y+5,WHITE);
}
void tablero()
{
    int x,y;
    for(y=0;y<getmaxy();y+=10)
      for(x=0;x<getmaxx();x+=10)
        casilla(x,y);
}
void verifica()
{
    int x,y,e,v,prueba=1;//e=estado v=vecinos
    for(y=5;y<getmaxy();y+=10)
    for(x=5;x<getmaxx();x+=10)
    {
        e=getpixel(x,y);
        v=vecino(x,y);
        condiciones(e,v,x,y);
    }
    verifica();
}
int vecino(int x,int y)
{
    int c=0,i,j;
    int limx=x+10,limy=y+10;
    for(i=x-10;i<=limx;i+=10)
            for(j=y-10;j<=limy;j+=10)
                if(limx!=x && limy!=y)
                    if(x > 0 && x < getmaxx())
                        if( y > 0 && y < getmaxy())
                            if(getpixel(i,j)==1)
                                c++;
    return(c);
}
void condiciones(int estado,int v,int x,int y)
{
    if(estado==1 && v==0)
    {
        setfillstyle(1,0);
        floodfill(x,y,WHITE);
    }
    if(estado==1 && v>=3)
    {
        setfillstyle(1,0);
        floodfill(x,y,WHITE);
    }
    if(estado==0 && v==3)
    {
        setfillstyle(1,1);
        floodfill(x,y,WHITE);
    }
}



LaiaxanIV

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()

MAFUS

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.