Programmation du jeu de la vie

Fermé
#include#1 Messages postés 6 Date d'inscription dimanche 7 septembre 2014 Statut Membre Dernière intervention 8 septembre 2014 - 7 sept. 2014 à 19:01
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 19 sept. 2014 à 14:03
Bonjour,

dans le cadre d'un travail essentiel a ma graduation je suis censé programmer le jeu de la vie mais j'ai du mal a m'en sortir la programmation n'étant pas mon fort je crains de ne pas pouvoir y arriver sans aide .
voila ou je plante :
Question 4. Écrire une procédure SortirDamier qui sort le contenu de Damier à la manière d'un affichage écran. Ce sous-programme suppose que : a) Les sorties de l'ordre Sortir se concatènent les unes derrière les autres pour former une ligne, b) Pour faire poursuivre l'affichage à la ligne suivante de l'écran, on dispose de l'instruction Aller_à_la_ligne.
Question 5. Écrire une procédure NombreVoisin à trois paramètres : NombreVoisin(I, J : numérique; Var Voisin : numérique) qui calcule dans Voisin le nombre de voisins vivants de la cellule Damier(I, J). On accordera une attention spéciale aux calculs du nombre de voisins des cellules se trouvant sur les bords du damier.
Question 6. Écrire une procédure Transfert à deux paramètres : Transfert(Damier1(10, 10) : vecteur de chaîne de caractères; Var Damier2 : vecteur de chaîne de caractères) qui recopie, Damier1 dans Damier2, case par case.
Question 7. En utilisant les deux procédures écrites pour les deux questions précédentes, écrivez une procédure GénérationSuivante qui calcule, dans Damier, la génération suivante du jeu de la vie. On notera avec profit que cette procédure peut nécessiter l'utilisation d'un damier auxiliaire.
Question 8. En utilisant les procédures écrites aux questions précédentes, écrivez un algorithme qui entre une configuration initiale du damier, un nombre N et affiche le damier de génération en génération jusqu'à la génération N, la première génération étant l'état du damier après avoir entré les cellules vivantes.

si quelqu'un a déjà fait ce tp ou a déjà vu quelque chose de similaire veuillez me communiquer votre source ou si quelqu'un pouvait me guider me conseiller , toutes aide ou commentaires est le bienvenu.
merci infiniment
A voir également:

9 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
8 sept. 2014 à 08:07
Bonjour,

"je ne sais meme pas par ou commencer"
Commence par lire les consignes...

Question 4. Écrire une procédure SortirDamier
Question 5. Écrire une procédure NombreVoisin à trois paramètres
Question 6. Écrire une procédure Transfert à deux paramètres
Question 7. écrivez une procédure GénérationSuivante


Tout est prémâché pour y aller progressivement, tu n'as même pas à réfléchir par où commencer, tu as juste à suivre les étapes les unes après les autres...

Voir aussi : Demander de l'aide pour vos exercices sur CCM
1
#include#1 Messages postés 6 Date d'inscription dimanche 7 septembre 2014 Statut Membre Dernière intervention 8 septembre 2014
Modifié par #include#1 le 8/09/2014 à 14:05
merci beaucoup pour ton intérêt a ma cause le truc c'est que je ne sais pas comment écrire ces procédures je suis nul en programmation =) , je ne sais pas ce qu'on attend de moi dans la Q4, cependant la Q5 est faisable mais ma syntaxe sera bourré d'erreur .
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
13 sept. 2014 à 01:34
Bonsoir
@KX a fourni, l'ensemble des fonctions demandé mais cependant, il y a un truc qui me chagrine.
On parle ici du jeu de la vie donc en rentre dans le domaine de l'optimisation algorithmique avec Conway et il te manque pas mal de donnée que tu n'as pas mentionné. En plus vue le code posté, je pense que tu démarres très mal, il te faut une classe pour tes cellules ( je me base sur les jeux par défaut) chez toi ça sera des pions, et dans un autre fichier tout ce qui est affichage.
Les en-têtes sont mal définis , et combien de génération veux tu créé il faut prendre en compte cet options car il va valoir optimiser ton algorithme pour au moins faire plus de trois générations bref tu à du boulot.
Je te conseil de faire une classe Cellule pour commencer. et par la suite on pourras t'aider
à bientôt
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
13 sept. 2014 à 11:01
On parle ici du jeu de la vie donc en rentre dans le domaine de l'optimisation algorithmique avec Conway
Le jeu de la vie de la Conway c'est juste un automate cellulaire qui passe d'une grille à l'autre en appliquant des règles de voisinages, en terme de complexité c'est un algorithme en O(N.G) où N est le nombre de cases de la grille, et G le nombre de générations. Il n'y a pas grand chose à optimiser, vu qu'il faut afficher toutes les générations il faudra également toutes les calculer, c'est très mécanique comme programme.

