Sistemare il main

di il
2 risposte

Sistemare il main

Ho scritto questo codice del gioco Game of Life ma non sono sicuro sia giusto anche se dovrebbe funzionare, per non riesco a fare un main che mi permetta di controllarlo

#include <stdio.h>
#include <stdlib.h>

#define N 5

void genera(int mondo[][N]) {
    int i, j;
     
    for(i=0; i<N; i++) {
        for(j=0;j<N;j++){
            mondo[i][j] = rand()%2;
            
            if(mondo[i][j] == 1)
            mondo[i][j] = 'X';
            else if(mondo[i][j] == 0)
                mondo[i][j] = ' ';
        }
    }
}

void mostra(int mondo[][N]) {
    int i, j;
    for(i=0; i<N; i++){
        for(j=0; j<N; j++) {
            printf("%3c", mondo[i][j]);
        }
        printf("\n");
    }
}

void evolvi(int mondo[][N]) {
    int count;
    int mat[N][N];
    int i, j, t, k;
    
     for(i=0; i<N; i++) {
            for(j=0; j<N; j++) {
                count = 0;
                

    for(k=-1; k<-2; k++) {
            for(t=-1; j<2; j++) {
                
                if(mondo[i+k][j+t] == 'X' && i+k>0 && j+t>0 && i+k<N && j+t<N)
                    count++;
                    }
                }
                
                if(mondo[i][j] == 'X') {
                    if(count<2 || count>3)
                        mat[i][j] = ' ';
                    else if(count == 2 || count == 3)
                        mat[i][j] = 'X';
                }
                
                else{
                    if(count == 3)
                        mat[i][j] = 'X';
                    else
                        mat[i][j] = ' ';
                }

    }
    }
    

    for(i=0; i<N; i++) {
        for(j=0; j<N; j++) {
            mondo[i][j] = mat[i][j];
        }
    }

}


int main() {
    
    int end;
    int mondo [N][N];
    
    genera(mondo);
    printf("Mondo: \n");
    mostra(mondo);
    end = 0;
    
    while(end<8) {
        evolvi(mondo);
        printf("\nMondo cambiato:\n");
        mostra(mondo);
        end++;
    }
   
    return 0;
}

La consegna era questa

Il Gioco della vita è un automa cellulare sviluppato dal matematico inglese John Conway sul finire degli anni ‘60. Il suo scopo è quello di mostrare come comportamenti simili alla vita possano emergere da semplici regole e interazioni.
Il mondo è rappresentato da una matrice R x C (con R,C due costanti decise dal programmatore tramite #define), ogni cella può essere viva o morta.
Ci sono 5 semplici regole che definiscono l’evoluzione dello stato del mondo: 1. Una cella viva con 0 o 1 vicino vivo muore perché abbandonata
2. Una cella viva con 4, 5, 6, 7 o 8 vicini vivi muore perché sovrappopolata 3. Una cella viva con 2 o 3 vicini vivi continua a vivere
4. In una cella morta con 3 vicini vivi c’è una nascita
5. In una cella morta con n != 3 vicini vivi non succede nulla (sterile)
John Conway commenta Il gioco della vita: https://www.youtube.com/watch?v=E8kUJL04EL
Suggerimenti
Implementare le seguenti funzioni:
...mostra(...) stampa a schermo il mondo (se la cella è viva stampa ?x? altrimenti stampa ? ?).
...evolvi(...) data la configurazione corrente del mondo, calcola la successiva, basandosi sulle 5 regole.
Bisogna prima fare tutti i calcoli sul mondo corrente E SOLO ALLA FINE aggiornare il mondo con la nuova configurazione calcolata.
...genera(...) genera una configurazione casuale di partenza.
Nella funzione ...main() occorre: 1. Dichiarare il mondo.
2. Generarvi una configurazione di partenza.
3. Continuare a stampare ed evolvere il mondo.
N.B. Il gioco non ha una fine (ma se vi stancate potete chiudere il terminale)

2 Risposte

  • Re: Sistemare il main

    Non si capisce il senso della domanda.
  • Re: Sistemare il main

    Indentazione... questa sconosciuta!
    Inoltre ti faccio notare che le variabili utilizzate nei cicli possono essere dichiarate anche all'interno del for.

    Passiamo ora alle cose più concrete:
    for(k=-1; k<-2; k++)
    C'è un errore, presumo di distrazione.
    for(t=-1; j<2; j++)
    Come sopra.
    if(mondo[i+k][j+t] == 'X' && i+k>0 && j+t>0 && i+k<N && j+t<N)
    I vari controlli sui "bordi" della matrice non andrebbero fatti prima di accedere ad essa?
    L'accoppiata k=0 e t=0 è "valida"?
    else if(count == 2 || count == 3)
    Non basterebbe un else?
Devi accedere o registrarti per scrivere nel forum
2 risposte