Exercice en C

Franck -  
 Franck -
Bonjour,

J'ai un programme a faire en C mais je ni arrive pas, c'est sous visual C++, quelqu'n pourrais t-il m'aidais ou me donner la solution.

Enoncer:
Le jeu simule la vie des cellulesd du damier(naissance,survie, mort). La simulation repose sur quatres règles
*Une cellule continue a vivre si elle a deux ou trois cellules voisines
*Meurt d'isolement si elle a moins de deux voisines
*Meurt d'étouffement si elle a plus de trois cellules voisines
*Une cellule nait dans un case vide, si trois cases voisines exactement sont occupées.
Toutes les cellules du damier évoluent simultanément à chaque saut de génération
Une cellule = "X"
Le damier sera représenté en machine sous la forme d'un tableau a une dimension
Réaliser un programme principal permettant, à l'utilisateur du programme, la saisie du nombre de cycle, puis l'initialisation du damier, et enfin la génération de la visualisation, de l'état suivant du damier.

il faut les fonctions suivantes:
initialisation du damier
affichage du damier
nb de voisins d'une cellule
calcul de la génration suivantes

Voila mon travail deja réalisé

/* Directives */
#include <stdio.h>
#define LARGEUR (6)
#define HAUTEUR (4)

/* Prototypes*/
int index (int,int);
void affiche_damier (char[]);

/* Programme principal*/
void main ()
{
char damier[]=
"X....."
".X...."
"..X..."
"...X..";
affiche_damier(damier);
nb_voisins (1,1,damier);
}

/* sous-programme index*/
int index (int l, int c)
{
return (l*LARGEUR+c); /* renvoie la place de la cellule*/
}

/* Affiche Damier*/
void affiche_damier(char table1[])

{int i,j;
for(i = 0; i <= HAUTEUR -1; i++) /*Pour toutes les hauteurs*/
{ for(j = 0; j <= LARGEUR -1; j++) /*Pour toutes les lmargeurs*/
printf("%c",table1[index(i,j)]); /*affiche le contenu mémoire*/
printf("\n"); /*retour a la ligne*/
}
}

/* sous-programme nb voisins */
int nb_voisins (int l, int c, char table2[])
{int nb; nb=0; /* initialise le nombre de voisins*/

if (table2[(index(l,c)-1)]=="X")
nb=nb+1;
else if (table2[(index(l,c)+1)]=="X")
nb=nb+1;
else if (table2[index(l,c)]=="X")
nb=nb+1;
else if (table2[index(l,c)]=="X")
nb=nb+1;
else if (table2[index(l,c)]=="X")
nb=nb+1;
else if (table2[index(l,c)]=="X")
nb=nb+1;
else if (table2[index(l,c)]=="X")
nb=nb+1;
else if (table2[index(l,c)]=="X")

return (nb); /*renvoie le nombre de voisins*/
}

/* sous-programme génération */

Meci a vous

2 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Fais une structure de damier formée d'un tableau de tableau (une matrice donc) :
    
    //define pour le devenir d'une case
    #define ETOUFFEMENT 1
    #define SURVIE 2
    #define ISOLEMENT 3
    #define RESTE_MORTE 4
    #define NAISSANCE 5
    
    //define pour l'état actuel d'une case
    #define EN_VIE 6
    #define MORTE 7
    
    #include <stdlib.h>
    #include <stdio.h>
    
    struct damier{
      int** data; //les cases contiennent EN_VIE ou MORTE
      unsigned int nb_ligne;
      unsigned int nb_colonne;
    };
    
    //initialise un damier avec toute les cases à l'état MORTE
    damier *new_damier(unsigned int nb_ligne,unsigned int nb_colonne){
       unsigned int i;
       damier *d=(damier *)malloc(sizeof(struct damier));
       d->data=(int **)malloc(nb_ligne*sizeof(int*));
       for(i=0;i<nb_ligne;++i){
         d->data[i]=(int *)malloc(nb_colonne*sizeof(int));
         d->data[i][j]=MORTE;
       }
    }
    
    unsigned int get_nb_ligne(damier d){
      return d.nb_ligne;
    }
    
    unsigned int get_nb_colonne(damier d){
      return d.nb_colonne;
    }
    
    //Change la valeur d'une cellule (MORTE ou EN_VIE)
    set(damier *d,unsigned int indice_ligne,unsigned int indice_colonne,  int etat){
      d->data[indice_ligne][indice_colonne]=etat;
    }
    
    //Retourne l'état d'une case
    int get(damier d,unsigned int indice_ligne,unsigned int indice_colonne){
       return d.data[indice_ligne][indice_colonne];
    }
    
    //Etat de d[ndice_ligne][indice_colonne] à la prochaine itération
    //Retourne l'état de la cse à la prochaine itération (ETOUFFEMENT,...)
    int etat_suivant_cellule(damier d,unsigned int indice_ligne,unsigned int indice_colonne){
      //c'est ici que les règles de survie etouffement...interviennent
    }
    
    //Affiche un damier
    void show_damier(damier d){
       unsigned int nbl=get_nb_ligne(d);
       unsigned int nbc=get_nb_colonne(d);
       for(lcur=0;lcur<nbl;++lcur){
         for(ccur=0;ccur<nbc;++ccur){
            printf("%d\t",get(d,lcur,ccur));
         }
         printf("\n");
      }
    }
    
    //Calcule le prochain damier
    damier etat_suivant_damier(damier d){
       unsigned int lcur,ccur;
       unsigned int nbl=get_nb_ligne(d);
       unsigned int nbc=get_nb_colonne(d);
       damier * res=new_damier(nbl,nbc);
       for(lcur=0;lcur<nbl;++lcur){
         for(ccur=0;ccur<nbc;++ccur){
            set(res,lcur,ccur,etat_suivant_cellule(d,lcur,ccur);
         }
      }
      return res;
    }
    
    int main(){
      //...
    }
    

    Truc dans le genre. C'est fait à l'arrache et tu peux faire beaucoup mieux en C++ mais bon apparemment tu veux le faire en C... Donc va pour du C ;-)
    0