question boucle if

question boucle if - C - Programmation

Marsh Posté le 10-05-2014 à 21:45:23    

Bonjour à tous,
 
Je suis nouveau sur ce forum de même qu'en programmation. Je dois réaliser un projet qui, en gros, est une adaptation d'un livre-jeu sous forme de programme en C.
J'ai donc crée une structure personnage qui contient le pseudo et les différents attributs de l'avatar (habileté, endurance et chance, attributs qui sont déterminés aléatoirement). Il faut que je puisse tester son habileté et/ou sa chance. J'ai alors crée un sous-programme mais il ne fonctionne pas vraiment.  
1er problème : par exemple, si l'habileté initiale vaut  7, deux lancés de dé valent 6, il va me dire "Vous n'êtes pas habile" alors que si ou inversement.  
2ème problème : j'aimerais qu'après le test effectué, l'habileté initiale soit diminuée de 1 mais je n'y arrive pas.
 
Voici le code source :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define MAX_NOM 20
  5. struct personnage
  6. {
  7.     char pseudo[MAX_NOM];
  8.     int habilete, endurance, chance;
  9. }personnage;
  10. typedef struct personnage sPerso;
  11. /****************************************************************************************************
  12.                                 Declaration des fonctions secondaires
  13. *****************************************************************************************************/
  14. int lance_de(); // renvoie le resultat de .. lance(s) de dé
  15. void creation_avatar(sPerso* p); // demande un pseudo et genere les attributs de l'avatar
  16. void afficher_avatar(sPerso p); // affiche les attributs de l'avatar cree precedemment
  17. int test_habilete(sPerso p); // effectue un test de l'habilete de l'avatar
  18. /****************************************************************************************************
  19.                                         Fonction principale
  20. *****************************************************************************************************/
  21. int main()
  22. {
  23. srand(time(NULL));
  24. sPerso p;
  25. int x;
  26. x = (lance_de() + lance_de());
  27. printf("BIENVENUE!\n\n" );
  28. creation_avatar(&p);
  29. afficher_avatar(p);
  30. printf("\nLe lance de 2 des vaut : %d\n", x);
  31. test_habilete(p);
  32. printf("\nVotre habilete est desormais de : %d\n", (p.habilete)); //probleme : la valeur finale est la meme que la valeur initiale
  33. return EXIT_SUCCESS;
  34. }
  35. /****************************************************************************************************
  36.                                 Definition des fonctions secondaires
  37. *****************************************************************************************************/
  38. int lance_de()
  39. {
  40. int x=0;
  41. x=x+(rand()%6)+1;
  42. return x;
  43. }
  44. void creation_avatar(sPerso* p) /*Creation de l'avatar*/
  45. {
  46. printf("Veuillez saisir votre pseudo : " );
  47. scanf("%s", (*p).pseudo);
  48. (*p).habilete=(6 + lance_de());
  49. (*p).endurance=(12 + lance_de() + lance_de());
  50. (*p).chance=(6 + lance_de());
  51. }
  52. void afficher_avatar(sPerso p) /*Affiche le pseudo et les attributs de l'avatar*/
  53. {
  54. printf("\n" );
  55. printf("Votre pseudo est : %s\n\n", (p.pseudo));
  56. printf("Votre habilete est de : %d\n", ((p.habilete)));
  57. printf("Votre endurance est de : %d\n", ((p.endurance)));
  58. printf("Votre chance est de : %d\n", ((p.chance)));
  59. }
  60. int test_habilete(sPerso p)
  61. {
  62.     if ((lance_de() + lance_de()) <= (p.habilete))
  63.     {
  64.         printf("\nVous etes habile.\n" );
  65.         return 0;
  66.     }
  67.     printf("\nVous n'etes pas habile.\n" );
  68.     return 1;
  69.     p.habilete = p.habilete - 1; //ceci ne fonctionne pas
  70. }


 
Désolé, je ne sais pas comment être plus clair.
 
Merci de votre aide.
 
EDIT : J'ai réglé mes problèmes mais j'ai une question: faut-il que que je mette cette instruction :

