Game of Life

di il
3 risposte

Game of Life

Salve ragazzi sono in difficolta' con il progetto che sto svolgendo. Quest'é la traccia :


Questo invece è il codice:
#include <stdio.h>
#include <stdlib.h>

void Assegna_valori(int n, char scacchiera[45][45],int riga,int colonna,char *tempA,char *tempB,char *tempC,char *tempD);
void stampa_matrice(char scacchiera[45][45]);
int conta_vive(char,char,char,char);

int main() {
/**
 * Si consideri una scacchiera in cui ogni casella rappresenta una cellula, che può essere viva o morta
 * Prendendo in esame ogni singola casella, ne aggiorna il suo state in base al numero di cellule vive
 * che gli sono intorno.
 */
char scacchiera[45][45];
/*
La scacchiera deve essere aggiornata solo alla fine di ogni passo: ciò significa che l’algoritmo deve usare un
array per memorizzare la scacchiera attuale e un array per memorizzare la scacchiera
modificata
*/
char scacchiera_temporanea[45][45];

char A,B,C,D;
int lives = 0;
int colonna=0,riga=0;
int rig=0,col=0;
int i=0,j=0,n=45,itest=0,ntest=0;
int scelta;
int iv,nv,cv,rv;
// I due for assegnano all'intera matrice il valore ' ', riempiendo la matrice di cellule al momento "morte".
for (j=0; j<n; j++)    {
 for(i=0; i<n; i++) {
        scacchiera[j][i] = ' ';
                    }
                       }
// La scelta dell'utente determina la nostra configurazione iniziale di cellule "vive"

printf("Specificare quale test vuoi effettuare :\n");
printf("1) Solo la cellula in posizione 22,22 e viva\n");
printf("2) Solo le cellule in posizione 22,22 22,23 sono vive\n");
printf("3) Solo le 4 cellule in posizione 0,0 44,44 44,43 sono vive\n");
printf("4) Inserisci manualmente la configurazione\n>");

scanf("%d", &scelta);

switch(scelta) {
    case 1:
         // Nella prima configurazione, passiamo direttamente le coordinate nelle matrici e le passiamo da morte a vive

            scacchiera[22][22] = '*';
        // Passiamo quindi le cellule dallo stato morte a vive

    break;
        case 2:
        // Nella seconda configurazione, passiamo direttamente le coordinate nelle matrici e le passiamo da morte a vive

         scacchiera[22][22] = '*';
         scacchiera[22][23] = '*';
        // Passiamo quindi le cellule dallo stato morte a vive

    break;

    case 3:
        // Nella terza configurazione, passiamo direttamente le coordinate nelle matrici e le passiamo da morte a vive
        scacchiera[0][0] = '*';
        scacchiera[44][44] = '*';
        scacchiera[44][43] = '*';

    break;
    case 4:
        // Nel 4° Caso assegniamo manualmente alla scacchiera le cellule vive
        printf("Quante cellule vive contiene la tua configurazione di partenza? \n");
        scanf("%d", &nv);
        // Il ciclo ogni volta chiede la posizione delle cellule vive assegnate dall'utente
        iv=0;
        for(iv=0;iv<nv;iv++)
        {
        printf("Inserisci le coordinate della %d cellula viva nel formato RIGA,COLONNA Es: 22,25\n",iv+1);
        scanf("%d,%d",&rv,&cv);
        // Dopo aver letto le coordinate le passiamo negli indici di riga e di colonna e assegniamo il valore * di Cellula Viva
        scacchiera[rv][cv] = '*';
        }
    break;
}
// Ottenendo la nostra matrice/scacchiera configurata copiamo tutto il suo contenuto nella matrice/scacchiera temporanea
 for (colonna=0; colonna<n; colonna++) {
 for(riga=0; riga<n; riga++) {
scacchiera_temporanea[riga][colonna]=scacchiera[riga][colonna];
                             }
                                      }

colonna = 0;
riga = 0;
i=0;

// L’algoritmo esamina n volte la scacchiera
for (i=1; i<=n; i++) {

// Faccio scorrere tutta la scacchiera
 for(riga=0;riga<n;riga++) {
  for (colonna=0;colonna<n;colonna++) {
/*
    Nella procedura seguente mando in input l'indice di riga e di colonna dell'interazione, la scacchiera, e il numero totale di righe e colonne (n)
    la procedura restituisce in output il contenuto delle caselle che sono intorno alla cellula in esame
*/
   Assegna_valori(n, scacchiera, riga, colonna, &A,&B,&C,&D);

/*
  Dopo aver controllato se la casella che sto esaminando si trova nei bordi e negli angoli della scacchiera
  Vado a contollare quante cellule vive sono intorno alla cellula che stiamo esaminando con la function conta_vive in check.c
  che restituisce in output appunto il numero delle vive
*/
       lives = conta_vive(A,B,C,D);

       // In base al numero di cellule vive contate intorno alla cellula in esame
       // Possiamo quindi modificarne il contenuto


        // Se una cellula ha 1,2 o 3 cellule vicine vive allora la cellula é posta nello stato viva
        if(lives == 1 || lives == 2 || lives == 3) { scacchiera_temporanea[riga][colonna] = scacchiera[riga][colonna] = '*'; }

      // Se una cellula ha 4 o più cellule vicine vive allora la cellula deve essere posta nello stato “morta”
        if(lives >= 4) { scacchiera_temporanea[riga][colonna] = ' '; }

// La scacchiera deve essere aggiornata solo alla fine di ogni passo

   for(rig=0; rig<n; rig++)     {
    for (col=0; col<n; col++) {
// Ricopio quindi la configurazione ottenuta, all'interno della matrice.
      scacchiera[rig][col]=scacchiera_temporanea[rig][col];

                                    }
                                }
        // Riporto il numero di vive a 0, in modo da ricontare il contenuto nel passo successivo
        lives=0;
}
}

/* L’algoritmo visualizza tutto l’array 2D al temine del secondo, terzo,
quarto, sesto, ottavo, decimo, 20-simo, 30-simo e 45-simo passo. */

if(i == 2 || i == 3 || i == 4 || i == 6 || i == 8 || i == 10 || i == 20 || i == 30 || i == 45)
    {
    stampa_matrice(&scacchiera);
        /*
          Alla fine della stampa di ogni matrice "pulisco" (CLEAR) la schermata
          ad eccezione alla stampa dell'ultima elaborazione della scacchiera
          in modo che alla fine del intero processo rimanga una stampa dell'elaborazione ottenuta
        */
    if(i != 45)  {system("cls");};
    }
}
system("pause");

             }
