Jeu des allumettes : Code bon ou pas

Résolu
toufeux Messages postés 43 Date d'inscription   Statut Membre Dernière intervention   -  
toufeux Messages postés 43 Date d'inscription   Statut Membre Dernière intervention   - 25 févr. 2017 à 17:08
bonjour,
je débute en programmation et j'aimerais que quelqu’un d’expérimenté me dise les défauts de mon programme. Je pense que vous connaissez le jeu des allumettes.

#include <iostream>
#include <string>

int main();
int menu();
int configjeu();
int jeu();
int regle();
int pCondition1 = 1, pCondition2 = 3, x, y, nombreAllumettes=21;
std::string joueur1; std::string joueur2;
int main(){
 return menu();
}

int menu(){
 system ("cls");
 int selecteur;  nombreAllumettes=21;
  std::cout<<"\t ******************"<<std::endl;
 std::cout<<"\t Jeu des Allumettes"<<std::endl;
 std::cout<<"\t ******************"<<std::endl;
 std::cout<<std::endl;
 std::cout<<"0.sortir du programme."<<std::endl;
 std::cout<<"1.jouer en mode classic."<<std::endl;
 std::cout<<"2.configurer les parametres."<<std::endl;
 std::cout<<"3.lire les regles de jeu."<<std::endl;
 std::cout<<"choix :"; std::cin>>selecteur;
 switch(selecteur){
  case 0: exit(1); break; 
  case 1: return jeu(); break; 
  case 2: return configjeu(); break;
  case 3: return regle(); break;
  default: std::cout<<"votre doigt à peut-etre glisser"<<std::endl ;return menu();
 }}

int jeu(){
 std::cout<<"nom du joueur 1"<<std::endl; std::cin>>joueur1;
 std::cout<<"nom du joueur 2"<<std::endl; std::cin>>joueur2;
 system ("cls"); 
 std::cout<<"\t ******************"<<std::endl;
 std::cout<<"\t jeu des allumettes"<<std::endl;
 std::cout<<"\t ******************"<<std::endl;
 std::cout<<std::endl;std::cout<<std::endl;
 std::cout<<"le jeu commence avec "<<nombreAllumettes<<std::endl;
  while(nombreAllumettes>0)              /*jeu*/   
  {
   std::cout<<joueur1<<" saisir un nombre"<<std::endl; std::cin>>x;

if(x>pCondition2 || x<pCondition1)
    {
     std::cout<<"nombre saisi invalide"<<std::endl;
    }
   else nombreAllumettes=nombreAllumettes-x;
    std::cout<<"le nombre d'allumettes est de :"<<  nombreAllumettes<<std::endl;

std::cout<<joueur2<<" saisir un nombre"<<std::endl; std::cin>>x;

if(x>pCondition2 || x<pCondition1)
    {
     std::cout<<"nombre saisi invalide"<<std::endl;
    }
   else nombreAllumettes=nombreAllumettes-x;
    std::cout<<"le nombre d'allumettes est de :"<<  nombreAllumettes<<std::endl; 
   if (nombreAllumettes<=0)
   {
     std::cout<<std::endl;
     std::cout<<"Il n'y a plus d'allumettes, c'est fini !!!";
     std::cout<<" Il n'y a plus d'allumettes, c'est fini !!! ";
     std::cout<<" il n'y a plus d'allumettes, c'est fini !!!"<<std::endl;;
   }
   }
      std::cout<<std::endl;
  system ("pause");return menu();

}
int configjeu(){
 system ("cls");
 std::cout<<"\t ****************************"<<std::endl;
 std::cout<<"\t configuration des parametres"<<std::endl;
 std::cout<<"\t ****************************"<<std::endl;
 std::cout<<std::endl;
 std::cout<<"entrer le nombre d'allumettes :"; std::cin>>nombreAllumettes;
 std::cout<<"entrer la condition minimum :"; std::cin>>pCondition1;
 std::cout<<"entrer la condition maximum :"; std::cin>>pCondition2;
 system ("pause");
 return jeu();
 }
int regle(){
 std::cout<<"\t ************"<<std::endl;
 std::cout<<"\t regle du jeu"<<std::endl;
 std::cout<<"\t ************"<<std::endl;
 std::cout<<std::endl;
 std::cout<<"les regles sont (en mode classic) :"<<std::endl;
 std::cout<<"\t -le but du jeu est de NE PAS retirer la derniere allumette"<<std::endl;
 std::cout<<"\t -vous n'avez le droit de ne retirer au minimum 1 et au maximum 3 allumettes"<<std::endl;
 std::cout<<std::endl; 
 system ("pause");
 std::cout<<"les conditions designent le nombre d'allumettes que l'on peut retirer à chaque tour"<<std::endl;
 std::cout<<std::endl;
 system ("pause");
 return menu();
 }