Je te conseil de faire une classe Cellule pour commencer
Puisque c'est un exercice il devra suivre l'énoncé, et répondre aux questions les unes après les autres avant de rendre son travail. Et pour avoir déjà fait ce genre de programme, une classe Cellule ne sert à rien, ce serait contre-performant, il faut travailler au niveau de la grille.

Amazing Game of Life Demo
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
13 sept. 2014 à 12:25
Bonjour @KX
Je sais que le jeu de la vie est basé sur un automate cellulaire qui passe d'une grille à l'autre en appliquant des règles de voisinages, et c'est sur ce mécanisme dont je fais référence. D'après ce que j'ai compris enfin du moins c'est un jeu de ...?,
Donc il utilise plus ou moins le même algorithme ( voisinage, génération) et quand je parle d'optimisation je parle par exemple d'atteindre plus de 500 générations par seconde (à titre d'exemple je précise) sur une grille en dame ou échiquier peu importe, donc apporté des améliorations à l'algorithme pour accéléré le jeux au tout simplement laissez tel quel.

Perso je pense que cet exercice à une très forte similitude avec les jeux de vie de Conway dans ta dernière remarque "travailler sur la grille" pourquoi pas, mais il serait plus intéressant de bosser du côté de la génération mais si tu as des avis à soumettre ? je suis preneur

Au passage, merci pour la vidéo :)
à bientôt
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
13 sept. 2014 à 12:38
si tu as des avis à soumettre ? je suis preneur
Laissons cette discussion à #include#1 si tu veux discuter du jeu de la vie de Conway de manière plus poussé que cet exercice, je t'invite à ouvrir une autre discussion.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
Modifié par fiddy le 19/09/2014 à 14:04
Bonjour,

Tu n'as pas tenu compte de mes remarques... Je te conseille donc de relire mon post.
Et tu n'as toujours pas répondu à la question : c'est du C ou du C++ que tu veux faire ?

je te conseille vraiment de suivre un tuto : https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c et de tout reprendre...

N'hésite pas si tu as des questions sur des chapitres que tu ne comprends pas.

Et merci la prochaine fois d'utiliser la balise "code c". Par exemple :
<"code c">
ici tu mets ton code
<"/code">
(sans les guillemets)

Cdlt,

Google is your friend
1
#include#1 Messages postés 6 Date d'inscription dimanche 7 septembre 2014 Statut Membre Dernière intervention 8 septembre 2014
Modifié par Whismeril le 8/09/2014 à 07:12
voici le debut de mon programme il contient 2 procedure (initialiser et entrer les coordonnées des cellule vivante) pour ce qui est de reste je ne sais meme pas par ou commencer:
#include<stdio.h>
#include<conio.h>
int main()
{

 int i,j;
 char damier[10][10];
 void initblanc ( char damier,int i,int j);
 {
   for (i=1;i<10;i++)
   {
     for (j=1;j<10;j++);
     {
     damier[i][j]=" " ;
     }
     }
     }
     void initcoordonnées (char damier,int a,int b);
     {
         int a,b;
         printf("donner le nombre de la ligne \n");
         scanf("%d",&a);
         printf("donner le nombre de la colonne \n");
         scanf("%d",&b);
         damier[a][b]="*";
     }
}
int main()
{
    initblanc();
    initcoordonnées();

}

