Conway C

di il
2 risposte

Conway C

Ciao a tutti, dovrei compilare un programma che simuli il gioco "Conway - Game of life"
Per chi non lo conoscesse ecco le sue caratteristiche:
Conway - Game of Life. Creare un programma che, inizializzi una matrice
Mat con valori zero e uno in maniera pseudo casuale. Il numero di celle pari
a uno sia uguale al numero di celle della matrice fratto 13.
Per ogni elemento della matrice si implementi una transizione da zero a uno
o da uno a zero secondo le seguenti regole:
a. Se una cella ha valore uno e ha meno di 2 celle attive vicine la cella
assuma valore zero
b. Se una cella ha valore uno e ha più di tre celle vicine attive, la cella
assuma valore zero
c. Se la cella ha valore zero e ha vicino 3 celle attive, la cella assuma
valore uno.
Si visualizzi lo stato della matrice associando il simbolo * alle celle attive e
lo spazio per le celle non attive.
Questo è il codice che ho scritto però il risultato ottenuto non è quello desiderato ma non riesco a capire dove sta l'errore.
Se qualcuno potesse darci un'occhiata mi farebbe un grande favore
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define R 40
#define C 40

void azzera_matrice(int mat[R][C]);
void inizializza_matrice(int mat[R][C]);
void stampa_matrice(int mat[R][C]);
void aggiorna_matrice(int mat[R][C]);
int cerca_vicini(int mat[R][C], int i, int j);

int main () {
	
	srand(time(NULL));
	int mat[R][C], c=0;
	inizializza_matrice(mat);
	stampa_matrice(mat);
	while((c=getchar()!=EOF)) {
		printf("\n\n\n\n");
		aggiorna_matrice(mat);
		stampa_matrice(mat);

	}
}

void azzera_matrice(int mat[R][C]) {
	
	int i,j;
	for(i=0;i<R;i++) {
		for(j=0;j<C;j++)
			mat[i][j]=0;
	}
}


void inizializza_matrice(int mat[R][C]) {
	
	int i,j, check,temp;
	do {
	check=0;
	azzera_matrice(mat);
		for(i=0;i<R;i++) {
			for(j=0;j<C;j++) {
				temp= (rand()<RAND_MAX/10) ? 1 : 0 ;
				check+=temp;
				mat[i][j]=temp;
			}
		}
	} while(check!=R*C/13);
}

void stampa_matrice(int mat[R][C]) {
	
	int i,j;
		for(i=0;i<R;i++) {
		for(j=0;j<C;j++) {

				if(mat[i][j]==1)
					printf("%-2s", "*");
				else
					printf("%-2s", " ");
			
			}
			putchar('\n');
		}
}		

int cerca_vicini(int mat[R][C], int i, int j) {
	
	int x,y,check,zx=1,zy=1;
	if(i==0)
		zx=0;
	if(j==0)
		zy=0;
	for(x=(i-zx);x<=(i+1);x++) {
		for(y=(j-zy);y<=(j+1);y++) {
			if(mat[x][y]==1)
				check++;
	}
	return check;
}
}
	
	
	
	
	
	
void aggiorna_matrice(int mat[R][C]) {
	
	int i, j, temp=0;
	
	for(i=0;i<R;i++) {
		for(j=0;j<C;j++) {
			temp=cerca_vicini(mat,i,j);
			if(mat[i][j]==1 && temp<2)
				mat[i][j]=0;
			if(mat[i][j]==1 && temp>3)
				mat[i][j]=0;
			if(mat[i][j]==0 && temp==3)
				mat[i][j]=1;
		}
	}
}
	

2 Risposte

  • Re: Conway C

    Devi dare maggiori dettagli sul problema ... difficilmente qualcuno esaminerà tutto il codice senza alcuna indicazione più precisa ...
  • Re: Conway C

    Invece di chiedere agli utenti del forum di dedicare del tempo (che quasi sempre non hanno!) a leggere tutto il tuo codice alla ricerca di errori, è molto più sensato e razionale che sia tu a studiare il codice di una , pulita ed altamente didattica, appartenente alla classica raccolta di del compianto Bob Stout.
    
    /*
    ** A quick "life" (2-d cellular automaton) implementation done in Turbo C 2.0 
    ** on the spur-of-the-moment by Jonathan Guthrie 9/20/1992 and donated to the 
    ** public domain.
    **
    ** In keeping with the guidelines of the C_ECHO, this program has been tested,
    ** and does seem to operate properly.
    */
    
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #ifndef random
     #define random(num) (int)(((long)rand()*(num))/RAND_MAX)
    #endif
     
    /*
    **  From VIDPORT.C, also in SNIPPETS
    */
     
    void GotoXY(int col, int row);
    void ClrScrn(int vattrib);
     
    #ifndef randomize
     #define randomize() srand(((unsigned int)time(NULL))|1)
    #endif
    
    #define     ROWS        24
    #define     COLS        80
    #define     GENERATIONS 10
    
    int civ1[ROWS][COLS], civ2[ROWS][COLS];
    
    void update_generation(int old[ROWS][COLS], int new[ROWS][COLS])
    {
          int i, j, count;
    
          for (i = 0; i < ROWS; ++i)
          {
                for (j = 0; j < COLS; ++j)
                {
                      count = old[(i + ROWS - 1) % ROWS][(j + COLS - 1) % COLS] + 
                            old[(i + ROWS - 1) % ROWS][j] +
                            old[(i + ROWS - 1) % ROWS][(j + 1) % COLS] +
                            old[i][(j + COLS - 1) % COLS] +
                            old[i][(j + 1) % COLS] +
                            old[(i + 1) % ROWS][(j + COLS - 1) % COLS] +
                            old[(i + 1) % ROWS][j] +
                            old[(i + 1) % ROWS][(j + 1) % COLS];
    
                      switch(count)
                      {
                      case 0:
                      case 1:
                      case 4:
                      case 5:
                      case 6:
                      case 7:
                      case 8:
                            new[i][j] = 0;
                            break;
    
                      case 2:
                            new[i][j] = old[i][j];
                            break;
    
                      case 3:
                            new[i][j] = 1;
                            break;
                      }
    
                      GotoXY(j+1, i+1);
                      putch(new[i][j] ? '*' : ' ');
                } 
          }
    }
    
    
    void initialize(void)
    {
          int i, j;
    
          randomize();
          ClrScrn(7);
    
          for (i = 0; i < ROWS; ++i)
          {
                for (j = 0; j < COLS; ++j)
                {
                      civ1[i][j] = random(2); 
                      GotoXY(j+1, i+1);
                      putch(civ1[i][j] ? '*' : ' ');
                } 
          }
    }
    
    
    int main(void)
    {
          int i;
    
          initialize();
          for (i = 0; i < GENERATIONS; ++i)
          {
                update_generation(civ1, civ2);
                update_generation(civ2, civ1);
          }
          return EXIT_SUCCESS;
    } 
Devi accedere o registrarti per scrivere nel forum
2 risposte