Finalisation lettre k

Finalisation lettre k - C++ - Programmation

Marsh Posté le 02-04-2015 à 18:46:14    

Bonjour à tous , mon programme est presque fini mais il me reste quelques détails pour le finir.
 
Il faut demander au joueur si il veut rejouer en ayant trouver facilement la lettre k ou en ayant dépassé le nombre d'essai autorisé.
 
Ceci en relançant le programme au début.
 
Merci pour votre aide.
 

Code :
  1. #include <iostream>
  2. int main()
  3. {
  4.   const char caractere = 'k';
  5.   int essai = 10;
  6.   char reponse;
  7.   char rejouer = 'o';
  8.  
  9.   for (essai; essai > 0; --essai)
  10.  
  11.   {
  12.     std::cout << "Tapez une lettre au clavier" << std::endl
  13.               << "Vous avez " << essai << " essais pour trouver la lettre mystere." << std::endl;
  14.     std::cin >> reponse;
  15.     if (reponse == caractere)
  16.    
  17.     {
  18.       std::cout << "Bravo vous avez trouvez la bonne lettre " << std::endl
  19.             << "Vous avez eu besoin de " << (10 - essai) << " essai pour trouver la lettre mystere " << std::endl;
  20.       break;
  21.     }
  22.     if (reponse < caractere)
  23.       std::cout << "Plus !" << std::endl;
  24.     else
  25.       std::cout << "Moins !" << std::endl;
  26.   }
  27.   if (essai == 0)
  28.  
  29.     do
  30.    
  31.     {
  32.    
  33. std::cout << "Plus d'essai disponible, vous avez perdu !" << std::endl;
  34.     std::cout << "Voulez vous rejouer (o)ui / (n)on ?" << std::endl;
  35.     std::cin >> rejouer;
  36.    
  37.     }
  38.    
  39.    
  40.     while(rejouer == 'o');
  41.  
  42.  
  43.     system ("PAUSE" );
  44.   return 0;
  45. }

Reply

Marsh Posté le 02-04-2015 à 18:46:14   

Reply

Marsh Posté le 02-04-2015 à 22:54:35    

C'est pas mal ce que tu as écrit, mais mais ça manque de découpage en fonctions qui font une chose claire et précise.
Un gros main qui contient tout le programme, c'est une mauvaise habitude qu'il faut éviter de prendre.
En modifiant un peu ce que tu as écrit:
 

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <ctime>
  4. #include <ctype.h>
  5. // le jeu de base: trouver une lettre mystere en un nombre d'essais maximal
  6. bool trouver_lettre(const char lettre_mystere, int max_essais)
  7. {
  8.     bool trouve = false;
  9.     int nb_essais = 0;
  10.     while (nb_essais < max_essais) {
  11.         char reponse;
  12.         std::cout << "Tapez une lettre au clavier" << std::endl;
  13.         std::cout << "Vous avez " << (max_essais - nb_essais) << " essais pour trouver la lettre mystere." << std::endl;
  14.         std::cin >> reponse;
  15.         std::cin.ignore(); // on nettoie cin après y avoir lu ce qui nous interesse
  16.         reponse = std::tolower(reponse); // on met la rponse en minuscule
  17.         if (reponse == lettre_mystere) {
  18.             break;    // on a trouvé, on sort de la boucle
  19.         }
  20.         std::cout << ((reponse < lettre_mystere)?"Plus !":"Moins !" ) << std::endl;
  21.         ++nb_essais;
  22.     };
  23.     if (nb_essais < max_essais) {
  24.         ++nb_essais;
  25.         std::cout << "Bravo vous avez trouvez la bonne lettre (" <<  lettre_mystere << " )" << std::endl;
  26.         std::cout << "Vous avez eu besoin de " << nb_essais << " essai(s) pour trouver la lettre mystere " << std::endl;
  27.         trouve = true;
  28.     }
  29.     return trouve;
  30. }
  31. // on tire au hasard une lettre
  32. char tirage_lettre()
  33. {
  34.     static char letters[] = "abcdefghijklmnopqrstuvwxyz";
  35.     return letters[std::rand() % 26];
  36. }
  37. //
  38. bool demande_rejouer()
  39. {
  40.     char reponse;
  41.     std::cout << "Plus d'essai disponible, vous avez perdu !" << std::endl;
  42.     do {
  43.         std::cout << "Voulez vous rejouer (o)ui / (n)on ?" << std::endl;
  44.         std::cin >> reponse;
  45.         std::cin.ignore();
  46.         reponse = std::tolower(reponse);
  47.     } while (reponse != 'o' && reponse != 'n');
  48.     return (reponse == 'o');
  49. }
  50. //
  51. int main()
  52. {
  53.     std::srand(std::time(0));
  54.     bool jouer = true;
  55.     while (jouer && !trouver_lettre(tirage_lettre(), 10)) {
  56.         jouer = demande_rejouer();
  57.     }
  58.     // pause sans avoir besoin de system
  59.     // on suppose que cin a été vidé par cin.ignore quand c'était necessaire
  60.     std::cin.get();
  61.     return 0;
  62. }


 
