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 - Gestion de mauvaise lettre


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Jeu du Pendu - Gestion de mauvaise lettre
    Bonsoir les programmeurs!

    Etudiant en 1ere année de BTS IRIS, je dois faire un petit projet.
    Mon choix c'est porté sur le jeux du pendu en C++.

    Mais je rencontre un problème :
    - quand l'utilisateur rentre une lettre bonne : OK.
    - quand l'utilisateur rentre une lettre déjà tapé : OK.
    - quand l'utilisateur rentre une lettre mauvaise : Problème.

    Lorsque l'utilisateur rentre une lettre mauvaise, mon programme ne réagit pas!

    Voici le code source :

    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
     
     
    #include <iostream>
    #include <string>
    #include <cstdlib>
     
    using namespace std;
     
     
    int main()
    {
     
    cout << "\t\t__________________________________________" << endl;
    cout << "\t\t|:::::::::    Jeu du pendu      :::::::::|" << endl;
    cout << "\t\t__________________________________________" << endl;
    cout << "\t\t      Bienvenue dans le jeu du pendu      " << endl;
     
     
    string pseudo;
    char motMystere[] = "helloworld";
    char motATrouver[] = "------------";
    char lettreSaisie;
    int nombreEssais = 7;
    int i;
     
    cout << endl;
    cout << "Saisissez votre pseudo :" << endl;
    cin >> pseudo;
    system("clear");
    // cout << "Appuyez sur une enter pour commencer la partie!" << endl; // en traitement.
     
     
       while (nombreEssais > 0)
       {
     
    bool lettreSaisieBool, lettreDejaTape = false;
     
    	cout << endl << "Veuillez saisir une lettre : " << endl;
    	cin >> lettreSaisie;
     
    // Boucle de test permettant de définir si  la lettre a déja était saisie.
    	for (i = 0 ; i < 10 ; i++) 
    		{
    			if (lettreSaisie == motATrouver[i])
    			{
    				lettreDejaTape = true; // lettre déjà tapé.
    				nombreEssais--;
     
    				if (nombreEssais == 0)
    				{
    					cout << "Perdu ! le mot secret étais : HELLOWORLD " << endl;
    				}
    				else
    				{
    					cout << "Vous avez déja fait apparaitre cette lettre dans le mot ! Plus que " << nombreEssais << " essais !" << endl;
    				}
    			}
    		}
     
    // Lettre pas encore saisie auparavant.
      	if (lettreDejaTape == false) 
      	{
    			for (i = 0; i < 10; i++)
    			{
     
    				if (lettreSaisie == motMystere[i]) // si lettre saisie = une des lettres du mot mystere
    				{
    					lettreSaisieBool = true; // lettre bonne
    					motATrouver[i] = lettreSaisie; // on remplace la/les lettres dans le tableau du mot à trouver.
    					cout << "Cette lettre est bien dans le mot mystère!" << endl;
    				}	
            		}
    	}
     
    // Lettre n'apparait pas dans le mot. 
      	if (lettreSaisieBool = false)
      	{
    		nombreEssais--;
     
    		if (nombreEssais == 0) 
    		{
    			cout << "Perdu ! le mot secret était : HELLOWORLD!" << endl;
    		}
    		else
    		{
    			cout << "Raté ! cette lettre n'apparait pas dans le mot ! Plus que " << nombreEssais << " essais !" << endl;
    		}
    	}
     
    				for (i = 0 ; i < 10 ; i++) // on affiche les lettres bonnes dans le tableau motATrouver.
    				{
    					cout << motATrouver[i] << " ";
    				}		
     
    } // fin du while
     
     
     
    } // fin du main
    Merci d'avance.

    Cordialement.

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Plusieurs questions pratiques.

    1) Pourquoi présentes-tu un code non indenté (ou mal indenté) sur un forum?
    2) Pourquoi utilises-tu des char * au lieu de string
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    1) C'est simplement pour m'aider à me repérer plus facilement dans mon code.
    Est-ce mal ?
    2) Pour comparer une lettre avec les lettres d'un mot pré-défini, il faut bien un tableau de caractère ?

    Comment peut-on comparer une lettre saisie, avec les lettres d'un mot de type string ?

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    1) C'est simplement pour m'aider à me repérer plus facilement dans mon code.
    Est-ce mal ?
    On ne repère rien du tout au contraire.

    2) Pour comparer une lettre avec les lettres d'un mot pré-défini, il faut bien un tableau de caractère ?
    Avec la méthode at de la classe string, voir la doc

    J'édite en ajoutant un mini code permettant de vérifier à la fois la lettre non trouvée ou la modification du mot mystère dans le cas des lettres trouvées.

    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
    #include <iostream>
    #include <string>
     
    using namespace std;
     
    void test(string mot, string &mystere, char letter);
     
    int main(void)
    {
        string mot("Bonjour");
        string myst("*******");
     
        test(mot, myst, 'o');
     
        cout << myst << endl; // *o**o**
     
        return 0;
    }
     
    void test(string mot, string &mystere, char letter)
    {
        int n(0);
     
        for(unsigned int i(0); i<mot.size(); i++)
            if(mot.at(i) == letter)
            {
                mystere.at(i) = letter;
                n += 1;
            }
     
        if (n==0)
            cout << "lettre non trouvée" << endl;
    }
    Bien évidemment dans ce code je ne teste pas si cette lettre avait déjà été prononcée avant ou non.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    D'ailleurs, il y a un nombre assez important de possibilités fournies par la classe std::string...

    La fonction test pourrait ressembler à
    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
    void test(string const & mot, string &mystere, char letter)
    {
        size_t found = 0;
        int count = 0;
        do
        {
            found = mot.find_first_of(letter);
            if(found != mot::npos)
            {
                mystere.replace(found,1,1,letter);
                ++count;
            }
        }while(found == mot::npos);
        if(count == 0)
        {
            std::cout<<"lettre non trouvee"<<std::endl;
        }
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    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
    Au passage, le problème initial était à la ligne 76:
    Code mauvais : Sélectionner tout - Visualiser dans une fenêtre à part
      	if (lettreSaisieBool = false)
    Utilisation de = au lieu de ==, par conséquent le code mettait lettreSaisieBool à false, puis testait si le résultat était true (ce qui ne pouvait évidemment jamais être le cas).

    Une façon pour les débutants d'éviter ça, c'est la méthode Yoda, qui consiste à mettre la constante à gauche: On perd en lisibilité, mais au moins si on oublie le second '=' on a une erreur:
    Code mauvais détectable : Sélectionner tout - Visualiser dans une fenêtre à part
      	if (false = lettreSaisieBool) //Erreur!

    Mais je trouve qu'il est plus simple, quand on manipule des Booléens, d'omettre simplement la comparaison, parce qu'un Booléen est déjà soit vrai, soit faux:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
      	if ( ! lettreSaisieBool)
    Note 1: Pour des raisons de lisibilité, je déconseille d'utiliser ça avec d'autres types de données (comme pour tester la nullité d'un pointeur).
    Note 2: Quand je parle de type de données, je dis ça au point de vue fonctionnel: Si une variable entière est utilisée uniquement de manière Booléenne (genre, le retour des fonctions de <cctype>), je suis pour omettre la comparaison aussi. Par contre si elle peut valoir plus de deux valeurs (par exemple le retour de la fonction C strcmp()), je suis pour écrire la comparaison explicitement.
    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.

Discussions similaires

  1. Réponses: 11
    Dernier message: 16/12/2007, 16h33
  2. Jeu Bonhomme pendu
    Par yinyann86 dans le forum Delphi
    Réponses: 11
    Dernier message: 14/11/2006, 17h03
  3. Le jeu du pendu.
    Par giggs dans le forum C
    Réponses: 5
    Dernier message: 31/10/2006, 13h40
  4. jeu du pendu
    Par krachik dans le forum Langage
    Réponses: 5
    Dernier message: 24/10/2006, 12h48
  5. Réponses: 4
    Dernier message: 24/03/2006, 13h54

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