Conway's Game of Life [C]

di il
7 risposte

Conway's Game of Life [C]

Salve a tutti, ho creato un semplice Game of Life, in poche parole è una matrice 10x10 (dimensioni comunque che posso variare a piacere) in cui scelgo quali caselle rendere vive e quali no.
Il programma poi per controllare se una cella deve rimanere viva o no, in base alle regole prestabilite, passa a una funzione una cella alla volta.
La funzione si occupa di controllare se le celle adiacenti alla cella passata sono vive o morte.
Restituisce quindi il numero di celle vive.

Però, se le celle toccano il limite succede un macello.
Come potrei ovviare a ciò?
Le celle oltre alla matrice le rendo tutte uguali a 0?
o ci sono altri modi?

Grazie per la lettura.

7 Risposte

  • Re: Conway's Game of Life [C]

    Se riesci a postare il tuo codice potrei provare ad ovviare al tuo problema
  • Re: Conway's Game of Life [C]

    Ciao, anche io recentemente mi ero divertito a programmare una versione del "Game of Life", anche se in Java. In ogni caso la strategia che avevo adottato era molto semplice: controlli la cella solo se sta dentro ai limiti della matrice.
  • Re: Conway's Game of Life [C]

    Dunque, io controllo ogni volta TUTTE le celle all'interno della matrice.
    Però, ad esempio, se lancio un GLIDE verso un lato non si forma un quadrato come su tutti i programmi già fatti ma il ciclo continua.
    Il codice lo allego, è fatto male, disordinato e senza commenti, spero che si capisca.

    #include<stdio.h>
    #include<windows.h>
    #include<stdlib.h>
    #include<time.h>
    #define X 15
    #define Y 15
    
    
    int campo[X][Y]={0};
    int controllo(int x,int y);
    int stampa(void);
    void cursor(int x, int y);
    int gen=0;
    
    
    
    int main(void)
    {
        int a=0,b=0,c=0,P1=0,P0=0,d=0;  
        srand(time(NULL));
        
        int div1[50][50]={0};
        int div0[50][50]={0};
     
         
        /*campo[0][0]=1;
        campo[0][2]=1;
        campo[1][1]=1;
        campo[1][2]=1;
        campo[2][1]=1;*/
        
        campo[4][6]=1;
        campo[4][5]=1;
        campo[4][4]=1;
        
       
        stampa();
        while(getch())
        {
            int a=0,b=0,c=0,D1=0,D0=0,cont=0; 
            
            while(a<X)
            {
                while(b<Y)
                {
                    if(campo[a][b]==0)
                    {
                         if(controllo(a,b)==3)
                         {
                              
                              div1[D1][0]=a;
                              div1[D1][1]=b;
                              D1++;
                              
                         }
                    }
                    if(campo[a][b]==1)
                    {
                        if(controllo(a,b)<2 || controllo(a,b)>3)
                        {
                              
                              div0[D0][0]=a;
                              div0[D0][1]=b;
                              D0++;
                            
                        }
                    }
                    
                   b++;
                   
                    
                }
                   
                b=0;
                a++;
                
                 
            }       
          
          int cun=0; 
          while(cun<=D1)
          {
                  cursor(div1[cun][1], div1[cun][0]);
                  campo[div1[cun][0]][div1[cun][1]]=1;
                  printf("X");
                  cun++;
          }
          cun=0;
          while(cun<=D0)
          {
                  cursor(div0[cun][1], div0[cun][0]);
                  campo[div0[cun][0]][div0[cun][1]]=0;
                  printf(".");
                  cun++;
          }
          
              cursor(25,0);
              printf("Generazione N: %d",gen);
              gen++;
           
        }         
                    
       
    
    
    
    
        system("PAUSE");
        return 0;
    }
    
    
    int controllo(int x,int y)
    {
        int a=x-1,b=x+1,c=y-1,d=y+1;
        int i=0;
        
        if(campo[a][y]==1){
        i++;
        if(a<0)
        i--;};
        
        
        if(campo[a][c]==1){
        i++;
        if(a<0 && c<0)
        i--;};
        
        
        if(campo[x][c]==1){
        i++; 
        if(c<0)
        i--;};
        
        
        if(campo[b][c]==1){
        i++;
        if(b==X && c<0)
        i--;};
       
        if(campo[b][y]==1){
        i++;
        if(b==X)
        i--;};
        
        
        if(campo[b][d]==1){
        i++;
        if(b==X && d==Y)
        i--;};
       
        
        if(campo[x][d]==1){
        i++; 
        if(d==Y)
        i--;};
       
        
        if(campo[a][d]==1){
        i++; 
        if(a<0 && d==Y)
        i--;};
    
        return i;
    
    }
        
    int stampa(void)
    {
        int a=0,b=0;
        
        while(a<X)
        {
            while(b<Y)
            {
                if(campo[a][b]==0)
                printf(".");
                else
                printf("X");
                
                
                b++;
            }
            printf("\n");
            b=0;
            a++;
        }
        
        printf("\n\n");
        return 0;
    }    
    
    void cursor(int x, int y)
    {
    
        COORD coord = {x, y};
    
       
        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    
        SetConsoleCursorPosition(hConsole, coord);
        
    }
    
    

    Sfrutto quindi due matrici e la funzione SetConsoleCursorPosition per spostare il cursore e stampare solo la cella che mi serve.
    Penso che l'errore sia nella funzione controllo();.
  • Re: Conway's Game of Life [C]

    Se ti può essere di aiuto:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    #define WORLD_WIDTH  22
    #define WORLD_HEIGHT 22
    
    void simplegetline(char* line)
    {
        while ( (*line++ = getchar()) != '\n');
        *(--line)='\0';
    }
    
    void gotoxy(int x, int y)
    {
        COORD coord = {x, y};
        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleCursorPosition(hConsole, coord);
    }
    
    int gf_molife(int x,int y,int world[][WORLD_WIDTH])
    {
        int clife = 0;
    
        if ( world[y][x - 1] == 1 || world[y][x - 1] == 3 ) ++clife;
        if ( world[y][x + 1] == 1 || world[y][x + 1] == 3 ) ++clife;
        if ( world[y - 1][x] == 1 || world[y - 1][x] == 3 ) ++clife;
        if ( world[y + 1][x] == 1 || world[y + 1][x] == 3 ) ++clife;
        if ( world[y - 1][x - 1] == 1 || world[y - 1][x - 1] == 3 ) ++clife;
        if ( world[y - 1][x + 1] == 1 || world[y - 1][x + 1] == 3 ) ++clife;
        if ( world[y + 1][x - 1] == 1 || world[y + 1][x - 1] == 3 ) ++clife;
        if ( world[y + 1][x + 1] == 1 || world[y + 1][x + 1] == 3 ) ++clife;
    
        return clife;
    }
    
    void gf_regula(int x,int y,int world[][WORLD_WIDTH])
    {
        int clife = gf_molife(x,y,world);
    
        switch (clife)
        {
            case 2:
            //niente sopravvivo
            break;
            case 3:
                if (world[y][x] == 0) world[y][x] = 2;
            break;
            case 1:
            case 4:
            case 5:
            case 6:
            case 7:
            case 8:
                if (world[y][x] == 1) world[y][x] = 3;
            break;
        }
    }
    
    void gf_day(int world[][WORLD_WIDTH])
    {
        int x,y;
        for (y = 1; y < WORLD_HEIGHT - 1;y++)
        {
            for (x = 1; x < WORLD_WIDTH - 1 ;x++)
            {
                if ( world[y][x] == 2)
                    world[y][x] = 1;
                else if ( world[y][x] == 3)
                    world[y][x] = 0;
            }
        }
    }
    
    void gf_print(int world[][WORLD_WIDTH],int zy,int zx)
    {
        gotoxy(0,0);
        int x,y;
        for (y = 1; y < WORLD_HEIGHT - 1;y++)
        {
            for (x = 1; x < WORLD_WIDTH -1 ;x++)
            {
                if (zy == y && zx == x)
                {
                    if ( world[y][x] == 0)
                        putchar('O');
                    else if ( world[y][x] == 1)
                        putchar('I');
                    else if ( world[y][x] == 2)
                        putchar('S');
                    else if ( world[y][x] == 3)
                        putchar('E');
                }
                else if ( world[y][x] == 0)
                    putchar('-');
                else if ( world[y][x] == 1)
                    putchar('X');
                else if ( world[y][x] == 2)
                    putchar('2');
                else if ( world[y][x] == 3)
                    putchar('3');
    
            }
            putchar('\n');
        }
        printf("\n key to continue,'e' to exit\n ");
    }
    
    void gf_stwm(int y,int world[][WORLD_WIDTH], char* pattern)
    {
        int i;
        for (i=1;i < WORLD_WIDTH - 1 && *pattern != '\0'; i++ ,pattern++)
        {
            if (*pattern == '-')
                world[y][i] = 0;
            else
                world[y][i] = 1;
        }
    
    }
    
    int main(void)
    {
    
        int world[WORLD_HEIGHT][WORLD_WIDTH];
    
        int x,y;
        for (y = 0; y < WORLD_HEIGHT ;y++)
            for (x = 0; x < WORLD_WIDTH ;x++)
                world[y][x] = 0;
    
        //aliante
        gf_stwm( 4,world,"--X-X");
        gf_stwm( 5,world,"---XX");
        gf_stwm( 6,world,"---X");
    
        gf_print(world,0,0);
    
        int c;
        while ((c =getchar()) != 'e' )
        {
            for (y = 1; y < WORLD_HEIGHT - 1 ;y++)
                for (x = 1; x < WORLD_WIDTH - 1 ;x++)
                    gf_regula(x,y,world);
    
            gf_day(world);
            gf_print(world,0,0);
        }
    
        return 0;
    }
    
    
    spesso quando si ricorre ai contorni di moore o del von, per evitare di fare controlli sui valori immessi si lascia inutilizzata la prima+unltima riga/colonna.
    Questo è quello che fa anche il mio codice,cosicche la metrice 12.12 sara realmente una 10.10
  • Re: Conway's Game of Life [C]

    Non ho capito cosa hai detto, scusa!
  • Re: Conway's Game of Life [C]

    Eheheh scusa ma ormai è risaputo che il mio italiano è pessimo!

    Praticamente crei una matrice piu grande di due elementi sia per la x che per la y,ovvero se vuoi creare una mappa di 10X10 farai

    int mappa[12][12];

    ora tutta la tua applicazione partirà dall'indice 1 anziche 0 e finirà all'indice 10 anziche 11.
    in questo modo la seguente riga

    if (mappa[y-1][x-1] == 0 )

    non darà mai errore.
    Questo permette di scrivere meno codice e di risultare piu performante oltre che a semplificare la vita.

    Se Guardi il codice postato vedrai che la mappa è piu grande di quella che realmente viene usata e visualizzata.
    Non modificando mai "il contorno" di tale mappa otterrai lo stesso risultato che con i vari costrutti if nidificati.

    Mi sono riuscito a spiegare??? bho??? ehehehehhe
  • Re: Conway's Game of Life [C]

    Sisi! Ho capito.
    In poche parole rendo la matrice più grossa di due elementi così non lavoro poi sul dato in entrata.
Devi accedere o registrarti per scrivere nel forum
7 risposte