A voir également:

2 réponses

noctambule28 Messages postés 33382 Date d'inscription   Statut Webmaster Dernière intervention   2 857
 
Salut,

Vu de loin, ça manque de commentaires...
Après coté technique, je laisse de plus compétents t'en parler.

Et un merci d'avance, n'est jamais de trop sur un forum...
0
toufeux Messages postés 43 Date d'inscription   Statut Membre Dernière intervention  
 
merci
0
noctambule28 Messages postés 33382 Date d'inscription   Statut Webmaster Dernière intervention   2 857 > toufeux Messages postés 43 Date d'inscription   Statut Membre Dernière intervention  
 
Tu peux déjà reposter un code avec les commentaires qui devraient y figurer : mets-toi à la place d'un dev qui lit ton code(ce n'est pas toujours aussi simple, il faut expliquer ce que ça fait et aussi pourquoi cette méthode).
C'est le b-a-ba pour faire "bien et propre".
0
toufeux Messages postés 43 Date d'inscription   Statut Membre Dernière intervention   > noctambule28 Messages postés 33382 Date d'inscription   Statut Webmaster Dernière intervention  
 
donc ça donnerais à peut près ça?

#include <iostream>
#include <string>

int main();               /*declaration des variables */
int menu(); 
int configjeu();
int jeu();
int regle();
int pCondition1 = 1, pCondition2 = 3, x, y, nombreAllumettes=21;
std::string joueur1; std::string joueur2;
int main(){
 return menu();
}

int menu(){
 system ("cls");         /*menu  du jeu*/
 int selecteur;  nombreAllumettes=21;
  std::cout<<"\t ******************"<<std::endl;
 std::cout<<"\t Jeu des Allumettes"<<std::endl;
 std::cout<<"\t ******************"<<std::endl;
 std::cout<<std::endl;
 std::cout<<"0.sortir du programme."<<std::endl;
 std::cout<<"1.jouer en mode classic."<<std::endl;
 std::cout<<"2.configurer les parametres."<<std::endl;
 std::cout<<"3.lire les regles de jeu."<<std::endl;
 std::cout<<"choix :"; std::cin>>selecteur;
 switch(selecteur){
  case 0: exit(1); break; 
  case 1: return jeu(); break; 
  case 2: return configjeu(); break;
  case 3: return regle(); break;
  default: std::cout<<"votre doigt à peut-etre glisser"<<std::endl ;return menu();
 }}

int jeu(){
 std::cout<<"nom du joueur 1"<<std::endl; std::cin>>joueur1;    /*jeu*/ 
 std::cout<<"nom du joueur 2"<<std::endl; std::cin>>joueur2;
 system ("cls"); 
 std::cout<<"\t ******************"<<std::endl;
 std::cout<<"\t jeu des allumettes"<<std::endl;
 std::cout<<"\t ******************"<<std::endl;
 std::cout<<std::endl;std::cout<<std::endl;
 std::cout<<"le jeu commence avec "<<nombreAllumettes<<std::endl;
  while(nombreAllumettes>0)                
  {
   std::cout<<joueur1<<" saisir un nombre"<<std::endl; std::cin>>x;

if(x>pCondition2 || x<pCondition1)
    {
     std::cout<<"nombre saisi invalide"<<std::endl;
    }
   else nombreAllumettes=nombreAllumettes-x;
    std::cout<<"le nombre d'allumettes est de :"<<  nombreAllumettes<<std::endl;

std::cout<<joueur2<<" saisir un nombre"<<std::endl; std::cin>>x;

if(x>pCondition2 || x<pCondition1)
    {
     std::cout<<"nombre saisi invalide"<<std::endl;
    }
   else nombreAllumettes=nombreAllumettes-x;
    std::cout<<"le nombre d'allumettes est de :"<<  nombreAllumettes<<std::endl; 
   if (nombreAllumettes<=0)
   {
     std::cout<<std::endl;
     std::cout<<"Il n'y a plus d'allumettes, c'est fini !!!";
     std::cout<<" Il n'y a plus d'allumettes, c'est fini !!! ";
     std::cout<<" il n'y a plus d'allumettes, c'est fini !!!"<<std::endl;;
   }
   }
      std::cout<<std::endl;
  system ("pause");return menu();

}
int configjeu(){
 system ("cls");              /*menu de configuration*/
 std::cout<<"\t ****************************"<<std::endl;   
 std::cout<<"\t configuration des parametres"<<std::endl;
 std::cout<<"\t ****************************"<<std::endl;
 std::cout<<std::endl;
 std::cout<<"entrer le nombre d'allumettes :"; std::cin>>nombreAllumettes;
 std::cout<<"entrer la condition minimum :"; std::cin>>pCondition1;
 std::cout<<"entrer la condition maximum :"; std::cin>>pCondition2;
 system ("pause");
 return jeu();
 }
