IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Algorithme Conways game of life.


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2013
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Algorithme Conways game of life.
    Bonjour,

    J'essai de faire un algorithme pour faire reproduire le conways game of life, je le réalise sur la console pour l'élaborer, le tester afin d'être qu'il soit fonctionnel, car je vais ensuite le réaliser sur SDL. Il s'agit donc d'une version "Brouillon" de mon code.

    Le code en lui même est presque finit, la seul chose qu'il lui manque c'est un fonctionnement correct. Après tout les test que j'ai fais sur mon code j'en suis venus a la conclusion tout semblait fonctionner plutôt bien, a part sur la vérification de l'état(vivante ou morte) des cellules voisines. En effet il ne doit pas fonctionner correctement vu que les pattern comme le planeur ne se comporte pas normalement. Si ça peut vous aidez je suis sur windows 7 32-bit et j'utilise code::blocks 13.12.

    voila mon code(j'ai mit les pattern de test en commentaire si vous voulez tester décommenter):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include <stdio.h>
    #include <stdlib.h>
    #include "checkCell.h"
    #include "boucleTab.h"
     
    void tabInit(int tab[63][127])   //fonction initialisant le tableau
    {
        int i = 0, j = 0;
    for(j=0; j<7; j++)
    {
        for(i=0; i<15; i++)
        {
            tab[j][i] = 0;
        }
    }
    }
     
    int main()
    {
    int tabCase[63][127];
     
    tabInit(tabCase);
    /*
    tabCase[30][20]= 1;
    tabCase[29][19]= 1;
    tabCase[28][19]= 1;    //pattern du planneur du jeu de la vie.
    tabCase[28][20]= 1;   //Normalement pour X itération 5 cellule restent vivantes.
    tabCase[28][21]= 1;
    */
     
    /*
    tabCase[1][3]= 1;   //pattern du nid d'abeill il est censé comporter 6 case vivante au bout de 2 itérations.
    tabCase[2][1]= 1;
    tabCase[2][2]= 1;
    tabCase[2][3]= 1;
    */
     
    int iteration = 0, a =0, x =0, y = 0;
     
    a = countCell(tabCase);
    printf("Nombre de cellule viante avant : %d\n", a);
     
        for(iteration=0; iteration<1; iteration++)
        {
            boucleTab(tabCase, x, y);
            a = countCell(tabCase);
        }
     
     printf("Nombre de cellule viante : %d\n", a);
     
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include <stdio.h>
    #include <stdlib.h>
    #include "checkCell.h"
     
     
    int checkCell(int tab[63][127], int x, int y) //fonction qui test les cellules voisines.
    {
        int v1 = x + 1, v2 = x - 1;
        int w1 = y + 1, w2 = y - 1;
        int celvie = 0;
        if(tab[w2][v2] == 1)
        {
            celvie = celvie + 1;
        }
        if(tab[w2][v2] == 1)
        {
            celvie = celvie + 1;
        }
        if(tab[w2][x] == 1)
        {
     
            celvie = celvie + 1;
        }
        if(tab[w2][v1] == 1)
        {
     
            celvie = celvie + 1;
        }
        if(tab[y][v2] == 1)
        {
     
            celvie = celvie + 1;
        }
        if(tab[y][v1] == 1)
        {
            celvie = celvie + 1;
        }
        if(tab[w1][v2] == 1)
        {
            celvie = celvie + 1;
        }
        if(tab[w1][x] == 1)
        {
            celvie = celvie + 1;
        }
          if(tab[w1][v1] == 1)
        {
            celvie = celvie + 1;
        }
     
     
    return celvie;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <stdio.h>
    #include <stdlib.h>
    #include "boucleTab.h"
    #include "checkCell.h"
     
    void cellDie(int tab[63][127], int x, int y, int cell) //fonction pour tuer une cellule
    {
      if(cell != 2 && cell != 3)
        {
            tab[y][x] = 0;
        }
    cell = 0;
    }
     
     
    void cellBirth(int tab[63][127], int x, int y, int cell)  //fonction qui donne vie a une cellule
    {
        if(cell == 3)
        {
            tab[y][x] = 1;
        cell = 0;
        }
     
    }
     
    int countCell(int tab[63][127])  //fontion qui compte le nombre de cellule en vie
    {
    int i = 0, j = 0, count = 0;
        for(i=0; i<7; i++){
            for(j=0; j<15; j++)
            {
     
                if(tab[i][j] == 1)
                {
                count = count + 1;
                }
     
            }
      }
    return count;
    }
     
     
    void boucleTab(int tab[63][127], int x, int y)  //boucle qui permet de scaner case par case l'état des celulles.
    {
        int cellAlive = 0;
            for(y=0; y<7; y++)
            {
                for(x= 0; x<15; x++)
                    {
                    if(tab[y][x] == 1){
     
                    cellAlive = checkCell(tab, x, y);
                    cellDie(tab, x, y, cellAlive);
                    }
                    else if(tab[y][x] == 0)
                    {
     
                    cellAlive = checkCell(tab, x, y);
                    cellBirth(tab, x, y, cellAlive);
                    }
     
     
                }
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef CHECKCELL_H_INCLUDED
    #define CHECKCELL_H_INCLUDED
     
    int checkCell(int tab[63][127], int x, int y);
     
    #endif // CHECKCELL_H_INCLUDED
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifndef BOUCLETAB_H_INCLUDED
    #define BOUCLETAB_H_INCLUDED
     
    void cellDie(int tab[63][127], int x, int y, int cell);
    void cellBirth(int tab[63][127], int x, int y, int cell);
    void boucleTab(int tab[63][127], int x, int y);
    int countCell(int tab[63][127]);
     
     
    #endif // BOUCLETAB_H_INCLUDED

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Dans checkCell, tu as deux fois "if(tab[w2][v2] == 1)".
    Sinon, cette fonction devrait utiliser deux boucles for (de -1 à +1 sur X, idem sur Y) au lieu de dérouler tous les tests. Ce serait plus lisible et plus facile pour le debug.

    Autre chose : les tailles des tableaux, passe par des #define, il y aura moins de sources d'erreurs.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2013
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci, j'avais pas vu et je vais mettre des define si tu dit que c'est moins risquer.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    À ma connaissance, les automates cellulaires ne sont pas faits pour qu'une itération soit faite "à même le plateau": Le résultat de la cellule en cours ne doit pas affecter les entrées des cellules suivantes à la même itération (contrairement à, par exemple, un tramage à diffusion d'erreur qui compte justement dessus pour tout faire en une seule itération).

    Tu dois donc avoir une fonction d'itération avec un tableau d'entrée qui ne change pas, et un tableau de sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    int CoordonneesValides(int x, int y)
    {
    	return (x >= 0 && x < 127 && y >= 0 && y < 63);
    }
    int ContientCelluleVivante(int const etat[63][127], int x, int y)
    {
    	if(!CoordonneesValides(x, y))
    		return 0;
    	return etat[y][x] != 0;
    }
     
    int CompterVoisins(int const etat[63][127], int x, int y)
    {
    	int nVoisins = 0;
    	/*Sens des aiguilles d'une montre, en partant du nord*/
    	if(ContientCelluleVivante(etat, x, y-1))
    		nVoisins++;
    	if(ContientCelluleVivante(etat, x+1, y-1))
    		nVoisins++;
    	if(ContientCelluleVivante(etat, x+1, y))
    		nVoisins++;
    	if(ContientCelluleVivante(etat, x+1, y+1))
    		nVoisins++;
    	if(ContientCelluleVivante(etat, x, y+1))
    		nVoisins++;
    	if(ContientCelluleVivante(etat, x-1, y+1))
    		nVoisins++;
    	if(ContientCelluleVivante(etat, x-1, y))
    		nVoisins++;
    	if(ContientCelluleVivante(etat, x-1, y-1))
    		nVoisins++;
    	return nVoisins;
    }
     
    void CalculVie(int const ancienEtat[63][127], int nouvelEtat[63][127])
    {
    	int y;
    	for(y=0 ; y<63 ; y++)
    	{
    		int x;
    		for(x=0 ; x<127 ; x++)
    		{
    			int nVoisins = CompterVoisins(ancienEtat, x, y);
    			switch(nVoisins)
    			{
    			case 0:
    			case 1:
    				/*Pas assez de voisins: Mort*/
    				nouvelEtat[y][x] = 0;
    				break;
    			case 2:
    				/*Deux voisins: état précédent conservé*/
    				nouvelEtat[y][x] = ancienEtat[y][x];
    				break;
    			case 3:
    				/*Exactement trois voisins: Vie/Naissance*/
    				nouvelEtat[y][x] = 1;
    				break;
    			case 4:
    			case 5:
    			case 6:
    			case 7:
    			case 8:
    				/*Trop de voisins: Mort*/
    				nouvelEtat[y][x] = 0;
    				break;
    			}
    		}
    	}
    }
    Et une fois que tu as tout calculé, tu peux écraser l'ancien avec le nouveau.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Voire, simplement permuter les deux pointeurs, pour pouvoir faire une séquence d'itérations sans réallouer de tableaux.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme de conception pour un Conway's life
    Par areuh_fr dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 10/12/2008, 22h49
  2. Gratuit : Conférence jeux video Game’s Life, 3ème édition, Paris 5ème
    Par spawntux dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 30/01/2007, 15h50
  3. Conway's life (jeu de la vie) pour images
    Par O( N ) dans le forum C
    Réponses: 1
    Dernier message: 26/09/2006, 02h13
  4. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25
  5. Algorithme génétique
    Par Stephane.P_(dis Postef) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/03/2002, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo