Jeu des allumettes : Code bon ou pas

Résolu/Fermé
toufeux Messages postés 43 Date d'inscription vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017 - Modifié par noctambule28 le 24/02/2017 à 22:50
toufeux Messages postés 43 Date d'inscription vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017 - 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 31785 Date d'inscription samedi 12 mai 2007 Statut Webmaster Dernière intervention 13 février 2022 2 858
24 févr. 2017 à 22:47
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...
toufeux Messages postés 43 Date d'inscription vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017
24 févr. 2017 à 22:52
merci
0
noctambule28 Messages postés 31785 Date d'inscription samedi 12 mai 2007 Statut Webmaster Dernière intervention 13 février 2022 2 858 > toufeux Messages postés 43 Date d'inscription vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017
24 févr. 2017 à 23:25
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 vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017 > noctambule28 Messages postés 31785 Date d'inscription samedi 12 mai 2007 Statut Webmaster Dernière intervention 13 février 2022
Modifié par noctambule28 le 25/02/2017 à 11:48
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 dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
25 févr. 2017 à 13:55
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
toufeux Messages postés 43 Date d'inscription vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017
25 févr. 2017 à 14:54
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 dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > toufeux Messages postés 43 Date d'inscription vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017
25 févr. 2017 à 15:47
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 vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017 > Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023
25 févr. 2017 à 16:27
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 dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > toufeux Messages postés 43 Date d'inscription vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017
Modifié par Dalfab le 25/02/2017 à 16:41
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 vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017 > Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023
25 févr. 2017 à 17:08
ok merci, je vais tacher de corriger ça :]
0