qu'en pensez vous ??
0
Utilisateur anonyme
8 sept. 2014 à 07:13
Bonjour, message modifié par l'ajout des balises de code.
Voir ici comment bien utiliser la coloration syntaxique.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
#include#1 Messages postés 6 Date d'inscription dimanche 7 septembre 2014 Statut Membre Dernière intervention 8 septembre 2014
8 sept. 2014 à 13:55
merci
0
#include#1 Messages postés 6 Date d'inscription dimanche 7 septembre 2014 Statut Membre Dernière intervention 8 septembre 2014
8 sept. 2014 à 14:02
est ce que quelqu'un pourrait m'expliquer plus clairement ce qu'on attend de moi dans cette question:
Écrire une procédure SortirDamier qui sort le contenu de Damier à la manière d'un affichage écran. Ce sous-programme suppose que : a) Les sorties de l'ordre Sortir se concatènent les unes derrière les autres pour former une ligne, b) Pour faire poursuivre l'affichage à la ligne suivante de l'écran, on dispose de l'instruction Aller_à_la_ligne.
0
JwTd Messages postés 43 Date d'inscription jeudi 15 mars 2012 Statut Membre Dernière intervention 15 octobre 2022 1
8 sept. 2014 à 14:03
Salut, tu as créé ta fonction avec des arguments donc il faut appeler la fonction avec tous les arguments requis.
Lorsqu'on n'a pas besoin d'entrer ou sortir une variable d'une fonction, inutile des crée en tant qu'arguments, les créer à l'intérieur de la fonction suffit.
Tu n'as le droit d'avoir qu'une seule fonction main() dans ton programme.
void fonction1(int a)     // une fonction avec un argument de type int
{
 int b=1;
 a=a+b;
}

main()
{
  int chiffre=0;
  fonction1(chiffre);
  /*maintenant chiffre = 1 car la variable chiffre a été passé en argument de fonction1 et fonction1 l'a modifié. */
}


Par contre dans ton code tu ne mets les coordonnées que d'une cellule, il te faudra mettre ça dans un algo pour mettre plusieurs coordonnées.
Pour afficher le tableau sa sera presque comme pour l'écrire.
0
#include#1 Messages postés 6 Date d'inscription dimanche 7 septembre 2014 Statut Membre Dernière intervention 8 septembre 2014
8 sept. 2014 à 15:01
merci beaucoup =)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
13 sept. 2014 à 11:45
Ce n'est pas main() mais int main(void). Il faut préciser l'int devant le main().
/*maintenant chiffre = 1 car la variable chiffre a été passé en argument de fonction1 et fonction1 l'a modifié. */
Absolument pas. Il faut passer par le pointeur si tu veux faire ça.
Par exemple :
void fonction1(int *a)     // une fonction avec un argument de type int
{
 int b=1;
 *a=*a+b;
}

int main(void)
{
  int chiffre=0;
  fonction1(&chiffre);
  /*maintenant chiffre = 1 car la variable chiffre a été passé en argument de fonction1 et fonction1 l'a modifié. */
   return 0;
}

Et enfin, il ne faut pas oublier le return 0; pour dire que le programme s'est bien déroulé.
Cdlt,
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
13 sept. 2014 à 11:42
Bonjour,

Tu parles de C ou de C++ ?
Car le code que tu as montré est du C et non du C++...

Sinon, je corrige les erreurs de ton premier code :
void initblanc ( char damier,int i,int j);
Ta fonction prend donc 3 arguments...
Et pourtant, tu l'appelles : initblanc(); sans mettre les arguments.
Il faut que les deux soient cohérents.
damier n'est pas un char. Il faut mettre initblanc(char damier[10][10])
J'ai enlevé aussi i et j, car ce n'est pas propre. C'est mieux de te définir des variables locales à la fonction.

De même pur : initcoordonnées()
De plus, pas d'accent dans les noms en C...

Tu as mis 2 main() dans ton code... Il n'en faut qu'un.
for (i=1;i<10;i++)
En C, les tableaux commencent à l'indice 0. Donc plutôt : i=0;i<10;i++.
De même pour j.

damier[i][j]=" " ;
damier[a][b]="*";
Attention, "..." est de type char* et damier[i][j] de type char. Si tu veux mettre un caractère, il faut faire :
damier[i][j]=' '
apostrophes au lieu de guillemets.

Et enfin n'oublie pas le return 0; en fin de main().

