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();
 }

2 réponses

noctambule28
Messages postés
31772
Date d'inscription
samedi 12 mai 2007
Statut
Webmaster
Dernière intervention
13 février 2022
2 867
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...
0
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
31772
Date d'inscription
samedi 12 mai 2007
Statut
Webmaster
Dernière intervention
13 février 2022
2 867 > 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
31772
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
654
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
27 mai 2022
89
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
0
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
654
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
27 mai 2022
89 > 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
654
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
27 mai 2022

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
654
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
27 mai 2022
89 > 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
654
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
27 mai 2022

25 févr. 2017 à 17:08
ok merci, je vais tacher de corriger ça :]
0