Exercice en C

Fermé
Franck - 23 nov. 2005 à 11:01
 Franck - 24 nov. 2005 à 21:22
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

mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
23 nov. 2005 à 19:27
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
Merci beaucoups
0