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 :

Pendu qui se termine immédiatement


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Pendu qui se termine immédiatement
    bonjour,

    je débute en c++ (et en codage) et mon code du jeu du pendu ne fonctionne pas. En fait quand je le lance, dès que je rentre le mot secret que l'utilisateur doit trouver, le programme se termine. Quelqu'un pourrait m'aider? Le soucis vient de la ligne 86 très certainement
    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
    #include <iostream>
    #include <fstream>
    #include <string>
    #include "dico.h"
    #include <windows.h> 
    #include <set>
     
    using namespace std;
     
     
     
    void afficheMot(int lettreTrouve[],const char motSecret[], int taille)
    {
    	for(int i = 0; i < taille; i++)
    	{
    		if(lettreTrouve[i] == 1)
    		{
    			cout << motSecret[i];
    		}
    		else
    			cout << " * ";
    	}
    	cout << endl;
    }
     
     
     
     
    char lireCaractere()
    {
    	char caractere = 0;
    	caractere = getchar();
    	caractere = tolower(caractere);
    	while(getchar() != '\n');
    	return caractere;
    }
     
    int rechercheLettre(int lettreTrouve[], const char motSecret[], char maLettre, int taille)
    {
    	int trouve = 0;
    	for(int i = 0; i < taille; i++)
    	{
    		if(motSecret[i] == maLettre)
    		{
    			lettreTrouve[i] = 1;
    			trouve = 1;
    		}
    	}
    	return trouve;
    }
     
    int gagne(int lettreTrouve[], int taille)
    {
    	int somme = 0;
    	int gain = 1;
    	for(int i = 0; i < taille; i++)
    	{
    		somme += lettreTrouve[i];
    	}
    	if(somme == taille)
    	gain = 0;
        return gain;
     
    }
     
     
    int main(void) 
    {
    	string motSecret, reponse, pseudo; //Déclaration de deux chaines
    	int taille = 0; //Initialisation de la taille de mot
    	bool jouer = true; //variable bool pour faire une boucle sur le programme
    	char maLettre = 0; //Initialisation de la variable ma lettre
    	int coupsRestant = 8; //nombre de coups restant
    	const char STOP='#';
     
     
    	cout << "Entrez votre pseudo" <<endl;
             cin >> pseudo; 
             system("cls");
             cout << "Bienvenue " << pseudo<< " dans le jeu du Pendu ! Voici les lois du jeu du pendu : vous disposez de 8 chances pour trouver le mot caché par des *. Si vous tappez simultanément deux lettres, la seconde ne sera pas prise en compte. Veuillez patienter, le jeu va se lancer automatiquement."  << endl;
    system("color f4");
     
             Sleep(10000);
             system ("cls");
             cout<<"Entrer le mot a deviner suivi de "<<STOP<<"."<<endl;
      getline(cin, motSecret, STOP);
     
    	while(jouer){
     
    		int *lettreTrouve = NULL;
    		lettreTrouve = new int[taille];
    		const char *motSecret = NULL;
    		motSecret = new char[taille+1];
     
    		//Initialisation du tableau lettreTrouver
    		for(int i = 0; i < taille; i++)
    		lettreTrouve[i] = 0;
     
     
     
    		while(coupsRestant > 0 && gagne(lettreTrouve, taille))
    		{
     
     
     
                        cout << "Il vous reste " << coupsRestant << " essai\n" << endl;
    		           	cout << "Quel est le mot secret ? ";
    			afficheMot(lettreTrouve, motSecret, taille);
    		           	cout << endl;
     
    	            	cout << "Proposez une lettre : ";
    			maLettre = lireCaractere();
     
     
    			         cout << endl;
    			if(!rechercheLettre(lettreTrouve, motSecret, maLettre, taille))
    			coupsRestant--;
    			if(!rechercheLettre(lettreTrouve, motSecret, maLettre, taille))
    			cout << "la lettre '" << maLettre << "' ne figure pas dans le mot" << endl;
     
     
            }
    		if(!gagne(lettreTrouve, taille))
                         cout << "Bravo " <<pseudo<< ", vous avez trouvé le mot secret " << motSecret << "!"<< endl;
    		else
    		           	 cout << "Sorry, vous avez perdu " <<pseudo<< " le mot secret etait : " << motSecret << endl;
    		coupsRestant = 8;
    		             cout << "Souhaitez-vous rejouer (oui ou non)? ";
    	               	cin >> reponse;
    	               	system ("cls");
    		while(reponse != "oui" && reponse != "non" && reponse != "n" && reponse != "o")
    		{
                        cout << "Choisissez entre oui et non : ";
    		           	cin >> reponse;
    		}
    		if(reponse == "non" or reponse == "n")
    		jouer = false;
    	}
    }
    Dernière modification par LittleWhite ; 06/05/2015 à 09h05. Motif: Titre précis

  2. #2
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Bonjour

    if(reponse == "non" or reponse == "n") Le or n'est pas du c++, utilises ||
    Homer J. Simpson


  3. #3
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Bonjour

    if(reponse == "non" or reponse == "n") Le or n'est pas du c++, utilises ||
    Si justement :
    http://en.cppreference.com/w/cpp/keyword/or
    C'est peu utilisé mais ça existe. C'est fait pour certains terminaux qui n'ont pas tous les caractères nécessaires disponibles.


    Je situerai plutot le problème à ce niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int taille = 0; //Initialisation de la taille de mot
    [...]
    int *lettreTrouve = NULL;
    lettreTrouve = new int[taille];
    Si tu alloues une zone mémoire de 0 octets de long, tu ne pourra rien mettre dedans.


    BR
    Fenkys

  4. #4
    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
    Houlàlà... Laisse moi deviner : tu es occupé sur un des TP d'un cours proposé par un site concurrent (OCR)...

    Je vais donc te donner un tout premier conseil, que je t'invite très sérieusement à suivre : fuis ce tutoriel à toutes jambes, c'est un ramassis de mauvaises pratiques et d'explications plus que mauvaises

    Mais pour te permettre d'avancer :
    • #include <windows.h> est le meilleur moyen d'avoir quelque chose de totalement non portable... c'est vraiment dommage
    • utilise la classe std::vector au lieu de tableau "C style"
    • pourquoi utiliser const char motSecret[] alors que tu utilise des std::string par ailleurs
    • getchar() est une fonction issue de C... A éviter
    • l'instruction system() (system("CLS"), system("PAUSE") et consors) est à éviter... Regarde du coté de la FAQ comment créer une pause portable
    • l'instruction Sleep() est à éviter, regarde du coté de std::chrono comment gérer le temps.
    • (bon, je vais m'arrêter là pour ne pas trop te décourrager )


    EDIT : Ah, au fait : Salut, et bienvenue sur le forum
    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

  5. #5
    Invité
    Invité(e)
    Par défaut
    merci, une partie du problème venait bien de ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int taille = 0; //Initialisation de la taille de mot
    [...]
    int *lettreTrouve = NULL;
    lettreTrouve = new int[taille];

    Le problème maintenant est que toutes les lettes sont données mauvaises.... . Et je ne vois pas du tout d'où ça peut venir.



    oui effectivement, ce code vient bien d'un site concurrent. Mais c'est dans le cadre d'un apprentissage personnel. Je vais changer tout ce que Koala m'a signalé dès que mon code fonctionnera
    Dernière modification par LittleWhite ; 06/05/2015 à 09h06. Motif: Pas de SMS

  6. #6
    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
    Citation Envoyé par julieen03 Voir le message
    merci, une partie du problème venait bien de ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int taille = 0; //Initialisation de la taille de mot
    [...]
    int *lettreTrouve = NULL;
    lettreTrouve = new int[taille];

    Le problème maintenant est que toutes les lettes sont données mauvaises.... . Et je ne vois pas du tout d'où ça peut venir.



    oui effectivement, ce code vient bien d'un site concurrent. Mais c'est dans le cadre d'un apprentissage personnel. Je vais changer tout ce que Koala m'a signalé dès que mon code fonctionnera
    Non, très sérieusement... Avant d'essayer de faire fonctionner ton code, changes très vite de cours C++ ... Tu ne t'en sentiras que mieux (en plus, j'ai déjà donné le lien )
    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

  7. #7
    Invité
    Invité(e)
    Par défaut
    je mets <include chrono> mais il me met no such file or directory...

    et std::chrono::seconds sec(1); serait correct?

  8. #8
    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
    Citation Envoyé par julieen03 Voir le message
    je mets <include chrono> mais il me met no such file or directory...
    il faut mettre
    Mais ce n'est disponible que depuis l'avant dernière version de la norme C++ (connue sous le nom affectueux de C++11)... Pour pouvoir en profiter (ainsi que de plein de fonctionnalités des plus sympa), il faut généralement indiquer au compilateur qu'on veut qu'il respecte cette norme. Avec gcc et clang, cela se fait en ajoutant l'option de compilation -std=c++11
    et std::chrono::seconds sec(1); serait correct?
    Ce sera en tout cas un bon début...

    Mais, pour pouvoir effectivement obtenir un résultat probant, tu devra aussi utiliser std::this_thread::sleep_for, sous une forme proche de
    (attention : boucle infinie... <Ctrl>+ c pour tuer violemment l'application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <chrono>
    #include <thread>
    #include <iostream>
    int main(){
        while(1){
            std::cout<<"waiting two seconds...";
            std::this_thread::sleep_for(std::chrono::seconds(2));
            std::cout<<"done"<<std::endl;
        }
        return 0;
    }
    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

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par fenkys Voir le message
    Si justement :
    http://en.cppreference.com/w/cpp/keyword/or
    C'est peu utilisé mais ça existe. C'est fait pour certains terminaux qui n'ont pas tous les caractères nécessaires disponibles.


    Je situerai plutot le problème à ce niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int taille = 0; //Initialisation de la taille de mot
    [...]
    int *lettreTrouve = NULL;
    lettreTrouve = new int[taille];
    Si tu alloues une zone mémoire de 0 octets de long, tu ne pourra rien mettre dedans.


    BR
    Fenkys

    j'ai déjà réctifié comme ça. C'est juste?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int taille = 8; //Initialisation de la taille de mot
    [...]
    int *lettreTrouve = NULL;
    lettreTrouve = new int[taille];

    ok c'est pour ça que le include <chrono> ne passait pas. Je dois donc téléchager ce -std=c++11 et l'ajouter au compilateur? J'ai aussi supprimé le sleep, les systems cls,... mais évidement pas encore eu le temps de tout 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
    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
    #include <iostream>
    #include <ctime>
    #include <fstream>
    #include <string>
    #include <vector>
     
     
     
    using namespace std;
     
     
     
    void afficheMot(int lettreTrouve[],const char motSecret[], int taille)
    {
    	for(int i = 0; i < taille; i++)
    	{
    		if(lettreTrouve[i] == 1)
    		{
    			cout << motSecret[i];
    		}
    		else
    			cout << " * ";
    	}
    	cout << endl;
    }
     
     
     
     
    char lireCaractere()
    {
    	char caractere = 0;
    	caractere = getchar();
    	caractere = tolower(caractere);
    	while(getchar() != '\n');
    	return caractere;
    }
     
    int rechercheLettre(int lettreTrouve[], const char motSecret[], char maLettre, int taille)
    {
    	int trouve = 0;
    	for(int i = 0; i < taille; i++)
    	{
    		if(motSecret[i] == maLettre)
    		{
    			lettreTrouve[i] = 1;
    			trouve = 1;
    		}
    	}
    	return trouve;
    }
     
    int gagne(int lettreTrouve[], int taille)
    {
    	int somme = 0;
    	int gain = 1;
    	for(int i = 0; i < taille; i++)
    	{
    		somme += lettreTrouve[i];
    	}
    	if(somme == taille)
    	gain = 0;
        return gain;
     
    }
     
     
    int main(void) 
    {
    	string motSecret, reponse, pseudo; //Déclaration de deux chaines
    	int taille = 8; //Initialisation de la taille de mot
    	bool jouer = true; //variable bool pour faire une boucle sur le programme
    	char maLettre = 0; //Initialisation de la variable ma lettre
    	int coupsRestant = 8; //nombre de coups restant
    	const char STOP='#';
     
     
     
    	cout << "Entrez votre pseudo" <<endl;
             cin >> pseudo; 
             system("cls");
             cout << "Bienvenue " << pseudo<< " dans le jeu du Pendu ! Voici les lois du jeu du pendu : vous disposez de 8 chances pour trouver le mot caché par des *. Si vous tappez simultanément deux lettres, la seconde ne sera pas prise en compte. Veuillez patienter, le jeu va se lancer automatiquement."  << endl;
     
     
     
     
             cout<<"Entrer le mot a deviner suivi de "<<STOP<<"."<<endl;
    cin >> motSecret;
     
    	while(jouer){
     
    		int *lettreTrouve = NULL;
    		lettreTrouve = new int[taille];
    		const char *motSecret = NULL;
    		motSecret = new char[taille+1];
     
    		//Initialisation du tableau lettreTrouver
    		for(int i = 0; i < taille; i++)
    		lettreTrouve[i] = 0;
     
     
     
    		while(coupsRestant > 0 && gagne(lettreTrouve, taille))
    		{
     
     
     
                        cout << "Il vous reste " << coupsRestant << " essai\n" << endl;
    		           	cout << "Quel est le mot secret ? ";
    			afficheMot(lettreTrouve, motSecret, taille);
    		           	cout << endl;
     
    	            	cout << "Proposez une lettre : ";
    			maLettre = lireCaractere();
     
     
    			         cout << endl;
    			if(!rechercheLettre(lettreTrouve, motSecret, maLettre, taille))
    			coupsRestant--;
    			if(!rechercheLettre(lettreTrouve, motSecret, maLettre, taille))
    			cout << "la lettre '" << maLettre << "' ne figure pas dans le mot" << endl;
     
     
            }
    		if(!gagne(lettreTrouve, taille))
                         cout << "Bravo " <<pseudo<< ", vous avez trouvé le mot secret " << motSecret << "!"<< endl;
    		else
    		           	 cout << "Sorry, vous avez perdu " <<pseudo<< " le mot secret etait : " << motSecret << endl;
    		coupsRestant = 8;
    		             cout << "Souhaitez-vous rejouer (oui ou non)? ";
    	               	cin >> reponse;
    	               	system ("cls");
    		while(reponse != "oui" && reponse != "non" && reponse != "n" && reponse != "o")
    		{
                        cout << "Choisissez entre oui et non : ";
    		           	cin >> reponse;
    		}
    		if(reponse == "non" or reponse == "n")
    		jouer = false;
    	}
    }

  10. #10
    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
    Citation Envoyé par julieen03 Voir le message
    j'ai déjà réctifié comme ça. C'est juste?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int taille = 8; //Initialisation de la taille de mot
    [...]
    int *lettreTrouve = NULL;
    lettreTrouve = new int[taille];

    ok c'est pour ça que le include <chrono> ne passait pas. Je dois donc téléchager ce -std=c++11 et l'ajouter au compilateur? J'ai aussi supprimé le sleep, les systems cls,... mais évidement pas encore eu le temps de tout faire.
    Non, il n'y a rien à télécharger... Si tu dispose d'une version de Gcc assez récente (4.8.1 ou supérieure), il suffit de modifier la ligne de compilation pour que le compilateur respecte la nouvelle norme :
    En "temps normal", lorsque tu veux compiler un fichier, tu vas le faire sous la forme d'une commande proche de g++ -c fichier.cpp qui fera que gcc considère que tu compile dans un mode "C++03 compliant" (comprend : dans un mode où la seule norme qu'il doit respecter est l"ancienne" norme appelée C++03).

    Pour qu'il puisse respecter la norme C++11, il faut lui dire explicitement qu'il doit le faire, et donc modifier la commande pour qu'elle prenne une forme proche de g++ -std=c++11 -c fichier.cpp.

    Mais, si tu te base sur le cours C++ auquel je pense, il y a de fortes chances que tu utilise Code::Blocks pour faire tes essais. Tu as de la chance, car il se fait que cet EDI est d'office fourni avec une version récente de Gcc (si pas la plus récente, au moins avec une version "suffisamment récente" que pour pouvoir utiliser C++11).

    Il "suffit" donc de modifier les options de compilation de ton projet au travers du menu "Project->Build options". Dans la fenêtre qui s'ouvre, tu verra un onglet nommé "compiler flags". Tu dois trouver et cocher la case à cocher "Have g++ follow the C++11 ISO C++ language standard [-std=c++11].

    Tu n'as alors plus qu'à valider les modifications et le tour est joué : ton projet sera compilé en utilisant les fonctionnalités qui ont été apportées par C++11
    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

  11. #11
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Citation Envoyé par julieen03 Voir le message
    j'ai déjà réctifié comme ça. C'est juste?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int taille = 8; //Initialisation de la taille de mot
    C'est juste mais là tu figes la taille des lettres déjà trouvées à 8 alors que tu n'as pas une telle limitation pour tes autres chaines. A ta place j'aurai utilisé un string. Ou si pour des raisons didactiques tu veux vraiment utiliser les pointeurs, j'aurai ajusté la valeur de 'taille' à celle de ton mot secret

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int taille(motSecret.length()); //Initialisation de la taille de mot
    [...]
    int *lettreTrouve = NULL;
    lettreTrouve = new int[taille];
    Voire, pourquoi créer une variable quand la valeur est obtenue facilement. En fait, tu n'as pas besoin de garder la valeur de taille quelque part puisse les std::string peuvent te fournir cette valeur facilement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lettreTrouve = new int[motSecret.length()];

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    char lireCaractere()
    {
    	char caractere = 0;
    	caractere = getchar();
    	caractere = tolower(caractere);
    	while(getchar() != '\n');
    	return caractere;
    }
    Tu as ce qu'il faut en C++ pour faire ça en une seule ligne (donc sans créer de nouvelles fonctions). Utilise std::cin et les opérateurs de flux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int rechercheLettre(int lettreTrouve[], const char motSecret[], char maLettre, int taille)
    {
    	int trouve = 0;
    	for(int i = 0; i < taille; i++)
    	{
    		if(motSecret[i] == maLettre)
    		{
    			lettreTrouve[i] = 1;
    			trouve = 1;
    		}
    	}
    	return trouve;
    }
    La classe string possède une fonction find et pas mal de variante (find, find_first_of, etc.). En les utilisant tu peux réduire ton code à une seule ligne (donc pas de fonctions non plus).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int gagne(int lettreTrouve[], int taille)
    {
    	int somme = 0;
    	int gain = 1;
    	for(int i = 0; i < taille; i++)
    	{
    		somme += lettreTrouve[i];
    	}
    	if(somme == taille)
    	gain = 0;
        return gain;
     
    }
    Tu as plus simple pour vérifier si tu as gagné. L'égalité de deux string se fait avec un simple == En plus, ta fonction retourne 1 quand tu as perdu et 0 quand tu as gagné. Ce qui est contraire au sens logique (et pourrait être sera source de bugs dans des projets plus gros).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
             cout<<"Entrer le mot a deviner suivi de "<<STOP<<"."<<endl;
    cin >> motSecret;
    Si tu rentres 'anticonstitutionnellement' tu ne pourra jamais gagner. Tu n'as aucun contrôle sur la longueur du mot secret mais les lettres trouvées sont limitées à 8.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    			if(!rechercheLettre(lettreTrouve, motSecret, maLettre, taille))
    			coupsRestant--;
    			if(!rechercheLettre(lettreTrouve, motSecret, maLettre, taille))
    			cout << "la lettre '" << maLettre << "' ne figure pas dans le mot" << endl;
    Pourquoi faire le même test deux fois. Tu peux bien mettre deux actions dans un seul if :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    			if(!rechercheLettre(lettreTrouve, motSecret, maLettre, taille)) {
    			        coupsRestant--;
              			cout << "la lettre '" << maLettre << "' ne figure pas dans le mot" << endl;
                            }

  12. #12
    Invité
    Invité(e)
    Par défaut
    d'accord. Vu le nombre de choses qui vont pas, je pense que ça serait mieux de partir d'un autre code... .
    Le problème que j'ai est que quand le lettre est mauvaise, ça n'est pas pris en compte. Donc je peux essayer autant de fois que je veux. ET je ne vois pas d'où le pb vient... .
    J'ai trouvé comment remplacer la fonction system ("pause").

    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
    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include<conio.h>
     
    using namespace std;
     
     
     
    int main()
    {
    	string motSecret, pseudo, reponse;
    	bool jouer;
    	char motATrouver[] = "********";
    	char lettreSaisie;
    	int nombreEssais = 8;
    	int i;
     
     
    	cout << "\t\t      Bienvenue dans le jeu du pendu      " << endl;
     
    	cout << "Saisissez votre pseudo :" << endl;
     
    	cin >> pseudo;
    	cout <<"bienvenue " << pseudo <<" . Voici les lois du jeu. Vous disposez de huit tentatives pour trouver le mot caché par des *. Lorsque vous entrerez une lettre deux fois, le second essai ne sera pas pris en compte." <<endl;
    	getch();
     
    	system("cls");
    	while (jouer)
    	{
    		cout <<"entrer un mot de 8 lettres"<<endl;
    		cin >> motSecret;
     
     
     
    		// cout << "Appuyez sur une enter pour commencer la partie!" << endl; // en traitement.
     
    		while (nombreEssais > 0)
    		{
     
    			bool lettreSaisieBool, lettreDejaTape = false;
     
    			cout << "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;
    				cout << "Vous avez déja fait apparaitre cette lettre dans le mot !" << endl;}
     
    			}
    			// Lettre pas encore saisie auparavant.
    			if (lettreDejaTape == false)
    			{
    				for (i = 0; i < 10; i++)
    				{
     
    					if (lettreSaisie == motSecret[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 secret!" << endl;
    					}
    				}
     
     
     
    			}
     
    			// Lettre n'apparait pas dans le mot.
    			if (lettreSaisieBool == false)
    			{
     
    				nombreEssais--;
     
    				if (nombreEssais == 0)
    				{
     
    					cout << "Perdu ! le mot secret était '"<< motSecret <<"'" << 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
    		cout << "souhaitez-vous rejouer ?"<<endl;
    		cin >> reponse;
    		while(reponse != "oui" && reponse != "non" && reponse != "n" && reponse != "o")
    		{
    			cout << "choississez entre oui et non :";
    			cin >> reponse;
    		}
    		if (reponse == "non" or reponse == "n")
    		{
    			jouer = false;
    		}
    		else
    		{
    			jouer = true;
    		}
    	}//fin du while
     
     
    } // fin du main

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    c'est juste un problème d'algorithme et pas de C++ en fait.
    Commence par savoir ce que tu veux faire, puis tu le traduis en C++.

    Un pendu c'est quoi ?
    - un mot à trouver
    - on entre une lettre
    - si elle est dans le mot, on l'affiche
    - sinon on perd une vie
    - éventuellement tu peux garder en mémoire les lettres déjà essayées

    Avec juste ça, ton code devrait avoir une forme proche de
    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
     
    string answer; // le mot à trouver
    string mot(answer.length(), '*'); // le mot affiché pour le joueur
    string essais; // un tableau des lettres déjà essayées
    int vie = 5;
    while (vie > 0)
    {
      char lettre;
      for(;;)
      {
        cout<<"Lettre : "<<endl;
        cin>>lettre;
        if (essais.find(lettre))
          cout<<"Déjà tenté"<<endl;
        else
          break;
      }
      essais.push_back(lettre);
      bool present = false;
      for (unsigned int i = 0; i < answer.length())
      {
        if (answer[i] == lettre)
        {
          present = true;
          mot[i] = lettre;
        }
      }
      if (!present)
      {
        --vie;
        cout<<"Lettre non presente dans le mot";
      }
      cout<<mot;
    }
    C'est vite fait, peut-être faux, mais c'est l'idée et tu peux voir combien c'est simple.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  14. #14
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Tu ne vérifies toujours pas la taille de ton mot secret. On peut rentrer n'importer quel mot, même de plus de 8 lettres.

    Ensuite, tu vérifies ta taille de mot sur 10 lettres, alors que la taille de ton tableau de lettres est 8.

    Enfin, essaie de supprimer les boucles inutiles. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for (i = 0 ; i < 10 ; i++)
    			{
    				if (lettreSaisie == motATrouver[i])
    				{
    					lettreDejaTape = true; // lettre déjà tapé.
    					nombreEssais;
    				cout << "Vous avez déja fait apparaitre cette lettre dans le mot !" << endl;}
     
    			}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (count(std::begin(motATrouver), std::end(motATrouver, lettreSaisie)  != 0) {
    	lettreDejaTape = true; // lettre déjà tapé.
    	cout << "Vous avez déjà fait apparaitre cette lettre dans le mot !" << endl;
     }
    Sans compter que cette méthode te fait sortir de la boucle dès que le résultat est connu et donc évite des traitements inutile. Enfin, si tu changes la taille de ton mot secret, ce morceau de code continuera à marcher correctement.

    Tu as aussi un problème avec la variable lettreSaisieBool. Si tu entres une lettre déjà entrée, il a une valeur indéfinie. Tu peux donc entrer dans le bloc qui te décompte un tour alors que la lettre est correcte. C'est aussi le cas si la lettre n'a jamais été entrée et qu'elle est fausse. En bref, nulle par dans le code tu ne positionnes toi même cette variable sur false. Et dans un certains nombre de cas, sa valeur est indéfinie alors que tu t'en sers pour faire des choix. Ton problème de lettres non prise en compte viens de là.

  15. #15
    Invité
    Invité(e)
    Par défaut
    D'accord, j'ai rajouté ce qu'il fallait pour les lettres non prises en compte et ça fonctionne . Par contre, quand je remplace par ton code ce que j'avais mis (par ex pour la boucle permettant de définir si la lettre a déjà été saisie), j'ai droit à ça
    main3.cpp: In function `int main()':
    main3.cpp:60: error: `begin' is not a member of `std'
    main3.cpp:60: error: `end' is not a member of `std'
    main3.cpp:60: error: expected `)' before '{' token

    main3.cpp:65: error: expected primary-expression before '}' token
    main3.cpp:65: error: expected `;' before '}' token
    main3.cpp:66: error: `lettreSaisieBool' undeclared (first use this function)
    main3.cpp:66: error: (Each undeclared identifier is reported only once for each function it appears in.)
    main3.cpp:68: error: `lettreDejaTape' undeclared (first use this function)

    main3.cpp: At global scope:
    main3.cpp:137: error: expected declaration before '}' token

    make.exe: *** [main3.o] Error 1

    Exécution terminée
    Dernière modification par LittleWhite ; 08/05/2015 à 10h05. Motif: Pas besoin de citer l'intégralité du message précédent

  16. #16
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Tu es allé jeter un coup d’œil sur le site que j'ai donné en lien un peu plus haut dans la discussion. Tu aurais su quel header inclure pour disposer de la fonction (en l'occurence, iterator).
    Si tu veux faire du C++, tu as intérêt à utiliser un bon site de référence.
    Pour rappel : http://en.cppreference.com

    Par ailleurs je t'ai donné un exemple pour la première boucle for, tes erreurs se réfèrent à la seconde. La seconde ne peut pas fonctionner de la même façon, ton index est utilisé par les variables qui s'y trouvent.

Discussions similaires

  1. Thread qui se termine aprés quelque secondes ?
    Par jackm dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 21/03/2008, 09h31
  2. [regexp] Chaine qui se termine par
    Par cootchy dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 28/08/2007, 18h39
  3. Terminate() qui ne terminate pas
    Par kurkaine dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2006, 21h05
  4. [csv]import qui ne termine jamais
    Par banzzai dans le forum Requêtes
    Réponses: 6
    Dernier message: 14/06/2006, 21h07
  5. Un thread de travail qui se termine et se libère tout seul
    Par bigquick dans le forum Threads & Processus
    Réponses: 15
    Dernier message: 24/06/2005, 13h58

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