N'hésite pas à reposter ton code avec les corrections pour qu'on te dise si c'est bien corrigé ou s'il reste des erreurs. :-).
0
voici se que j'ai pu codé:
#include<stdio.h>
#include<conio.h>
main()
{
int i,j;
char damier[10][10];
void initblanc ( char damier,int i,int j);
{
for (i=1;i<10;i++)
{
for (j=1;j<10;j++);
{
damier[i][j]= ;
}
}
}
void initcoordonnées (int a,int b);
{
int a,b;
printf("donner le nombre de la ligne ");
scanf("%i",&a);
printf("donner le nombre de la colonne");
scanf("%i",&b);
damier[a][b]=*;
}
}
void sortirdamier (int i,int j,damier[i][j])
{
int n = 0;
for (i=1,i<10,i++)
{
for (j=1,j<10,j++)
{
printf("%c & %c ",damier[i][j],damier[i][j+1]);
}
printf("/n %c & %c",damier[i+1][j],damier[i+1][j+1]);
}
}
void nbrvoisins (int i,int j, int n)
{
for (i=2,i<9,i++)
{
for (j=2,j<9,j++)
if (damier[i-1][j-1]=*)
{n=n+1;
}
else if (damier[i-1][j]=*)
{n=n+1;
}
else if (damier[i-1][j+1]=*)
{n=n+1;
}
else if (damier[i][j+1]=*)
{n=n+1;
}
else if (damier[i+1][j+1]=*)
{n=n+1;
}
else if (damier[i+1][j]=*)
{n=n+1;
}
else if (damier[i+1][j-1]=*)
{n=n+1;
}
else if (damier[i][j-1]=*)
{n=n+1;
}
else
{n=n;
}
}


}
for (i=1,i<2,i++)
{
for (j=2,j<10,j++)
{
if (damier[i][j-1]=*)
{n=n+1;
}
else if (damier[i][j+1]=*)
{n=n+1;
}
else if (damier[i+1][j]=*)
{n=n+1;
}
else if (damier[i+1][j-1]=*)
{n=n+1;
}
if (damier[i+1][j+1]=*)
{n=n+1;
}
else
{n=n;
}
}

}
for (i=10,i<=10,i++)
{ for (j=2,j<10,j++)
{
if (damier[i][j-1]=*)
{n=n+1;
}
else if (damier[i][j+1]=*)
{n=n+1;
}
else if (damier[i-1][j]=*)
{n=n+1;
}
else if (damier[i-1][j-1]=*)
{n=n+1;
}
if (damier[i-1][j+1]=*)
{n=n+1;
}
else
{n=n;
}
}
for (j=1,j<2,i++)
{ for (i=2,j<10,j++)
{
if (damier[i-1][j]=*)
{n=n+1;
}
else if (damier[i-1][j+1]=*)
{n=n+1;
}
else if (damier[i][j+1]=*)
{n=n+1;
}
else if (damier[i+1][j+1]=*)
{n=n+1;
}
else if (damier[i+1][j]=*)
{n=n+1;
}
Else
{ n=n;
}
for (j=10,j<=10,i++)
{ for (i=2,i<10,j++)
{
if (damier[i-1][j]=*)
{n=n+1;
}
else if (damier[i-1][j-1]=*)
{n=n+1;
}
else if (damier[i][j-1]=*)
{n=n+1;
}
else if (damier[i+1][j-1]=*)
{n=n+1;
}
else if (damier[i+1][j]=*)
{n=n+1;
}
Else
{n=n;
}




}
}

if(i=1,j=1)
{
if (damier[i][j+1]=*)
{n=n+1;
}
else if (damier[i+1][j+1]=*)
{n=n+1;
}
else if (damier[i+1][j]=*)
{n=n+1;
}
}
else
{n=n;
}
if(i=1,j=10)
{
if (damier[i][j-1]=*)
{n=n+1;
}
else if (damier[i+1][j-1]=*)
{n=n+1;
}
else if (damier[i+1][j]=*)
{n=n+1;
}
}
else
{n=n;
}
if(i=10,j=10)
{
if (damier[i][j-1]=*)
{n=n+1;
}
else if (damier[i-1][j-1]=*)
{n=n+1;
}
else if (damier[i-1][j]=*)
{n=n+1;
}
}
else
{n=n;
}
if(i=10,j=1)
{
if (damier[i][j+1]=*)
{n=n+1;
}
else if (damier[i-1][j+1]=*)
{n=n+1;
}
else if (damier[i-1][j]=*)
{n=n+1;
}
}
else
{n=n;
}
void transfert(damier[10][10],damier2[10][10], int i,int j)
{
Char damier2[10][10]
for (i=1,i<10,i++)
{
for (j=1,j<10,j++)
{
damier[i][j]=damier2[i][j];
}
}

}
void generationsuivante (int i,int j,damier[10][10])
{

for (i=1,i<10,i++)
{
for (j=1,j<10,j++)
{
int nbrvoisin (int i, int j)
if (n=2)
{
damier[i][j]=*;

}
else if (n=3)
{
damier[i][j]=*;
}
else
damier[i][j]= ;

}

}
}
Int main ()
{
Initblanc() ;
Initcoordonnées() ;
Nbrvoisin() ;
Transfert() ;
Sortirdamier() ;
Generation suivante() ;
}
0