Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
1818 connectés 

  FORUM HardWare.fr
  Programmation
  C

  question boucle if

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

question boucle if

n°2227716
kolorius
Posté le 10-05-2014 à 21:45:23  profilanswer
 

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
mood
Publicité
Posté le 10-05-2014 à 21:45:23  profilanswer
 

n°2227718
Farian
Posté le 10-05-2014 à 23:36:10  profilanswer
 

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 !

n°2227719
kolorius
Posté le 10-05-2014 à 23:48:20  profilanswer
 

D'accord, merci beaucoup!

n°2227926
Sve@r
Posté le 13-05-2014 à 22:07:55  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  question boucle if

 

Sujets relatifs
aide pour exercice[Résolu 2 fois ;)] script PHP liste deroulante et base de données
Besoin d'aide sous php mercibesoin d aide pour mon site merci
strcpy?? c flou.... besoin d'aide.. merciBesoin AIDE pour programme sur EEPROM !!! MERCI !!!!
[PHP] Besoin d'aide ... explications à l'interieur ... merciBesoin d'aide sur une routine dos ... aidez moi merci
Besoin d'aide sur du HTML !!!!! merci !!!!!!du php dans de l'html besoin d'aide merci.
Plus de sujets relatifs à : question boucle if


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR