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 du pendu sur console - problème de boucle


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut Jeu du pendu sur console - problème de boucle
    Bonjour,

    I/Présentation
    Alors voila,j'ai repris un TP et le tuto qui va avec il y a peu. Le but est de créer un jeu du pendu sur console.

    II/Mon problème
    Le seul problème que je rencontre est que la boucle s’arrête de fonctionner inexplicablement.En gros elle ne s’arrête pas en fonction de ma condition d’arrêt.
    ->Mais plutôt et il me semble en fonction du nombre de lettres du "motMystere" après les différents "tests" que j'ai pu faire.

    III/Mon Code
    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
    //--------------------------TP:Jeu Du Pendu---------------------------------------------------------------------------------------
     
    char lireCaractere() {
        char caractere = 0;
     
        caractere = getchar(); // On lit le premier caractère
        caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà
     
        // On lit les autres caractères mémorisés un à un jusqu'au \n (pour les effacer)
        while (getchar() != '\n') ;
     
        return caractere; // On retourne le premier caractère qu'on a lu
    }
     
    void jeuDuPendu(){
        char motMystere[]="MARRON";
        char newCa;//newCa=nouveau caractere cad celui que l'utilisateur rentre
        int nbreCo=0;//nbreCo=nombre de coups joué
        int nbreCa=strlen(motMystere);//nbreCa=nombre de Caractere
        printf("nbre de Cara:%d\n",nbreCa);
        int h=0,i=0;//autres compteurs
     
        char motMasque[nbreCa];//Ce qui s'affiche à l’ecran
        for(h=0;h<=nbreCa;h++){
            motMasque[h]='*';
            if(h==nbreCa){
                motMasque[h]='\0';
                printf("--mot mystere:%s\n",motMasque);
            }
        }
     
        int nbreVie=10;//nbreVie=nombre de vie
        char motTmp[nbreCa];
     
        for(nbreCo=0;nbreCo<nbreVie;nbreCo++){
            newCa=lireCaractere();
            copierTableauChar(motMasque,motTmp,nbreCa);
            for (i=0;i<nbreCa;i++){//On Verifie(par comparaison)si la lettre rentrée existe ds le"motMystere"
                if(newCa==motMystere[i]){
                    motMasque[i]=newCa;
                }
            }
            if(strcmp(motMystere,motMasque)==0){
                printf("---------Gagne!---------\nLe mot mystere etait:%s\n",motMystere);
                break;
            }
            if(strcmp(motTmp,motMasque)==1){
                nbreVie--;
                printf("Erreur!Cette lettre n'existe pas.Il vs reste %d vies.\nNombre de coups joues: %d\n",nbreVie,nbreCo);
            }else{
                printf("Bien joue!\n");
            }
            printf("--mot masque:%s\n",motMasque);
        }
    }
     
     
    //----------------------FIN:TP:Jeu Du Pendu---------------------------------------------------------------------------------------
    La partie la plus intéressante pour ce probléme (il me semble):
    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
    int nbreVie=10;//nbreVie=nombre de vie
        char motTmp[nbreCa];
     
        for(nbreCo=0;nbreCo<nbreVie;nbreCo++){
            newCa=lireCaractere();
            copierTableauChar(motMasque,motTmp,nbreCa);
            for (i=0;i<nbreCa;i++){//On Verifie(par comparaison)si la lettre rentrée existe ds le"motMystere"
                if(newCa==motMystere[i]){
                    motMasque[i]=newCa;
                }
            }
            if(strcmp(motMystere,motMasque)==0){
                printf("---------Gagne!---------\nLe mot mystere etait:%s\n",motMystere);
                break;
            }
            if(strcmp(motTmp,motMasque)==1){
                nbreVie--;
                printf("Erreur!Cette lettre n'existe pas.Il vs reste %d vies.\nNombre de coups joues: %d\n",nbreVie,nbreCo);
            }else{
                printf("Bien joue!\n");
            }
            printf("--mot masque:%s\n",motMasque);
        }
    Merci de votre aide.

  2. #2
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Ta boucle n'est pas correct d'un point de vue conception. Dans un jeu, en général on fait une boucle de ce type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tant que jeux_pas_terminer
    faire
    .....
    fin tant que
    donc dans ton cas, l’algorithme que tu devrais faire:

    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
    jeux_pas_terminer <- vrai
    tant que jeux_pas_terminer
    faire
    afficher masque mot
    récupéré caractere
    verifier caractere
    si caractere dans mot mystere
    alors
      modifier masque
    sinon
      retirer une vie
    fin si
    si vie inférieur ou égal à 0
    alors
      jeux_pas_terminer <- faux
    fin si
    fin tant que
    Me rappelle plus exactement les syntaxe pour le pseudo-code, donc j'ai fais avec les moyen du bord .

    Revenons à ton code.
    Tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(nbreCo=0;nbreCo<nbreVie;nbreCo++){
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(strcmp(motTmp,motMasque)==1){
                nbreVie--;
                printf("Erreur!Cette lettre n'existe pas.Il vs reste %d vies.\nNombre de coups joues: %d\n",nbreVie,nbreCo);
            }
    Il y a un soucis, lorsque le joueur se trompe, ça vie va diminuer et le nombre de coup jouer va augmenter, sur le papier, ça peut fonctionner.
    Mais de la manière dont tu l'as fait, tu compare le nombre de coup jouer avec le nombre de vie.
    Donc lorsque le joueur se trompe, il perd deux coups au final, au lieu d'un seul.

    Je te conseillerais donc de faire comme condition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(nbreCo=0;nbreVie>0;nbreCo++){
    De cette manière ton pendu devrait fonctionner (bien que d'un point de vue pratique, cette méthode n'est pas très compréhensible .

    d'ailleurs, d'une manière général, préfère utiliser les while plutot que les for pour des boucle complexes.
    Et utiliser les for pour des parcours de tableau ou autre besoin avec un iterateur . (ceci reste un avis personnel ^^).
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  3. #3
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    @Skeud//

    -Je viens de lire ton message et effectivement maintenant mon code fonctionne.

    -Cependant il reste un truc que je ne pige pas tu dis:
    Mais de la manière dont tu l'as fait, tu compares le nombre de coups joués avec le nombre de vies.
    Donc lorsque le joueur se trompe, il perd deux coups au final, au lieu d'un seul.
    ->Hors j'affichais à chaque tour de boucle dans la console ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Erreur!Cette lettre n'existe pas.Il vs reste %d vies.\nNombre de coups joues: %d\n",nbreVie,nbreCo);
    Et je constatais que tout se décrémentait correctement.
    Pourquoi ?

    Merci de ta réponse.

  4. #4
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Tu diminues le nombres de vie et tu incrémente le nombre de coup jouer, ça semble fonctionner, mais dans ta comparaison, tu compare le nombres de coup jouer avec le nombre de vie.

    donc quand tu perds, c'est comme si tu jouais 2 fois à la place d'une . (un coup jouer et -1 vie = 2 tour de boucle en moins).
    Exemple:
    Nombre de vie = 10;
    Nombre de coup jouer = 0;
    Nombre de coup à jouer = 10;

    Tu perds donc:
    Nombre de vie = 9;
    Nombre de coup jouer = 1;
    Nombre de coup à jouer = 9-1=8;

    donc il reste 8 coups, or tu n'en as jouer qu'un seul, donc normalement, il devrait t'en rester 9 . CQFD.
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pif_Paf_Pouf Voir le message
    ->Hors j'affichais à chaque tour de boucle dans la console ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Erreur!Cette lettre n'existe pas.Il vs reste %d vies.\nNombre de coups joues: %d\n",nbreVie,nbreCo);
    Et je constatais que tout se décrémentait correctement.
    Pourquoi ?
    Bonjour
    Je présume que tu affichais la valeur "nbreCo" dans la boucle. Or (conjonction de coordination et non pas "hors" !!!) la variable "nbreCo" est incrémentée dans l'instruction "for" elle-même donc s'incrémente en fin de boucle donc après ton affichage !!!
    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]

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

Discussions similaires

  1. Un jeu d'invasion en POO - Problème de boucle
    Par <arobase> dans le forum Tkinter
    Réponses: 2
    Dernier message: 10/05/2008, 17h48
  2. Jeu du pendu : problème de boucle
    Par hitman_47 dans le forum Pascal
    Réponses: 31
    Dernier message: 03/01/2008, 19h58
  3. Problème de boucle sur une checkbox
    Par jeremie74 dans le forum Flash
    Réponses: 3
    Dernier message: 05/03/2007, 14h58
  4. [MySQL] Problème de boucle while sur base de données
    Par Darhyl dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 05/05/2006, 15h11
  5. [Eval] Problème de boucle for sur des tableaux
    Par battle_benny dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/01/2006, 23h55

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