A+,


Message édité par gilou le 03-04-2015 à 03:10:13

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-04-2015 à 11:31:45    

Noter que j'aurais pu écrire le main comme:

Code :
  1. int main()
  2. {
  3.     std::srand(std::time(0));
  4.     while (!trouver_lettre(tirage_lettre(), 10) && demande_rejouer());
  5.     return 0;
  6. }


C'est un peu moins lisible, mais ça fait la même chose, en profitant de l'évaluation dans l'ordre du test d'arrêt du while: On joue une nouvelle partie tant qu'on ne trouve pas et qu'on demande de rejouer.
 
En y repensant, dans ce genre de jeu, on ne veut pas faire deviner deux fois de suite la même lettre, donc:

Code :
  1. // on tire au hasard une lettre
  2. char tirage_lettre()
  3. {
  4.     static char letters[] = "abcdefghijklmnopqrstuvwxyz";
  5.     static char mystere = 0;
  6.     char c;
  7.     // pour éviter deux fois de suite la même lettre mystere
  8.     do {
  9.         c = letters[std::rand() % 26];
  10.     } while (c == mystere);
  11.     mystere = c;
  12.     return mystere;
  13. }


 
A+,


Message édité par gilou le 03-04-2015 à 23:49:54

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-04-2015 à 09:52:44    

Bonjour à tous.
 
Mon problème est le suivant mon jeu fonctionne bien mais je ne sais pas comment faire pour que le joueur relance la partie après avoir trouver la bonne lettre ou en ayant utiliser son nombre limité d'essais.
 
Merci pour votre aide.
 

Code :
  1. #include <iostream>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.   const char caractere = 'k';
  6.   int essai = 10;
  7.   char reponse;
  8.   char rejouer = 'o';
  9.  
  10.   for (essai; essai > 0; --essai)
  11.  
  12.   {
  13.       std::cout << "Tapez une lettre au clavier" << std::endl;
  14.       std::cout << "Vous avez " << essai << " essais pour trouvez la lettre mystere" << std::endl;
  15.       std::cin >> reponse;
  16.    
  17.       if (reponse == caractere)
  18.    
  19.     {
  20.       std::cout << "Bravo vous avez trouvez la bonne lettre " << std::endl;
  21.       std::cout << "Vous avez eu besoin de " << (10 - essai) << " essai pour trouver la lettre mystere " << std::endl;
  22.       break;
  23.     }
  24.    
  25.       if (reponse !=caractere)
  26.    
  27.         {
  28.           std::cout << "Ce n'est pas la bonne lettre !" << std::endl;
  29. }
  30.       if (reponse < caractere)
  31.      
  32.          { 
  33.             std::cout << "C'est Plus !" << std::endl;
  34.          }
  35.      
  36.        else
  37.          {
  38.             std::cout << "C'est Moins !" << std::endl;
  39.          }
  40.   }
  41.        if (essai == 0)
  42.  
  43.   { 
  44.      std::cout << "Plus d'essai disponible, vous avez perdu !" << std::endl;
  45.      std::cout << "Voulez- vous rejouer(o)ui / (n)on ? " << std::endl;
  46.      std::cin >> rejouer;
  47.   }
  48.        while(rejouer=='o')
  49.        return 0;
  50.        
  51.        system ("PAUSE" );
  52.  
  53. }

Reply

Marsh Posté le 08-04-2015 à 09:55:59    

Qq'un sur ce forum avait déjà répondu à cette question sur un topic qui concernait déjà ton programme.
 
Edit : http://forum.hardware.fr/forum2.ph [...] 0#t2254873


Message édité par rufo le 08-04-2015 à 09:56:33

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 08-04-2015 à 11:18:16    

Les sujets suivant ont été fusionnés à ce sujet par Gilou

  • Relancement de mon jeu lettre k


C'était l'occasion parfaite d'utiliser cette fonction :)
 
A+,


Message édité par gilou le 08-04-2015 à 11:19:10

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed