Avis code source plus ou moins c++

BaroudKelp -  
mamiemando Messages postés 33869 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je viens de finir(enfin) de codé ce mini jeu très connu: le plus ou moins.
J'ai pris quelques heures pour réaliser tout ça, sachant que j'ai commencé le C++ il y a 3 jours.

Les fonctionnalités:

Mode 1 ou 2 joueurs. Dans le mode 1 joueur, le nombre est généré aléatoirement, dans le mode 2 joueurs, le deuxième joueur rentre le nombre mystère.

3 niveaux de difficultés

Prénoms des joueurs

Compteur de coups nécessaire à la victoire

N'hésitez pas à me suggérer d'autres améliorations, m'aider à rendre mon code plus lisible etc... Merci!

Le code:

 #include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
int main()
{
   cout << "----------------------------------------"<< endl;
   cout << "-" << "---------------------------------" << endl;
   cout << "-" << "Bienvenue dans mon premier jeu! -" << endl;
   cout << "----------------------------------------" << endl;
   
   string prenom, prenom2;
   double nombreMystere(0), nombreEssaye(0);
   int max(0),min(1), difficulte(0), joueur(0), coups(0);
  
  cout << "Le but du jeu est de trouver le nombre qui a été généré aléatoirement" << endl;
   cout << "ou rentré par un second joueur. A chaque coup, l'ordinateur" << endl;
   cout << "vous indique si le nombre mystère est plus grand ou plus petit" << endl;
  
  cout << "Veuillez choisir le niveau de difficulté:" << endl;
  cout << "Facile(entre 1 et 100), tapez 1" << endl;
  cout << "Moyen(entre 1 et 1000, tapez 2" << endl;
  cout << "Difficile (entre 1 et 2000), tapez 3" << endl;
  cin >> difficulte;
  
  if (difficulte==1)
 {
     max=100;
 }
 else if (difficulte==2)
 {
     max=1000;
 }
  
 else if (difficulte==3)
 {
     max=2000;
 }
  
    cout << "Choisissez un mode de jeu:" << endl;
   cout << "1. 1 joueur" << endl;
   cout <<"2. 2 joueurs" << endl;
   cin >> joueur;
   
   if (joueur==1)
 {
      srand(time(NULL));
   nombreMystere=rand()%(max-min)+min;
   
   cout << "Indiquez votre prénom" << endl;
 cin>> prenom;
 cout << prenom << " Essayez de trouver le nombre mystère!" << endl;

 }
 
  
    else if(joueur==2)
    {
        cout << "Veuillez rentrer le prénom du premier joueur" << endl;
        cin >> prenom;
        cout << "Veuillez rentrer le nom du second joueur" << endl;
        cin >> prenom2;
        
        cout << prenom << " rentrez un nombre" << endl;
        cin >> nombreMystere;
        cout << prenom2 << " Essayez de trouver le nombre de " << prenom << endl;
    }
    
    else
    
    {
       do 
    {
     cout << "Rentrez 1 ou 2" << endl;
     cin >> joueur;
    }while (joueur>2);
    
    }
    
   do   
   {
    cin >> nombreEssaye;
    
   if (nombreEssaye < nombreMystere)
   {
       cout << "Le nombre mystere est plus grand!" << endl;
       ++coups;
   }
    
   else if (nombreEssaye > nombreMystere)
   {
       cout << "Le nombre mystere est plus petit!" << endl;
       ++coups;
   }
   else if (nombreEssaye==nombreMystere && joueur==1)
   {
       ++coups;
       cout << "Bravo " << prenom << "!" << "Vous avez gagnez en" << endl;
       cout << coups << "coups!" << endl;
   }
   else if (nombreEssaye==nombreMystere && joueur==2)
   {
       ++coups;
       cout << "Bravo " << prenom2 << "!" <<  endl;
       cout << "Vous avez gagnez en " << coups << " coups!" << endl;
       cout << "Au tour de " << prenom << endl;
       cout << "de trouver le nombre mystere!" << endl;
   }
   } while (nombreEssaye!=nombreMystere);
    
   return 0;
} 


A voir également:

5 réponses

mamiemando Messages postés 33869 Date d'inscription   Statut Modérateur Dernière intervention   7 902
 
Voici comment tu pourrais l'écrire.

#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
#define MIN           1
#define MAX_FACILE    100
#define MAX_MOYEN     1000
#define MAX_DIFFICILE 2000

void bienvenue() {
    cout << "----------------------------------------" << endl
         << "----------------------------------------" << endl
         << "-    Bienvenue dans mon premier jeu!   -" << endl
         << "----------------------------------------" << endl
         << endl
         << "Le but du jeu est de trouver le nombre"   << endl
         << "qui a été généré aléatoirement ou rentré" << endl
         << "par un second joueur. A chaque coup,"     << endl
         << "l'ordinateur vous indique si le nombre"   << endl
         << "mystère est plus grand ou plus petit"     << endl
         << endl;
}

