Bloqué sur mon programme relativement simple.

Bloqué sur mon programme relativement simple. - C++ - Programmation

Marsh Posté le 08-02-2016 à 01:12:18    

Bonjour,
 
Je me suis lancé sur la création d'un petit jeu utilisant la console pour débuter a voler de mes propres ailes en C++ (après quelques cours très scolaires et mal expliquer en ISN).
Ainsi je suis plutôt fier de mon petit programme que j'ai réalisé en peu de temps..
 
Mais j'ai voulus implémenter une variable de monnaie, passant par une fonction simple.
 

Code :
  1. int sous(int dummy, int gain) {
  2.     return dummy + gain;
  3. }


 
J'utilise cette fonction dans ma fonction de "combat" de mon mini jeu, j'ai pas mal brodé autour parce que je suis bloqué dessus depuis quelques heures :
 

Code :
  1. int combat(int attqJ, int pvJ, int pvmax, int attqM, int pvM, int dummy) {
  2.     srand(time(0));
  3.     int rep, degats_sub, degats_inf, pause, gain;
  4.     cout<<"Vous avez "<<pvJ<<" PV !"<<endl;
  5.     cout<<""<<endl;
  6.     cout<<"Un monstre sauvage apparait ! Il possede " << attqM <<" d'attaque et " << pvM <<" PV !"<<endl;
  7.     cout<<""<<endl;
  8.     cout<<"Que voulez vous faire ? ATTAQUER [1] / FUIR [2]"<<endl;
  9.     cin>>rep;
  10.     if (rep == 1) {
  11.         do {
  12.             if (pvJ > 0) {
  13.                 system("cls" );
  14.                 degats_inf = attqJ + ( rand() %5 + 1 );
  15.                 pvM = pvM - degats_inf;
  16.                 cout<<"Vous attaquez le monstre, lui infligeant "<<degats_inf<<" de degats !"<<endl;
  17.                 cout<<"Il lui reste "<<pvM<<" PV !"<<endl;
  18.                 degats_sub = attqM + (rand() %5 + 1);
  19.                 pvJ = pvJ - degats_sub;
  20.                 cout<<"Il riposte en vous infligeant "<<degats_sub<<" de degats !"<<endl;
  21.                 cout<<"Il vous reste "<<pvJ<<" PV !"<<endl;
  22.                 cout<<""<<endl;
  23.                 if (pvM <= 0) {
  24.                     cout<<"Le monstre a ete vaincu !"<<endl;
  25.                     cout<<""<<endl;
  26.                     gain = rand() %75 + 1;
  27.                     cout<<"Felicitations ! Vous remportez "<<gain<<" pieces !"<<endl ;
  28.                     sous(dummy, gain);
  29.                     dummy = sous(dummy, gain);
  30.                     cout<<"Votre argent total est de : "<<dummy<<endl;
  31.                     cout<<""<<endl;
  32.                     if (pvJ < pvmax) {
  33.                         cout<<"Il semblerait que vous ayez subit des degats."<<endl;
  34.                         cout<<"Passez a une auberge pour vous soigner !"<<endl;
  35.                         break;
  36.                     }
  37.                     else {
  38.                         break;
  39.                     }
  40.                 return dummy;
  41.                 }
  42.                 else if (pvJ < 0) {
  43.                     cout<<"Un villageois vous a retrouver evanoui..."<<endl;
  44.                     cout<<"Il semblerait qu'il vous a deplacer dans une auberge..."<<endl;
  45.                     break;
  46.                 }
  47.                 cout<<"Appuyez sur [1] pour continuer"<<endl;
  48.                 cin>>pause;
  49.                 pause=0;
  50.                 system("cls" );
  51.             }
  52.         }while((pvJ > 0) && (pvM > 0));
  53.     }
  54.     else {
  55.         cout<<"Vous fuyez..."<<endl;
  56.         cout<<""<<endl;
  57.         cout<<"Appuyez sur [1] pour continuer"<<endl;
  58.         cin>>pause;
  59.         pause=0;
  60.         system("cls" );
  61.         return 0;
  62.     }
  63. return 0;
  64. }


 
Là mon programme m'affiche bien la valeur de la fonction "sous" (qui a un nom très original d'ailleurs, il faut le dire !).
 
Mais c'est dans mon main que tout cela me casse les bonbons.
 
Exemple d'un cas 1 pour un combat :
 
 

Code :
  1. [Pleins de définition de variables pas ici...]
  2. int coins = sous(0,0);
  3. [Là y'a tout mon code pour les menus etc...]
  4. case 1: {
  5.       system("cls" );
  6.       cout<<"Vous entrez dans les bois !"<<endl;
  7.       cout<<""<<endl;
  8.       int monster[] = {rand()%10 + 1, rand()%50 + 25};
  9.        combat(stats[0], stats[1], stats[2], monster[0], monster[1], coins);
  10.        cout<<"Tapez [1] pour continuer !"<<endl;
  11.        cin>>pause;
  12.        pause = 0;
  13.        menu = 0;
  14.        break
  15. }


 
 
Et alors mon problème c'est que j'aimerais que "coins" soit à la valeur de ma fonction sous, mais j'arrive pas a récuperer une bonne valeur.
 
Pourtant dans la fonction combat j'ai bien dummy = 86 (par exemple) j'arrive bien a récuperer la valeur... mais alors dans le main y'a pas moyen.
 
Si quelqu'un pourrait m'expliquer comment faire, pas juste me donner une réponse s'il vous plaît.
 
Merci bien !
 
 
Cordialement,
 
Aizekyel.
 
 
PS : Je conçois que ça puisse paraître très simple pour certains mais je suis a mes débuts en C++.

Reply

Marsh Posté le 08-02-2016 à 01:12:18   

Reply

Marsh Posté le 08-02-2016 à 13:18:55    

Ligne 29 :pt1cable:  
Tu ne stockes pas la valeur retournée dans une variable.
 
Au passage, si c'est pour faire ce genre de structure de programme, laisse tomber le C++ et fait juste du C.
 
Par ailleurs mettre des break et des return en plein milieu comme tu le fais, c'est un coup à avoir pleins de bugs. Il faut mettre en place des structures de contrôles propres dans tes boucles; en gros, que les critères d'arrêts soient clairs quitte à utiliser des booléens dont la valeur changera en fonction de tests réalisés dans le corps de la boucle. Mais au moins, qu'on ait tous les critères d'arrêt au même endroit.
 
Ex :  
if (pvJ < pvmax) {
    aSubiDegats = TRUE; // TRUE = 1
}
 
 
else if (pvJ < 0) {
    estEvanui = TRUE;  
}
 
Et dans ton while, tu mettras !aSubiDegats  et !estEvanui.
 
Edit : j'avais pas vu la ligne 30. Mais du coup, pourquoi conserver la ligne  29 :??: Du coup, je pense que ça vient de tous des critères de sortie de boucle ou de return multiples. Tu dois probablement pas passer là où tu penses.
Rappel : une fonction, un seul return. Et le break, c'est que pour le switch() :o


Message édité par rufo le 08-02-2016 à 13:22:25

---------------
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-02-2016 à 14:56:12    

Bonjour,
 
Merci à toi pour ta réponse..  
 
Pour les break ,a vrai dire notre prof nous avait apprit ça comme ça et après m'être pas mal documenté et ainsi qu'avec ton aide, ça paraît beaucoup plus logique.
 
Je vais refaire ça de mon coté et si jamais j'ai encore un soucis je reviendrais vers vous, mais un grand merci à toi.

Reply

Marsh Posté le 08-02-2016 à 15:02:14    

"a vrai dire notre prof nous avait apprit ça comme ça" -> c'est une honte d'enseigner des structures comme ça :fou:


---------------
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-02-2016 à 15:03:57    

Bah le prof est pas prof de programmation et tout ce qu'il fait en cours c'est distribuer un paquet de feuille, le lire, et parfois il découvre des trucs lui même.

Reply

Marsh Posté le 08-02-2016 à 16:46:27    

Dans ce cas c'est une honte qu'il soit prof tout court :whistle:

 

Il y a vraiment de meilleures façons de structurer un algo et la logique générale d'un programme, celle là est ce qui mène le plus vite à la confusion et à des bugs vicieux, et je ne parle même pas de la maintenabilité...


Message édité par TotalRecall le 08-02-2016 à 16:46:49

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Sujets relatifs:

Leave a Replay

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