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 :

Problème d'affichage dans des boucles whiles


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Par défaut Problème d'affichage dans des boucles whiles
    Bonjour a tous,

    Je suis en train de débuté un projet en c pour mes cours et je rencontre un problème.
    Il s'agit d'un petit jeu 2D et je suis en train de gérer l'affichage du menu initial et de l'affichage d'une grille de jeu.
    j'ai donc mis deux boucles, une qui me permet l'affichage du menu et l'autre qui affiche la grille et qui attends l'entrée d'une touche
    par l'utilisateur. Le problème étant que la grille s'affiche deux fois lorsque je lance le programme et je n'arrive pas
    à comprendre pourquoi. Je vous met un extrait du main (il y a tout une partie de génération de map qui ne concerne pas le prob) ainsi que de l'affichage du programme, merci d'avance pour votre aide.

    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
     
    ...
    do {
            int n = 1;
            int choix;
            Joueur j1;
     
            system("cls");
            printf("Menu Principal\n\n");
            printf("1 - Demarrer\n2 - Demarrer le serveur\n3 - Rejoindre un serveur\n4 - Quitter\n");
            printf("Votre choix : ");
            scanf("%d", &choix);
            int win2 = 0;
            switch (choix) {
                case 1:
                    //Appel de la fonction selection map avant de lancer le jeu
                    // Le jeu se lance
                    while(win2 == 0){
    //                    if(joueur == 1){
    //                        joueur = 2;
    //                    }
    //                    else{
    //                        joueur = 1;
    //                    }
                        if (map_choice == 0) {
                            rows = 7;
                            columns = 9;
                            // génération de la map
                            map = create_map1(nb_bombes, columns, rows);
                            //affichage de la map
                            affiche_map(map, columns, rows);
                            j1.rows = 3;
                            j1.columns = 1;
                        } else {
                            rows = 7;
                            columns = 15;
                            // génération de la map
                            map = create_map2(nb_bombes, columns, rows);
                            //affichage de la map
                            affiche_map(map, columns, rows);
                        }
     
                        char m;
                        printf("deplacez vous a l'aide des touches Z,S,Q,D ou poser une bombes \n");
                        scanf("%c", &m);
                        printf("%c\n", m);
     
                        if(m == 'z' || m == 's' || m == 'q' || m == 'd'){
                            deplacementJoueur(map, m, &j1);
                        }
                        else if(m == 'x'){
                            win2 = 1;
                        }
                ...
    Nom : Screenshot from 2022-11-02 09-48-23.png
Affichages : 240
Taille : 41,2 Ko

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 769
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par mrpilon Voir le message
    Le problème étant que la grille s'affiche deux fois lorsque je lance le programme et je n'arrive pas
    à comprendre pourquoi.
    C'est malheureusement un grand classique en C.
    Lorsque tu appelles scanf("%d", &choix) et que là tu tapes ta valeur (exemple 1), tu valides cette saisie par <return>.
    Hé bien les deux touches tapées, le '1' et le <return> vont dans le buffer stdin (le clavier). Ensuite le scanf() récupère la première valeur, le '1', mais laisse le <return> dans stdin.
    A l'itération suivante, le buffer stdin n'étant pas vide, le scanf() le récupère directement sans te laisser la possibilité de saisir une valeur et là ça fait le second affichage.

    Le souci de scanf(), c'est que ce n'est pas une fonction dédiée à la saisie humaine car ça attend un truc "formaté" et que ce que tape un humain est tout sauf formaté. Malheureusement c'est une des premières fonctions que les profs montrent aux débutants car ça leur fait un raccourci à travers des notions qu'ils n'ont ainsi pas besoin d'expliquer. Et parfois, conscients du souci mais pas super au point question C (oui, beaucoup de profs de C ne savent pas faire de C), ils vont jusqu'à conseiller de rajouter fflush(stdin) après le scanf() pour nettoyer le clavier (ce qui est une hérésie totale car fflush() est fait pour finaliser des écritures en attente et que stdin n'est pas un buffer d'écriture). Hé oui, en C faire de la saisie c'est pas super compliqué... mais ça s'apprend.

    Donc une première solution, pas vraiment parfaite (ce n'est pas celle que j'utilise), mais qui pourra suffire pour l'instant, c'est qu'après avoir saisi ton nombre (et c'est aussi le même problème quand tu fais saisir un char via "%c"), nettoyer le clavier de tout ce qui dépasse. Il y a un sujet à ce propos dans la faq.

    Concernant ton programme, je te conseillerais de découper les étapes. Une fonction pour afficher le menu et renvoyer la valeur choisie, une fonction pour afficher le terrain, etc. Je t'assure que tu y gagneras au final.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 597
    Par défaut
    Le problème est un classique de l'utilisation de %c dans scanf(). %c va récupérer le premier caractère restant, mais il reste le <return> dans le buffer d'échange avec la console est c'est lui qui est lu au lieu d'attendre une autre saisie.
    Il existe un moyen simple, remplacer scanf("%c", &m); par scanf(" %c", &m);. Vois-tu la différence? Cette espace en plus demande à scanf() de sauter tous les caractères non affichables avant de faire le %c. Et c'est ce qui va gober le <return> qui restait, le buffer d'échange est alors vide attendant une autre saisie. Le premier caractère non espace saisi sera alors le caractère capté par le le %c.

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 062
    Par défaut
    Autre point : cls n'existe pas sous Linux, c'est clear. Et appeler system n'est pas l'idéal pour effacer l'écran. Mais si tu débutes, ça va être compliqué à gérer autrement
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2022
    Messages : 6
    Par défaut
    D'accord merci a tous c'est plus clair

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

Discussions similaires

  1. problème de recordset dans une boucle while
    Par sebac dans le forum VBA Access
    Réponses: 1
    Dernier message: 04/06/2007, 12h47
  2. [MySQL] Problème d'affichage dans un boucle while
    Par Yagami_Raito dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 25/05/2007, 09h31
  3. problème de syntaxe dans des boucles imbriquées
    Par deglingo37 dans le forum Access
    Réponses: 2
    Dernier message: 01/09/2006, 15h46
  4. Problème de SCANF dans une boucle WHILE
    Par FidoDido® dans le forum C
    Réponses: 4
    Dernier message: 30/12/2005, 18h42
  5. [Conception] Problème de test dans une boucle while
    Par Cyrius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/11/2005, 19h07

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