Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Gioco della Vita (Game of Life)

    Buonasera...ho un progetto da consegnare entro un mese...riguarda il game of life..
    Il testo mi dice:
    Il Gioco della Vita consiste in una scacchiera in cui ogni casella rappresenta una cellula, che può essere viva o morta. Ogni cellula ha, in generale, quattro cellule vicine (a meno che la cellula non si trovi sul bordo della scacchiera). L’algoritmo usa un array 2D nxn, con n=45, per simulare la scacchiera. L’algoritmo esamina n volte la scacchiera. Durante ogni passo aggiorna lo stato di tutte le cellule sulla scacchiera nel seguente modo:
    se una cellula ha uno, due o tre cellule vicine vive allora la cellula deve essere posta nello stato “viva”; altrimenti deve essere posta nello stato “morta” (si noti che questa regola consente a una cellula morta di diventare viva). Dopo l’ultimo passo, l’algoritmo visualizza l’array 2D aggiornato. Ogni cellula viva è visualizzata con un asterisco; ogni cellula morta con uno spazio. Fare attenzione al fatto che 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. Usare le tre seguenti configurazioni iniziali(per i tre test): solo la cellula centrale è viva, ovvero quella di indici 22,22; solo le cellule 22,22 e 22,23 sono vive; solo le cellule 0,0 44,44 e 44,43 sono vive.

    Io il progetto lo terminato pero quando stampa la matrice sotto ad essa mi vengono fuori dei numeri...forse saranno indirizzi ma non riesco a trovare il problema...

    Questo è il codice:
    codice:
    #include <stdio.h>
    
    //struct
    struct cellula {
    int stato;
    }tab[45][45];
    
    //prototipi funzione
    void inizializza();
    void game();
    void stampa_finale(); //nn cè bisogno di passarlo puntatore
    
    
    int main()  ///PROGRAMMA PRINCIPALE
    {
        inizializza(); //richiama prima funzione
    
        game();
    
        stampa_finale();
    
    return 0;
    }
    
    
    
    
    
    
    ///_________________________FUNCTION_________________________________________///
    
    
    void inizializza()   //ti posiziona le cellule che desideri dove vuoi!
    {
    int i,j;
        //inizializza tt a zero
        for(i=0;i<45;i++)
            for(j=0;j<45;j++)
                tab[i][j].stato = 0;
    
        int scelta;
        do  //scegli quale porre a viva
        {
            printf("Inserisci le coordinate :\n i --> ");
            scanf("%d",&i);
            printf("j --> ");
            scanf("%d",&j);
    
            tab[i][j].stato = 1;
            printf("\n vuoi inserire un'altra cellula?? 1(si) 2(no)\n");
            scanf("%d",&scelta);
        }
        while(scelta == 1);
    
        //stampa
        stampa_finale() ; //richiama la funzione stampa
    }
    
    
    
    
    
    
    ///-----------------------------------------------------------------------------///
    
    void game()  //qi segue le cose ke vuole la traccia
    {
    int appoggio[45][45],flag,z,i,j; //matrice fittizzia
    
    for(i=0;i<45;i++) //inizializza appoggio
    {
        for(j=0;j<45;j++)
        {
            appoggio[i][j] = 0;
        }
    }
    
    
    for(z=0;z<45;z++)   //te lo ripete per 45 volte!!!
    {
    for(i=0;i<45;i++)
    {
        for(j=0;j<45;j++)
        {
                flag=0;
    
                if(i==0 &&  j==0 && flag== 0) //Casella[0][0] in alto a sinistra
                if ( (tab[i+1][j].stato==1) || (tab[i][j+1].stato==1)  )
                {   printf("1"); appoggio[i][j]=1; flag= 1; }
    
                if(i==0 && j ==44 && flag== 0)//Casella [0][44] in alto a destra
                if((tab[i+1][j].stato==1) || (tab[i][j-1].stato==1) )
                {   printf("2");appoggio[i][j]=1; flag= 1; }
    
    
    
                if(i==44 && j ==44 && flag== 0)//Casella[44][44]in basso a destra
                if((tab[i-1][j].stato==1) || (tab[i][j+1].stato==1))
                {   printf("3");appoggio[i][j]=1; flag= 1; }
    
    
                if(i==44 && j ==0 && flag== 0) //Casella [44][0] in basso a sinistra
                if((tab[i-1][j].stato==1) || (tab[i][j+1].stato==1))
                {   printf("4");appoggio[i][j]=1; flag= 1; }
    
                //Bordi
    
                if(i==0 && flag== 0 && j!=0 && j!=44)
                if((tab[i+1][j].stato==1)||(tab[i][j+1].stato==1)||(tab[i][j-1].stato==1))
                {   printf("5");appoggio[i][j]=1; flag= 1; }
    
                if(i==44 && flag== 0 && j!=0 && j!=44)
                if((tab[j][i-1].stato==1)||(tab[j+1][i].stato==1)||(tab[j-1][i].stato==1))
                 {   printf("6");appoggio[i][j]=1; flag= 1; }
    
                if(j==0 && flag== 0 && i!=0 && i!=44)
                if((tab[i-1][j].stato==1)||(tab[i+1][j].stato==1)||(tab[i][j+1].stato==1))
                 {   printf("7");appoggio[i][j]=1; flag= 1; }
    
                 if(j==44 && flag== 0 && i!=0 && i!=44)
                 if((tab[i][j-1].stato==1)||(tab[i-1][j].stato==1)||(tab[i+1][j].stato==1))
                 {   printf("8");appoggio[i][j]=1; flag= 1; }
    
                 // Casella generale
                 if(flag==0 && i!=0 && i!=44 && j!=0 && j!=44)
                 if((tab[i-1][j].stato==1) || (tab[i][j+1].stato==1) || (tab[i+1][j].stato==1) || (tab[i][j-1].stato==1))
                 {
                     printf("9");
                     appoggio[i][j]=1;
                     flag=1;
                 }
        }
    }
    for(i=0;i<45;i++)
    {
        for(j=0;j<45;j++)
        {
            tab[i][j].stato=appoggio[i][j];
        }
    }
    
    stampa_finale();
    system("pause");
    }
    }
    
    
    ///--------------------------------------------------------------------------------///
    
    void stampa_finale()
    {
    int i,j;
    
        printf("\n\n\t\t ***STAMPA TABLE...*** \n\n\n");
        for(i=0;i<45;i++)
        {
            for(j=0;j<45;j++)
            {
                if(tab[i][j].stato == 1)
                    printf("*");
                else
                    printf("°");
            }
            printf("\n");
        }
    }

  2. #2

    Moderazione

    Benvenuto sul forum! Ti ricordo che:
    • il codice va specificato tra tag [CODE] ... [/CODE], altrimenti perde l'indentazione;
    • il linguaggio di riferimento va sempre specificato (anche nel titolo, sotto forma di "tag").


    Ora correggo io, in futuro imposta correttamente la discussione fin da subito; nel frattempo ti consiglio di dare un'occhiata al regolamento.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Scusami...lo avevo letto ma un po con confusione...avevo la testa nel progetto..lo rileggerò bene così non farò errori per la prossima volta...grazie!!

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Non conosco la logica del tuo programma , ma gli unici numeri che stampa , non sono indirizzi , sono numeri stampati dalla funzione Game in seguito alle condizioni che tu hai posto






    codice:
    if(flag==0 && i!=0 && i!=44 && j!=0 && j!=44)
                 if((tab[i-1][j].stato==1) || (tab[i][j+1].stato==1) || (tab[i+1][j].stato==1) || (tab[i][j-1].stato==1))
                 {
                     printf("9"); 
                     appoggio[i][j]=1;
                     flag=1;
                 }
    Tecnologia

  5. #5
    hai ragione...grazieeeee!! li avevo messi solo per un messaggio di output per non lasciarlo vuoto...grazie mille!!!

  6. #6
    Scusatemi un altra domanda...se inserisco come coordinate di riga 21 e di colonna 43 perchè in basso mi esce quella cellula che io non voglio che appaia???
    Vi ringrazio per la disponibilità.
    Comunque la logica è che io inserisco delle coordinate da input che sono la mia cellula viva sulla matrice da stampare...la cellula è viva se è circondata da cellule vive che io ho rappresentato con il simbolo "*".
    Sulla matrice fittizia quindi verranno rappresentate le cellule che la circondano in modo tale che quella immessa da input sia circondata e quindi viva.

  7. #7
    Ho visto che provando tutte le coordinate solo con questa mi da errore...cioè quella cellula inesistente...da dove esce???

  8. #8
    Ho risolto il problema erano vari printf che non c'entravano nulla...adesso ho visto che però nella compilazione se premo sempre invio continua sempre a stamparmi la tabella con altre cellule...qualcuno sa come fare per evitare che continuino finendo la stampa quando non inseriamo più coordinate??

  9. #9
    La scanf restituisce il numero di campi acquisiti correttamente; se quindi verifichi se ha restituito zero, puoi vedere al volo se l'utente ha premuto invio senza inserire niente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Risolto... Ho tolto la procedura "stampa_finale() ;" dal main e, nella procedura "game()" abbiamo aggiunto un "return 0;" per evitare che stampasse la tabella 45 volte...Vi ringrazio per la disponibilità data.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.