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 :

[Avis]Jeux mot mystere


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut [Avis]Jeux mot mystere
    Bonjour,

    Je débute en programmation(c++) et j'ai créé un petit dans la console dans lequel le joueur 1 entre un mot, le programme mélange les lettres et le joueur 2 doit deviner le mot qui est maintenant mélangé. Je voulais savoir ce que vous pensez du code, ce qui serait à améliorer, à changer, à optimiser, etc.

    Merci à l'avance de votre aide !

    Voici mon programme : main.cpp

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    Bonne initiative, il y a plein de choses à corriger plus ou moins grave, d'abord les graves :

    1. Supprime toutes les variables globales et déclarent les au plus proches de leur lieu d'utilisation.
    2. endl<< endl << endl<< endl << endl << endl<< endl << endl: Ça se voit que c'est pas normal de faire ça... En plus qu'est-ce qui empêche l'utilisateur de remonter dans la console, et si la console est plus grande ? Vu que c'est une application console, il n'existe malheureusement pas de solutions portables mais tu peux t'inspirer de ça. Au pire il faut que tu fasses une boucle.
    3. Il y a plein de redondance dans ton code, utilise des fonctions pour chaque petit bout de code identique !
    4. Utilise des fonctions pour chaque fonctionnalités différentes.
    5. Les instructions goto sont à proscrire et d'autant plus par un débutant.


    Les choses moins graves maintenant (mais à corriger quand même !) :

    1. Tu fais du C++ donc srand(time(0)) peut être remplacé par la version C++, n'oublie pas d'activer C++11 dans ton compilateur néanmoins (-std=c++11 dans gcc, se renseigner pour les autres).
    2. Certains noms de variables ne sont pas clair comme motamel.
    3. Utilise des structures pour éviter de dupliquer ton code, par exemple représente un utilisateur et un jeu dans une structure, ça t'évitera aussi de passer beaucoup de variables en paramètres.
    4. Nomme tes variables soit toutes en français, soit toutes en anglais, il vaut mieux éviter de mixer les deux...


    Bon courage !

  3. #3
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    @Trademark à fait pas mal de bonnes remarques, deux ou trois trucs supplémentaires :

    • évite using namespace std;
    • utilise les fonction existantes quand c'est possible : ta fonction melangerMot peut utiliser std::random_shuffle
    • attention aux lignes trop longues qui nuisent à la lisibilité, essaie de te limiter à 80 ou 100 caractères : 80 est la "norme" depuis 30 ou 40 ans, 100 permet d'avoir 2 documents ouverts cote à cote sur Visual Studio (et probablement tous les IDE) en 1920x1080 (ou plus grande résolution)

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    merci beaucoup pour votre aide !

    @trademark
    -pour les endl << endl << endl... je savais aussi que ce n'était pas correct mais je navais aucune idée comment régler ça...merci pour l'idée de la boucle... Y a t il un moyen d'effacer ce qui est dans la console à un point du programme ?
    -pour les bouts de codes identiques et les fonctions il faudrait que je sois un peu plus à l'aise en c++
    -pour les goto ç'est à cause que j'ai programmé et ti-basic ;p quel moyen est a utilisé en C++, les boucles ?
    -ensuite pour les variables(fr/an, nom bizarre, etc.) je sais que j'ai fait ça un peu n'importe comment !
    -les structures je vais aller voir un tuto

    @iradrille
    -il me semble qu'utilisé "using namespace std" nous simplifie la vie ?
    -pour les fonctions pourquoi ne pas les créer, je suis débutant et ça m'aide a progresser...

    merci encore de votre aide! pouvez vous encore m'éclairer sur mes petites questions ? ça serait apprécié

  5. #5
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par girv97 Voir le message
    Y a t il un moyen d'effacer ce qui est dans la console à un point du programme ?
    Une solution simple mais non portable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    system("clear"); // sous Linux (ça ne nettoie pas vraiment la console, mais écrit seulement assez de retour à la ligne pour cacher ce qu'il y avait avant)
    system("cls"); // sous Windows
    Citation Envoyé par girv97 Voir le message
    pour les goto ç'est à cause que j'ai programmé et ti-basic ;p quel moyen est a utilisé en C++, les boucles ?
    De manière générale boucle (for / while / do while) ou condition (if), ici plutôt une boucle.

    Citation Envoyé par girv97 Voir le message
    il me semble qu'utilisé "using namespace std" nous simplifie la vie ?
    Cela simplifie la vie, mais ouvre la porte à des conflits de noms possible : tu ne peux par exemple pas créer de fonction nommée "cout", ou tout autre nom utilisé par la STL.
    En séparant les déclarations dans un .h et implémentations dans un .cpp, tu peux éventuellement utiliser "using namespace std" dans un .cpp, jamais dans un .h en tout cas.
    Citation Envoyé par girv97 Voir le message
    pour les fonctions pourquoi ne pas les créer, je suis débutant et ça m'aide a progresser...
    Dans une optique d'apprentissage de l'algo, oui, tu peux recréer des choses existantes pour voir comment ça marche.
    Mais en dehors de ça, il vaut mieux utiliser des fonctions existantes (qui ont été prouvées fonctionnelles ).

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup encore une fois !

    Je me demandais comment faire pour changer seulement une variable dans une fonction. Par exemple, quand c'est le joueur 1 qui a écrit le mot, le joueur 2 doit le deviner, mais comment changer le rôle des 2 joueur dans la partie suivante sans avoir a utilisé if(game == 1) et du coup d'écrire la ligne de code 2 fois ?

  7. #7
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par girv97 Voir le message
    Je me demandais comment faire pour changer seulement une variable dans une fonction.
    Tu peux passer des paramètres à une fonction, et si la fonction doit changer ce paramètre alors il doit être passé par référence.
    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
    void foo(int i) {
         ++i;
    }
     
    void bar(int& i) {
         ++i;
    }
     
    int main() {
        int i = 0;
        foo(i);
        std::cout << i << std::endl; // i == 0
        bar(i);
        std::cout << i << std::endl; // i == 1
        return 0;
    }
    Citation Envoyé par girv97 Voir le message
    Par exemple, quand c'est le joueur 1 qui a écrit le mot, le joueur 2 doit le deviner, mais comment changer le rôle des 2 joueur dans la partie suivante sans avoir a utilisé if(game == 1) et du coup d'écrire la ligne de code 2 fois ?
    Pour ça, les tableaux sont utiles
    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
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <string>
     
    // passage par copie car random_shuffle agit sur place
    std::string shuffleWord(std::string word) {
    	std::random_shuffle(word.begin(), word.end());
    	return word;
    }
     
    // retourne l'id du joueur suivant
    int nextPlayerId(int current, int nbPlayer) {
    	return (current+1) % nbPlayer;
    }
     
    struct Player {
    	const std::string name;
    	int score;
     
    	// ctor
    	explicit Player(const std::string& name_): name(name_), score(0) { }
    }
     
    int main() {
    	const int NB_PLAYERS = 2;
     
    	bool keepPlaying = true; // controle la boucle principale
    	std::vector<Player> players; // tableau contenant tous les joueurs
    	int idCurrentPlayer = 0; // 0 = joueur 1, 1 = joueur 2, etc...
     
    	std::cout << "saisissez vos noms " << endl;
     
    	// pour chaque joueur
    	for(int i=0; i<NB_PLAYERS; ++i) {
    		std::string name;
     
    		// on lui demande de saisir son nom
    		std::cout << "joueur " << (i+1) << " : ";
    		std::cin >> name;
     
    		// on crée une instance de Player que l'on ajoute au tableau de joueurs
    		players.emplace_back(name);
     
    		// equivalent à 
    		// Player player(name);
    		// players.push_back(player);
    		// mais évite des copies
    	}
     
    	// pour remplacer ton label / goto
    	while(keepPlaying) {
    		std::string wordToGuess; // mot à deviner
    		std::string shuffledWord; // le même mot mais mélangé
    		std::string playerGuess; // la proposition du joueur
     
    		// on récupère l'id du joueur suivant (c'est lui qui devra trouver le mot)
    		int nextPlayer = nextPlayerId(idCurrentPlayer, NB_PLAYERS);
     
    		// on utilise le tableau pour récupérer le nom du joueur courant
    		std::cout << players[idCurrentPlayer].name << " saisissez un mot :";
     
    		// on enregistre le mot saisi et on le mélange
    		std::cin >> wordToGuess;
    		shuffledWord = shuffleWord(wordToGuess);
     
    		// Je te laisse continuer...
     
    		// Puis on passe au joueur suivant
    		idCurrentPlayer = nextPlayer;
    	}
    	return 0;
    }

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    merci beaucoup encore !

    C'est probablement simple pour toi mais je suis très débutant... Je vais analyser le code...

    cette ligne me met un erreur dans le compilateur : players.emplace_back(name);

  9. #9
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Il faut que tu ajoutes l'option C++11 à ton compilo, si tu utilises gcc c'est -std=c++11 si tu utilises un autre compilateur, il faut que tu regardes sa doc.

    Pour tout ce qui est documentation C++, tu peux chercher ici : http://en.cppreference.com/w/
    Ça te permettra de comprendre certaine fonction du code d'Iradrille en détail ;-)

Discussions similaires

  1. Avis jeux de mots
    Par jojo_ol76 dans le forum Android
    Réponses: 0
    Dernier message: 07/11/2012, 22h01
  2. Avis stockage mots de passe
    Par SebastianPx dans le forum Sécurité
    Réponses: 1
    Dernier message: 15/07/2009, 11h44
  3. Vos Avis (Jeux Vidéo)!
    Par tabarez7 dans le forum Mon site
    Réponses: 3
    Dernier message: 17/07/2008, 18h54

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