/*
   Prendendo in input le lettere che hanno come valore le cellule che sono intorno
   alla cellula che stiamo elaborando, riusciamo a contare le cellule vive
   controllando se il loro valore corrisponde a *, il valore che contraddistingue le cellule vive
   */
int conta_vive(char A,char B,char C,char D) {
        int conto_vive = 0;
        if(A == '*') { conto_vive++; }
        if(B == '*') { conto_vive++; }
        if(C == '*') { conto_vive++; }
        if(D == '*') { conto_vive++; }

return conto_vive;
}

// La procedura stampa la matrice con l'utilizzo di due cicli
// Che scorrono la matrice e a ogni iterazione stampano il contenuto di ciscuna casella
void stampa_matrice(char scacchiera[45][45]) {
int r=0,c=0,n=45;
     for(r=0;r<n;r++)      {
      for (c=0;c<n;c++) {

         printf("%c", scacchiera[r][c]);
                      }
        // Alla fine di ogni riga vado a capo
         printf("\n");
                       }

};

void Assegna_valori(int n, char scacchiera[45][45],int riga,int colonna,char *tempA,char *tempB,char *tempC,char *tempD) {
/*
 Aalcune cellule prese in esame, possono non avere 4 cellule intorno
 Sse ad esempio mi trovo negli spigoli (Esempio [0][0], oppure [44][44]), la cellula ha solo 3 cellule vicine
 Sse mi trovo ai bordi, la cellula ha solo 5 cellule vicine
 */
// Controllo quindi se mi trovo negli spigoli
      if(riga == 0) {
        if(colonna == 0) {
         // Le cellule che quindi non esistono le dò come cellule "morte"
         // Non verranno quindi conteggiate da conta_vive();

            *tempA = ' ';
            *tempB = ' ';
            *tempC = ' ';
            *tempD = ' ';


                      }
        // N-1 perchè l'ultima colonna e l'ultima riga nella scacchiera sarà 44
        // dato che partendo da 0 avremo i nostri 45 elementi
         if(colonna == n-1) {
            *tempA = ' ';
            *tempD = ' ';

           *tempB = scacchiera[riga][colonna-1];
           *tempC = scacchiera[riga+1][colonna-1];

        }
        }


      if(riga == n-1) {
       if(colonna == n-1) {
            *tempC = ' ';
            *tempA = scacchiera[riga-1][colonna-1];
            *tempB = scacchiera[riga][colonna-1];
            *tempD = scacchiera[riga-1][colonna];
     }
        if(colonna == 0) {
            *tempA = ' ';
            *tempB = ' ';
            *tempC = ' ';

      *tempD = scacchiera[riga-1][colonna];

                    }
                         }
    // Controllo sui bordi
      else if(riga == 0)
     {
      *tempA = ' ';
      *tempD = ' ';
      *tempB = scacchiera[riga][colonna-1];
      *tempC = scacchiera[riga+1][colonna-1];
     }
     else if(riga == n-1) {
      *tempC = ' ';
      *tempA = scacchiera[riga-1][colonna-1];
      *tempB = scacchiera[riga][colonna-1];
      *tempD = scacchiera[riga-1][colonna];

     }
else {
      // Se non mi trovo sui bordi, posso quindi copiare tutti i valori delle cellule che sono intorno alla cellula in esame
      // Modificando gli indici di riga e di colonna.
      *tempA = scacchiera[riga-1][colonna-1];
      *tempB = scacchiera[riga][colonna-1];
      *tempC = scacchiera[riga+1][colonna-1];
      *tempD = scacchiera[riga-1][colonna];

}
}