Code :
  1. printf("\nVotre habilete est desormais de : %d\n", (p.habilete)-1);

dans mon if et dans mon else ou est-ce qu'il y a moyen de le mettre une seule fois, quelque soit le cas dans lequel on se trouve? Voici mon code pour le sous programme en question :

Code :
  1. int test_habilete(sPerso p)
  2. {
  3.     if ((lance_de() + lance_de()) <= ((p.habilete)))
  4.     {
  5.         printf("\nVous etes habile." );
  6.         printf("\nVotre habilete est desormais de : %d\n", (p.habilete)-1);
  7.         return 0;
  8.     }
  9.     printf("\nVous n'etes pas habile." );
  10.     printf("\nVotre habilete est desormais de : %d\n", (p.habilete)-1);
  11.     return 1;
  12. }

Message cité 1 fois
Message édité par kolorius le 10-05-2014 à 23:10:08
Reply

Marsh Posté le 10-05-2014 à 21:45:23   

Reply

Marsh Posté le 10-05-2014 à 23:36:10    

Bonsoir !
 
Vous passez la structure "p" par valeur dans votre fonction "test_habilete", donc le paramètre passé est une copie de la variable du "main". L'habileté est bien décrémentée, mais c'est celle de la copie.
 
Si vous voulez la modifier dans la fonction, vous devez passer un pointeur (puisque vous êtes en C), comme vous l'avez fait pour la fonction "creation_avatar", les modifications seront alors faites sur la variable, pas sur la copie.
 
Bonne continuation !

Reply

Marsh Posté le 10-05-2014 à 23:48:20    

D'accord, merci beaucoup!

Reply

Marsh Posté le 13-05-2014 à 22:07:55    

kolorius a écrit :

Bonjour à tous,


Bonjour
 

kolorius a écrit :

Code :
  1. int test_habilete(sPerso p)
  2. {
  3.     ...
  4.     return 1;
  5.     p.habilete = p.habilete - 1; //ceci ne fonctionne pas     
  6. }



C'est un peu normal vu que l'instruction est placée après le return...  :sarcastic:  
 

kolorius a écrit :

J'ai réglé mes problèmes mais j'ai une question: faut-il que que je mette cette instruction :

Code :
  1. printf("\nVotre habilete est desormais de : %d\n", (p.habilete)-1);

dans mon if et dans mon else ou est-ce qu'il y a moyen de le mettre une seule fois, quelque soit le cas dans lequel on se trouve? Voici mon code pour le sous programme en question :  

Code :
  1. int test_habilete(sPerso p)
  2. {
  3.     if ((lance_de() + lance_de()) <= ((p.habilete)))
  4.     {
  5.         printf("\nVous etes habile." );
  6.         printf("\nVotre habilete est desormais de : %d\n", (p.habilete)-1);
  7.         return 0;
  8.     }
  9.     printf("\nVous n'etes pas habile." );
  10.     printf("\nVotre habilete est desormais de : %d\n", (p.habilete)-1);
  11.     return 1;
  12. }



 
Ben c'est évident. Deux instructions identiques, l'une dans le if (qui, soit dit en passant, n'est certainement pas une boucle) et l'autre dans le else => autant les sortir et n'en mettre qu'une seule.
 
Accessoirement, tu as supprimé la décrémentation (afficher i-1 ne décrémentera pas i !!!)

Code :
  1. int test_habilete(sPerso *p)
  2. {
  3.     int ret;
  4.     if ((lance_de() + lance_de()) <= p->habilete /* Tu remarqueras la suppression des parenthèses inutiles - Encadrer l'addition je veux bien (si on ne maitrise pas toutes les priorités) mais encadrer p.habilete !!!???!!! */)
  5.     {
  6.         printf("\nVous etes habile." );
  7.         ret=0;
  8.     }
  9.     else
  10.     {
  11.         printf("\nVous n'etes pas habile." );
  12.         ret=1;
  13.     }
  14.     p->habilete--;
  15.     printf("\nVotre habileté est desormais de : %d\n", p->habilete);
  16.     return ret;
  17. }


Message édité par Sve@r le 13-05-2014 à 22:14:31

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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