int regle(){
 std::cout<<"\t ************"<<std::endl;        /*regle du jeu..*/
 std::cout<<"\t regle du jeu"<<std::endl;
 std::cout<<"\t ************"<<std::endl;
 std::cout<<std::endl;
 std::cout<<"les regles sont (en mode classic) :"<<std::endl;
 std::cout<<"\t -le but du jeu est de NE PAS retirer la derniere allumette"<<std::endl;
 std::cout<<"\t -vous n'avez le droit de ne retirer au minimum 1 et au maximum 3 allumettes"<<std::endl;
 std::cout<<std::endl; 
 system ("pause");
 std::cout<<"les conditions designent le nombre d'allumettes que l'on peut retirer à chaque tour"<<std::endl;
 std::cout<<std::endl;
 system ("pause");
 return menu();
 }
0
Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   101
 
Bonjour,

Sur la syntaxe:
  • Il ne faut pas utiliser de variables globales.
  • Se servir du passage de paramètres aux fonctions.
  • Les noms doivent être explicites ou accompagnés de commentaires (les globales x et y sont peu claires.)
  • Les commentaires permettent d'améliorer la lecture, ici le code est 'simple' donc ils ne manquent pas vraiment, mais quelques explications sont parfois utiles.
  • Penser à bien utiliser l'indentation.
  • using namespace std, n'est pas utilisé, bonne initiative.

Sur la robustesse:
  • Utiliser des return qui renvoient à une autre fonction n'est pas viable. La structure sembler marcher ici, mais un utilisateur qui ferait plein de choix finira par planter le logiciel (les fonctions successives s'empilent.)
  • Du même acabit, on évite de quitter une application par exit() qui dans un programme plus complexe abouti à des objets mal libérés.
  • Il y des contrôles de validité des valeurs demandées, c'est bien mais il en manque (p.e. valeurminimum peut être choisie à -1, on peut retirer plus d'allumettes que ce qui reste, ...)
  • Il y a un bon découpage en fonctions, en langage C on le dirait même parfait; en C++ un découpage plus 'objet' améliorerait la lisibilité.

Sur le fonctionnel:
  • Tout un programme et pourtant il n'est pas capable de dire qui a gagné, c'est dommage.
  • Si le joueur1 gagne ou perd, on demande quand même au joueur2 de retirer des allumettes.


Globalement, c'est pas mal continue sur cette voie.

Dalfab
0
toufeux Messages postés 43 Date d'inscription   Statut Membre Dernière intervention  
 
merci pour toute test remarques, mais par quoi je peux remplacer return car goto est deconseillé. :)
0
Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   101 > toufeux Messages postés 43 Date d'inscription   Statut Membre Dernière intervention  
 
Oui,
goto
est même impossible ici.
La solution consiste à créer une fonction
menu()
sous la forme d'une boucle. Les autres fonctions n'auront qu'à faire un simple
return
, qui nous ramènera dans la boucle de la fonction
menu()
. Le
return
de la fonction
menu()
sera lui écrit à la place de l'appel à
exit()
.
0
toufeux Messages postés 43 Date d'inscription   Statut Membre Dernière intervention   > Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention  
 
heu je crois que tu m'as perdu la...
j'ai pas trop compris comment on crée la fonction menu sous la forme d'une boucle.
0
Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   101 > toufeux Messages postés 43 Date d'inscription   Statut Membre Dernière intervention  
 
Comme cela:
int menu(){
for(;;) {
system ("cls");
int selecteur;
nombreAllumettes=21;
......
std::cout<<"choix :"; std::cin>>selecteur;
switch ( selecteur ) {
case 0: return 0;
case 1: jeu(); break;
case 2: configjeu(); break;
case 3: regle(); break;
default: std::cout<<"votre doigt à peut-etre glisser"<<std::endl;
}
}
}
0
toufeux Messages postés 43 Date d'inscription   Statut Membre Dernière intervention   > Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention  
 
ok merci, je vais tacher de corriger ça :]
0