Quando Provo ad esempio ad eseguire la prima voce del menu in cui mi dovrebbe uscire la cellula nella posizione di array [22][22] con le corrispettive cellule vive o morte , ho la seguente soluzione (al mio parere errata) :



grazie mille per l'aiuto !!

3 Risposte

  • Re: Game of Life

    A parte la chiamata

    stampa_matrice(&scacchiera);

    che è sbagliata e dovrebbe essere

    stampa_matrice(scacchiera);

    (strano che il tuo compilatore non protesti), per il resto non si capisce cosa ci sia di sbagliato in quella schermata ...
  • Re: Game of Life

    Oregon lo sbaglio sta nel fatto che non dorebbero uscire tutte qst cellule vive .... a un numero maggiore di 3 cellule vive ' * ' vicine diventano automaticamente morte ' ' puoi aiutarmi nella risoluzione ?
  • Re: Game of Life

    Suggerisco di ridurre la dimensione del quadro da 45 a, ad esempio, 8 o anche meno; suggerisco inoltre di provare con 1 sola iterazione e verificare, manualmente, che il quadro risultante sia quello atteso.
    Quando questo funziona si può provare ad eseguire 2 iterazioni e verificare il risultato.
    Se anche questo funziona si può ritornare al quadro da 45 e verificare che funzioni con 1 e 2 iterazioni.
    In questo modo verranno fuori tutti i problemi. Buon lavoro!
Devi accedere o registrarti per scrivere nel forum
3 risposte