unsigned menu_max() {
    unsigned difficulte, max;
    bool     invalide;

    do {
        invalide = false;

        cout << "Veuillez choisir le niveau de difficulté :"  << endl
             << " 1) Facile    (entre 1 et " << MAX_FACILE    << ')' << endl
             << " 2) Moyen     (entre 1 et " << MAX_MOYEN     << ')' << endl
             << " 3) Difficile (entre 1 et " << MAX_DIFFICILE << ')' << endl;

        cin >> difficulte;

        switch (difficulte) {
            case 1:  max = MAX_FACILE;    break;
            case 2:  max = MAX_MOYEN;     break;
            case 3:  max = MAX_DIFFICILE; break;
            default: invalide = true;     break;
        }
    } while (invalide);

    return max;
}

unsigned menu_joueur() {
    unsigned joueur;

    do {
        cout << "Choisissez un mode de jeu:" << endl
             << " 1) 1 joueur"  << endl;
             << " 2) 2 joueurs" << endl;

        cin  >> joueur;

    } while (joueur != 1 && joueur != 2);

    return joueur;
}

void demander_prenom(unsigned no_joueur, string & prenom) {
    cout << "Veuillez rentrer le prénom du joueur " << no_joueur << endl;
    cin >> prenom;
}

int main()
{
    string prenom1, prenom;
    double nombre_mystere, nombre_essaye;
    unsigned max, min = MIN, joueur, coups = 0;

    bienvenue();
    max    = menu_max();
    joueur = menu_joueur();

    switch (joueur) {
        case 1:
            srand(time(NULL));
            nombre_mystere = rand() % (max - min) + min;
            demander_prenom(1, prenom);
            cout << prenom << ", essayez de trouver le nombre mystère!" << endl;
            break;

        case 2:
            demander_prenom(1, prenom1);
            demander_prenom(2, prenom);

            cout << prenom1 << ", veuillez rentrez un nombre" << endl;
            cin  >> nombre_mystere;
            cout << prenom  << ", essayez de trouver le nombre de " << prenom1 << endl;
            break;
    }

    while (true) {
        cin >> nombre_essaye;
        ++coups;

        if (nombre_essaye < nombre_mystere) {
            cout << "Le nombre mystere est plus grand!" << endl;
        } else if (nombre_essaye > nombre_mystere) {
            cout << "Le nombre mystere est plus petit!" << endl;
        } else {
            cout << "Bravo " << prenom << ", vous avez gagnez en "
                 << coups << " coups!" << endl;
            if (joueur == 2) {
                cout << "Au tour de " << prenom1        << endl
                     << "de trouver le nombre mystere!" << endl;
            }
            break;
        }
    }

    return 0;
} 


En résumé voici ce qu'il faut retenir :
- quelques fonctions pour mieux structurer le code
- utiliser des switchs quand c'est possible
- factoriser le code quand c'est possible
- chaîner les <<
- les valeurs numériques s'initialisent généralement en utilisant la syntaxe x = valeur plutôt que x(valeur). Disons que ça marche en C++ parce que les types de bases peuvent être vus comme des instances de classes mais que ce n'est pas ce qu'on écrit habituellement

Pour bien faire il faudrait que :
- le code utilise des noms de variables/fonctions en anglais
- le texte affiché soit défini au travers de constantes (éventuellement #define) qu'on peut facilement modifier à la compilation pour prévoir une application dans différentes langues.

Mais pour un premier programme c'était déjà un très bon premier jet ;-)

Bonne continuation !
1
BaroudKelp
 
Merci pour ta réponse!

Je vais lire attentivement ce code pour bien comprendre comment tu as fait.
Je vais tenter de le recoder en utilisant des fonctions, mais je suis actuellement en vacance et j'ai utilisé l'ordi pro de mon père pour coder ça... sur bloc note(car pas de droits admin) et c'est pour ça que je n'ai pas chaîner les <<.

Merci
0
mamiemando Messages postés 33869 Date d'inscription   Statut Modérateur Dernière intervention   7 902
 
D'ailleurs ça me fait penser qu'on pourrait remplacer la boucle while(true) par une boucle du genre for(coup = 1; coup <= max_coup; coup++) pour limiter le nombre d'essais.

Autre chose d'un point de vue mathématique, chercher un nombre compris entre deux bornes se résout en log(n) par dichotomie. L'idée d'une dichotomie c'est de proposer le nombre au mileu entre
- le plus grand nombre proposé et inférieur au nombre mystère
- le plus petit nombre proposé et supérieur au nombre mystère

Cela signifie qu'à chaque essai on peut diviser par 2 l'espace de recherche du nombre mystère. Ainsi le niveau "difficile" tel qu'il est défini n'engendre qu'un seul essai supplémentaire comparé au niveau "moyen" (il suffit de proposer 1000). Bref tu pourrais augmenter MAX_DIFFICILE à une valeur sensiblement plus élevée.
0
BaroudKelp
 
j'essaierai de limiter le nombre de coups possible.
Et pour le max difficile, j'avais mit 10 000 à la base mais ça me paraissait vraiment difficile pour le coup...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33869 Date d'inscription   Statut Modérateur Dernière intervention   7 902
 
Bah non tu proposes 5000 si c'est inférieur 2500 si c'est inférieur 1250. Evidemment tu adaptes le nombre proposé en fonction de la réponse mais tu vois bien qu'en trois coups on arrive à une plage de valeur de 1250 valeurs soit à peu près le niveau moyen.
0