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 :

Jeu de la vie, problème d'affichage.


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Jeu de la vie, problème d'affichage.
    Salut, ceci est mon premier post sur le forum, je me suis toujours contenté des tuto, mais cette fois je bloque sur un problème d'affichage sur le jeu de la vie de conway.

    J'ai fait il y a déjà quelques mois un jeu de la vie dont le code source était absolument miteux, j'ai réussis à me débrouillé avec des tableaux à une seule dimension, trois fois trop de code pour pas grand chose, mais au moins il fonctionnais.
    J'ai décidé de recommencer un jeu de la vie pour qu'il soit portable linux/windows, et utiliser des tableaux à deux dimensions pour faciliter la compréhension et la lisibilité du code.
    Je m'y suis remis cette après-midi, mais malheureusement le code "quasi final" à des problèmes d'affichages, sous windows la dernière ligne du tableau n'est jamais complète idem sous linux avec de plus un entré qui sépare le tableau en 2.

    Sa fais quelques heures que je n'avance plus, donc je viens demander un soutient ici j'ai pas le choix ^^ .

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    /*****************************************************************************************************/
    /*******************************************Le jeu de la vie******************************************/
    /**********************************Automate cellulaire de Conway (1970)*******************************/
    /*****************************************************************************************************/
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #if defined (linux)
        #include <unistd.h>
    #elif defined (WIN32)
        #include <windows.h>
    #endif
     
    #ifdef WIN32
        #define SYSTEM() system("cls");
    #else
        #define SYSTEM() system("clear");
    #endif
     
    /**************************************/
    /************Les constantes************/
    /**************************************/
    #if defined (linux)
        #define LARG 54
        #define LONG 208
    #elif defined (WIN32)
        #define LARG 80
        #define LONG 80
    #endif
     
    /**************************************/
    /************Les prototypes************/
    /**************************************/
    void afficheRegle();
    int pourcentage(int nbCase);
    void afficheTableau(int nbCase);
    void testCase();
    void genereVie(int tab[LARG][LONG], int tableau[LARG][LONG]);
     
    /**************************************/
    /********les variables globales********/
    /**************************************/
    int nbCase;
    int tableau[LARG][LONG];
    int tab[LARG][LONG];
     
    int main(int argc, char *argv[])
    {
    	int choix;
     
    	srand(time(NULL));
     
    	do
    	{										//Tant que le choix est diff�rent de 1 on redemande
    		SYSTEM()
     
    		printf("\t\t\t===Jeu de la vie===\n\n");
    		printf("Que souhaitez vous faire : \n");
    		printf("1.Lancer une simulation\n2.Afficher les r�gles\n\n3.Quitter\n");
    		printf("Votre choix : ");
    		scanf("%d", &choix);
     
    		switch(choix)
    		{
    			case 1:
    			nbCase=pourcentage(nbCase);				   	//Appel de la fonction qui permet de calculer le pourcentage de case pleine
    			afficheTableau(nbCase);						//Appel de la fonction qui permet d'afficher le premier tableau
    			while(1)                                    //Boucle infinis temporaire, A MODIFIER QUAND L' AFFICHAGE FONCTIONNERA
    			{
    				testCase();					      	    //Appelle de la fonction qui va calculer le nombre de cellule pleine autour de chaque cellule
    				genereVie(tab, tableau);				//Appelle de la fonction qui va modifier la disposition des cellules en fonctions de celles qui les entours
    			}
    			break;
     
    			case 2:
    			afficheRegle();
    			break;
     
    			case 3:								 //ARRET DU PROGRAMME
    			return EXIT_SUCCESS;
     
    			default:							//MESSAGE D ERREUR
    			printf("Vous n'avez pas entrer une valeur correcte, veuillez recommencer\n");
    			printf("Appuyer sur entrer pour continuer...");
    			getchar();
    			getchar();
    		}
    	}while(choix!=1);
     
    	return EXIT_SUCCESS;
    }
     
    /*************************************/
    /***Fonction qui affiche les regles***/
    /*************************************/
    void afficheRegle()
    {
    	SYSTEM()
     
    	puts("\t\t\t\t===REGLES===\n\n\n");
    	puts("Le jeu de la vie n'est pas un jeu au sens ludique, mais un automate cellulaire.\n");
    	printf("C'est-a-dire que le programme agit de lui meme sans aucune intervention de \nl'utilisateur.\n\n");
    	printf("Il y a 3 grandes r�gles:\n\n1. Si une case vide est entour�e par 3 pleines elle se rempli.\n\n2. Si une case est entour�e par 2 cases pleines elle reste dans son etat\n\n3. Si une case pleine est entour�e par moins de 2 ou plus de 3 cases pleines, elle se vide.\n\n");
     
    	printf("Appuyez sur entrer pour continuer...");
    	getchar();
    	getchar();
    }
     
    /**************************************************************/
    /***Fonction qui calcule le nombre de case pleine au depart***/
    /*************************************************************/
    int pourcentage(int nbCase)
    {
    	double pourcent = 0;
     
    	do      //Tant que le pourcentage est superieur a 100 ou inferieur a 0, on redemande
    	{
    		SYSTEM()
     
    				printf("\t\t\t\t===REGLAGE===\n\n\n");
    		printf("Quel pourcentage de cases vivantes voulez-vous au depart de la simulation : ");
    		scanf("%lf", &pourcent);    //Entr�e du pourcentage
     
    		if (pourcent > 100 || pourcent < 0)         //MESSAGE D ERREUR
    		{
    			printf("\nVeuillez entrer un pourcentage correcte s'il vous plait.\n");
    			printf("Appuyez sur entrer pour continuer...");
    			getchar();
    			getchar();
    		}
     
    	} while (pourcent > 100 || pourcent < 0);
     
    	nbCase = (pourcent / 100) * (LARG*LONG);       //calcul du nombre de case remplie en fonction du pourcentage.
     
    	return nbCase;
    }
     
    /*********************************************/
    /***Fonction qui calcule le tableau de base***/
    /*********************************************/
    void afficheTableau(int nbCase)
    {
    	int i, j, var;
     
    	SYSTEM()
     
    	for(i=0; i<LARG; i++)				//boucle qui continue tant que le nombe de lignes n'est pas �gales � 54 ou 80
    	{
    		for(j=0; j<LONG; j++)		//boucle qui continue tant que le nombre de caractere dans une ligne n'est pas �gales � 208 ou 80
    		{
    			var = rand() % (LARG*LONG);			//calcul si une case est vide ou non
     
    			if(i==0 || i==LARG-1)
    			{
    				for(j=0; j<LONG; j++)			//Donne la valeur 0 � la premiere ligne du tableau
    				{
    					tableau[i][j]=0;
    					putchar(' ');
    				}
    			}
     
    			else if(var > nbCase || j == 0 || j == 207)	//donne la valeur 0 a la case donn� du tableau et affiche un espace ET donne la valeur 0 sur les cot�s du tableau
    			{
    				putchar(' ');
    				tableau[i][j]=0;
    			}
     
    			else					//donne la valeur 1 a la case donn� du tableau et affiche un 'O'
    			{
    				printf("O");
    				tableau[i][j]=1;
    			}
    		}
    	}
    }
     
    /*******************************************************************************/
    /***Fonction qui calcule le nombre de cellule pleine autour de chaque cellule***/
    /*******************************************************************************/
    void testCase()
    {
    	int i, j, nbCasePleine;
     
    	for(i=1; i<LARG-1; i++)
    	{
    		for(j=1; j<LONG-1; j++)
    		{
    			nbCasePleine = 0;
     
    			if(tableau[i][j+1]==1)
    				nbCasePleine++;
    			if(tableau[i][j-1]==1)
    				nbCasePleine++;
    			if(tableau[i+1][j]==1)
    				nbCasePleine++;
    			if(tableau[i+1][j-1]==1)
    				nbCasePleine++;
    			if(tableau[i+1][j+1]==1)
    				nbCasePleine++;
    			if(tableau[i-1][j]==1)
    				nbCasePleine++;
    			if(tableau[i-1][j-1]==1)
    				nbCasePleine++;
    			if(tableau[i-1][j+1]==1)
    				nbCasePleine++;
     
    			tab[i][j]=nbCasePleine;
    		}
    	}
    }
     
    /*********************************************************************************************/
    /***Fonction qui modifie la disposition des cellules en fonctions de celles qui les entours***/
    /*********************************************************************************************/
    void genereVie(int tab[LARG][LONG], int tableau[LARG][LONG])
    {
    	int i, j, tablo[LARG][LONG];
     
    	SYSTEM()
     
    	for(i=1; i<LARG-1; i++)
    	{
    		for(j=1; j<LONG-1; j++)
    		{
    			if((tableau[i][j]==0 && tab[i][j]==3) || (tableau[i][j]>0 && tab[i][j]==3)) //Si une case est entour� par 3 pleine elle se rempli
    			{
    				printf("O");
    				tablo[i][j]=1;
    			}
     
    			else if(tab[i][j]==2)                                                       //si une case est entour� par 2 case pleine elle reste dans son �tat
    			{
    				if(tableau[i][j]==0)
    				{
    					putchar(' ');
    					tablo[i][j]=0;
    				}
     
    				else
    				{
    					printf("O");
    					tablo[i][j]=1;
    				}
    			}
     
    			else if((tableau[i][j]>0 && (tab[i][j]<2 || tab[i][j]>3)) || (tableau[i][j]==0 && (tab[i][j]<2 || tab[i][j]>3)))//Si une case est entour� par - de 2 ou + de 3 elle meurt
    			{
    				putchar(' ');
    				tablo[i][j]=0;
    			}
    		}
    	}
     
    	for(i=1; i<LARG-1; i++)
    	{
    		for(j=1; j<LONG-1; j++)
    			tableau[i][j]=tablo[i][j];
    	}
    }
    Voila, voila, si quelqu'un trouve le(s) problème(s), j'attends les réponses, merci beaucoup.
    Si au passage vous pouviez me dire comment le rendre compatible avec mac aussi sa serais sympa, même si c'est très secondaire.

    EDIT: j'ai modifier le code source, pour le rendre encore meilleur, sa ne fonctionne toujours pas, j'ai vraiment besoin d'un coup de pouce.

  2. #2
    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
    Que veux-tu dire par "n'est jamais complète" ?

    De plus, je conçois que ta fonction d'affichage soit encore au state expérimental, mais elle ne devrait pas modifier le tableau pour autant. Et aussi, à des fins de débogage, peut-être devrais-tu afficher des points ou des underscores plutôt que des espaces?
    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.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Rah lala, je suis dégouté, j'ai modifié quelques morceau de code pour qu'il soit mieux présenté parce que je ne trouvais pas le problème principale.
    Ce matin en entrant à l'iut j'ai eu un flash divin qui m'a dit ce que j'avais oublié de faire.
    Devinez quoi: Un simple puts("");
    il manquaist juste 2 puts(""); à deux endroit du code pour faire des entrées, maintenant sa fonctionne normalement sous linux et sous windows =)
    Dire que j'ai passé plusieurs heures à trouver d'ou venait le problème c'est un coup à s'arracher les cheveux.


    Je ne met pas le problème en résolu pour autant, car je n'arrive pas à fait des pauses sous linux infèrieure à 1 seconde, or l'idéal serais de 0.125s mais si je tape sleep(0.125) sa ne fonctionne pas.
    Je continue mes recherches.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    sleep(0.125), cela ne doit pas passer, le compilateur il doit crier.

    La fonction attend un entier (pas un flottant) et la résolution minimale est de 1 seconde (voir la page du man)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par -ezano- Voir le message
    Je ne met pas le problème en résolu pour autant, car je n'arrive pas à fait des pauses sous linux infèrieure à 1 seconde, or l'idéal serais de 0.125s mais si je tape sleep(0.125) sa ne fonctionne pas.
    Je continue mes recherches.
    Tu peut voir du coté de usleep ou mieux nanosleep ...
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Tu peut voir du coté de usleep ou mieux nanosleep ...
    Voir aussi cette discussion, on y a mis du code portable (Windows/Linux) avec des résolutions à la milliseconde, justement.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. jeu de la vie (conway-petit problème..)
    Par morius dans le forum Ruby
    Réponses: 8
    Dernier message: 18/03/2009, 13h00
  2. [SDL et C] Problème avec mon jeu de la vie
    Par _SamSoft_ dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 24/05/2008, 09h43
  3. Réponses: 12
    Dernier message: 11/05/2008, 22h05
  4. Problème pour le jeu de la vie
    Par daninou dans le forum Débuter
    Réponses: 8
    Dernier message: 04/12/2007, 21h14
  5. Problème jeu de la vie de Wolfram
    Par romromp dans le forum Pascal
    Réponses: 14
    Dernier message: 11/03/2007, 19h58

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