Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/07/2008, à 06:42

wHiteweedow

Comment utiliser les fontions??

Bonjour, je débute en programmation C depuis 1 ans et demi. Puisque la programmation n'est pas une prioritée dans ma vie, j'ai seulement appris (La base). Mais je veux maintenant continuer puisque j'ai un projet que je veux réaliser: Un RPG big_smile. Je sais, il faut apprendre la SDL et/ou la OpenGL mais je dois d'abord comprendre les fonctions...

Bon, voici la fonction que j'ai créé pour générer un arme à dropper lorsque l'ennemi est tué:

long ddNewWeapon(char monsterLevel)
{
   while(newItemCheck == 1)
   {
      //Création et formatage des variables
      unsigned char newWeaponType = 0;
      unsigned long newWeaponAttackMin = 0; unsigned long newWeaponAttackMax;
      unsigned char newWeaponLevel = 0;
      unsigned char newItemCheck = 0;

      //Génération du type d'arme
      newWeaponType = (rand() % (6 - 1 + 1)) + 1;
      //Calcul du level minimum de l'arme
      newWeaponLevel = monsterLevel - (rand() % (6 - 2 + 2)) + 2;

      //Calcul de la force d'attaque de l'arme générée
      if(newWeaponType == 6) //Axe
      {
         newWeaponAttackMax = newWeaponLevel * (rand() % (7 - 5 + 5)) + 5;
         newWeaponAttackMin = newWeaponLevel * (rand() % (4 - 3 + 3)) + 3;
      }
      else if(newWeaponType == 5) //Mace
      {
         newWeaponAttackMax = newWeaponLevel * (rand() % (7 - 6 + 6)) + 6;
         newWeaponAttackMin = newWeaponLevel * (rand() % (5 - 4 + 4)) + 4;
      }
      else if(newWeaponType == 4) //Sword
      {
         newWeaponAttackMax = newWeaponLevel * (rand() % (6 - 4 + 4)) + 4;
         newWeaponAttackMin = newWeaponLevel * (rand() % (2 - 1 + 1)) + 1;
      }
      else if(newWeaponType == 3) //Dagger
      {
         newWeaponAttackMax = newWeaponLevel * (rand() % (4 - 2 + 2)) + 2;
         newWeaponAttackMin = newWeaponLevel * (rand() % (2 - 1 + 1)) + 1;
      }
      else if(newWeaponType == 2) //Spear
      {
         newWeaponAttackMax = newWeaponLevel * (rand() % (4 - 3 + 3)) + 3;
         newWeaponAttackMin = newWeaponLevel * 2;
      }
      else if(newWeaponType == 1) //Spoon (N'attaque pas)
      {
         newWeaponAttackMax = 0; newWeaponAttackMin = 0;
      }

      //Validation de l'arme générée : Buggée ou pas ?
      if(newWeaponAttackMin >= newWeaponAttackMax && newWeaponLevel < 1)
      {
         printf("%s", errorCreateWeapon);
      }
      else
      {
         newItemCheck = 1;
         /*Arme correctement générée.
         Cet endroit pourrais être utilisée pour "dropper" l'objet.
         L'idéal serais d'inclure une fonction de droppage */
      }
   }
   return newWeaponAttackMin;
   return newWeaponAttackMax;
   return newWeaponLevel;
   return newWeaponType;
}

J'ai créé une fonction, mais je ne sais pas comment elle marche.
J'apprécierais que quelqu'un puisse insérer dans une fonction main un exemple et les expliquations: Le programme demande le niveau de l'ennemi tué (monsterLevel) et affiche ensuite les informations de l'arme  (newWeaponAttackMin, newWeaponAttackMax, newWeaponLevel, newWeaponType)
Cela m'aiderais à beaucoup mieux comprendre les fonctions parce-que j'ai cherché sur internet et il n'y a rien de "Compréhensible" par mon petit cerveau ..

Edit: Bien sûr il sera OpenSource ^^

2e Edit: Aah oui j'oubliais, je connais plusieurs programmeurs et ils disent tous que ma façon de coder n'est pas "claire" et difficile à comprendre alors, voici la liste des variables:

****************************************************************
***          ddNewWeapon ->     Génère un nouvel arme         **
****************************************************************
Variable à entrer:  Le niveau du monstre tué
******************Sorties:
*** newWeaponType       -> Type d'un arme générée
*** newWeaponAttackMin  -> Attaque minimale d'un arme générée
*** newWeaponAttackMax  -> Attaque maximale d'un arme générée
*** newWeaponLevel      -> Niveau d'un arme générée
****************************************************************

Merci à l'avance pour votre soutien smile

Dernière modification par wHiteweedow (Le 30/07/2008, à 06:56)

Hors ligne

#2 Le 30/07/2008, à 07:54

melyo

Re : Comment utiliser les fontions??

Hum, une fonction ne retourne qu'un seul élément. Dans ton cas, tu devrais créer un type contenant toute ces caractéristiques et ainsi renvoyer qu'une valeur.

Ensuite pour les fonctions, bah voila juste un petit exemple :

//fonction de test, elle aditionne 2 chiffres...
int add(int a, int b)
{
  int c;
  c = a + b;
  return c;

  //ou return a + b; pour etre plus rapide...
}

//programme principal
int main()
{
  //utilisation de la fontion
  int res = add( 1 , 4 );
  printf("res : %d", res);

  printf("res : %d", add(23, 34) );

  return 0;
}

Voila, une fonction te permet de rassembler du code réutilisable, dans l'exemple, la fonction d'addition pourra etre utilisé plusieurs fois, sans avoir besoin de retaper a + b...


"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré

Hors ligne

#3 Le 30/07/2008, à 08:35

champoul

Re : Comment utiliser les fontions??

Déclare une structure comme ça:

struct weapon {
      int AttackMin;
      int AttackMax;
      char* Type;
      int Level;
};

Tu déclares une variable de ce type de cette façon

struct weapon testweapon;

Et tu accèdes aux attributs decette façon:

testweapon.level = 12;

Et comme ça tu pourras retourner tout d'un coup !
Mais bon, c'est du C++ ton truc, il doit y avoir un moyen de déclarer une nouveau type d'objet autrement que par des struct, mais j'y connais rien en C++ hmm

Hors ligne

#4 Le 30/07/2008, à 09:08

slasher_fun

Re : Comment utiliser les fontions??

Vi, faut faire des classes plutôt que des struct smile

Hors ligne

#5 Le 30/07/2008, à 09:54

nicolas.sitbon

Re : Comment utiliser les fontions??

champoul a écrit :

Mais bon, c'est du C++ ton truc, il doit y avoir un moyen de déclarer une nouveau type d'objet autrement que par des struct, mais j'y connais rien en C++ hmm

Je ne vois pas de C++ dans son code!

Hors ligne

#6 Le 30/07/2008, à 10:02

nicolas.sitbon

Re : Comment utiliser les fontions??

melyo a écrit :

Hum, une fonction ne retourne qu'un seul élément. Dans ton cas, tu devrais créer un type contenant toute ces caractéristiques et ainsi renvoyer qu'une valeur.

Ensuite pour les fonctions, bah voila juste un petit exemple :

//fonction de test, elle aditionne 2 chiffres...
int add(int a, int b)
{
  int c;
  c = a + b;
  return c;

  //ou return a + b; pour etre plus rapide...
}

//programme principal
int main()
{
  //utilisation de la fontion
  int res = add( 1 , 4 );
  printf("res : %d", res);

  printf("res : %d", add(23, 34) );

  return 0;
}

Voila, une fonction te permet de rassembler du code réutilisable, dans l'exemple, la fonction d'addition pourra etre utilisé plusieurs fois, sans avoir besoin de retaper a + b...

plutôt :

#include <stdio.h>
#include <assert.h>
#include <limits.h>

static inline int add (int const a, int const b)
{
   if (a < 0)
   {
      if (b < 0)
         assert (INT_MIN - b <= a);
   }
   else if (a > 0 && b > 0)
   {
      assert (INT_MAX - b >= a);
   }
    return a + b;
}

int main (void)
{
   printf ("res : %d\n"
           "res : %d\n",
           add (1, 4),
           add (23, 34));

   return 0;
}

Dernière modification par nicolas.sitbon (Le 31/07/2008, à 10:38)

Hors ligne

#7 Le 30/07/2008, à 11:32

champoul

Re : Comment utiliser les fontions??

nicolas.sitbon a écrit :
champoul a écrit :

Mais bon, c'est du C++ ton truc, il doit y avoir un moyen de déclarer une nouveau type d'objet autrement que par des struct, mais j'y connais rien en C++ hmm

Je ne vois pas de C++ dans son code!

Putain c'est juste big_smile ce sont les "new*" qui m'ont fait pensé ça au premier coup d'oeil wink Et puis à 8H j'ai un peu la tête dans le pâté lol
Dans tous les cas je pense qu'un langage objet serait plus adapté pour son projet, sa fonction c'est un constructeur en réalité, ce serait beaucoup plus simple ( et propre ) en C++, java ou autre joyeuseté smile Et si vraiment il veut continuer en C, il peut utiliser ce que j'ai mis dans mon post smile

PS: et tes calculs 6+4-4, c'est inutile hein, mets directement les valeurs, ça sert à rien de faire bosser ton PC pour rien wink

Dernière modification par champoul (Le 30/07/2008, à 11:34)

Hors ligne

#8 Le 30/07/2008, à 11:33

melyo

Re : Comment utiliser les fontions??

nicolas.sitbon a écrit :
melyo a écrit :

Hum, une fonction ne retourne qu'un seul élément. Dans ton cas, tu devrais créer un type contenant toute ces caractéristiques et ainsi renvoyer qu'une valeur.

Ensuite pour les fonctions, bah voila juste un petit exemple :

//fonction de test, elle aditionne 2 chiffres...
int add(int a, int b)
{
  int c;
  c = a + b;
  return c;

  //ou return a + b; pour etre plus rapide...
}

//programme principal
int main()
{
  //utilisation de la fontion
  int res = add( 1 , 4 );
  printf("res : %d", res);

  printf("res : %d", add(23, 34) );

  return 0;
}

Voila, une fonction te permet de rassembler du code réutilisable, dans l'exemple, la fonction d'addition pourra etre utilisé plusieurs fois, sans avoir besoin de retaper a + b...

plutôt :

C'était juste pour expliquer l'utilisation d'un fonction et son interêt...


"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré

Hors ligne

#9 Le 30/07/2008, à 11:39

nicolas.sitbon

Re : Comment utiliser les fontions??

champoul a écrit :

PS: et tes calculs 6+4-4, c'est inutile hein, mets directement les valeurs, ça sert à rien de faire bosser ton PC pour rien wink

explique je ne comprends pas!

Hors ligne

#10 Le 30/07/2008, à 11:41

nicolas.sitbon

Re : Comment utiliser les fontions??

melyo a écrit :

C'était juste pour expliquer l'utilisation d'un fonction et son interêt...

Je sais, c'est pourquoi j'ai employé le mot "plutôt" et pas "faux".

Hors ligne

#11 Le 30/07/2008, à 11:44

champoul

Re : Comment utiliser les fontions??

nicolas.sitbon a écrit :
champoul a écrit :

PS: et tes calculs 6+4-4, c'est inutile hein, mets directement les valeurs, ça sert à rien de faire bosser ton PC pour rien wink

explique je ne comprends pas!

Je parlais à wHiteweedow, dans le code de son premier post wink

Hors ligne

#12 Le 30/07/2008, à 13:10

nicolas.sitbon

Re : Comment utiliser les fontions??

champoul a écrit :
nicolas.sitbon a écrit :
champoul a écrit :

PS: et tes calculs 6+4-4, c'est inutile hein, mets directement les valeurs, ça sert à rien de faire bosser ton PC pour rien wink

explique je ne comprends pas!

Je parlais à wHiteweedow, dans le code de son premier post wink

OK autant pour moi smile

Hors ligne

#13 Le 30/07/2008, à 17:11

wHiteweedow

Re : Comment utiliser les fontions??

melyo a écrit :

Hum, une fonction ne retourne qu'un seul élément. Dans ton cas, tu devrais créer un type contenant toute ces caractéristiques et ainsi renvoyer qu'une valeur.

Ensuite pour les fonctions, bah voila juste un petit exemple :

//fonction de test, elle aditionne 2 chiffres...
int add(int a, int b)
{
  int c;
  c = a + b;
  return c;

  //ou return a + b; pour etre plus rapide...
}

//programme principal
int main()
{
  //utilisation de la fontion
  int res = add( 1 , 4 );
  printf("res : %d", res);

  printf("res : %d", add(23, 34) );

  return 0;
}

Voila, une fonction te permet de rassembler du code réutilisable, dans l'exemple, la fonction d'addition pourra etre utilisé plusieurs fois, sans avoir besoin de retaper a + b...

Eeh ben merci smile Mais pourquoi %d au lieu de %ld?



champoul a écrit :

tes calculs 6+4-4, c'est inutile hein, mets directement les valeurs, ça sert à rien de faire bosser ton PC pour rien wink

Je trouve que c'est toujours mieux avoir des armes "uniques" pour faire un jeu plus original smile



champoul a écrit :

Déclare une structure comme ça:

struct weapon {
      int AttackMin;
      int AttackMax;
      char* Type;
      int Level;
};

Tu déclares une variable de ce type de cette façon

struct weapon testweapon;

Et tu accèdes aux attributs decette façon:

testweapon.level = 12;

Et comme ça tu pourras retourner tout d'un coup !
Mais bon, c'est du C++ ton truc, il doit y avoir un moyen de déclarer une nouveau type d'objet autrement que par des struct, mais j'y connais rien en C++ hmm

Alors vers la fin de la fonction, je stocke toutes mes variables dans une seule variables et je fais mon return big_smile
En plus mon code sera plus "clean". Eeh et avec ceci peut-t'on stocker des variables en chaînes de caractères?

Bon j'ai besoin de votre avis..
Dans le jeux, il y a plusieurs types d'armes, actuellement six (Incluant une cuillère) Serais-t'il mieux de faire une autre fonction avec des condition pour sortir le nom de l'arme à partir de son chiffre ou de tout-de-suite stocker dans une variable char?

Ben merci beaucoup beaucoup de votre aide smile

Dernière modification par wHiteweedow (Le 30/07/2008, à 17:40)

Hors ligne

#14 Le 30/07/2008, à 17:43

wHiteweedow

Re : Comment utiliser les fontions??

struct weapon {
      int AttackMin;
      int AttackMax;
      char* Type;
      int Level;
};

Cela doit-t'il être dans une fonction ou seul?

Hors ligne

#15 Le 30/07/2008, à 17:45

nicolas.sitbon

Re : Comment utiliser les fontions??

wHiteweedow a écrit :
struct weapon {
      int AttackMin;
      int AttackMax;
      char* Type;
      int Level;
};

Cela doit-t'il être dans une fonction ou seul?

En dehors de toute fonction.

Hors ligne

#16 Le 30/07/2008, à 17:56

wHiteweedow

Re : Comment utiliser les fontions??

Oké merci big_smile

Hors ligne

#17 Le 30/07/2008, à 19:07

Link31

Re : Comment utiliser les fontions??

champoul a écrit :

PS: et tes calculs 6+4-4, c'est inutile hein, mets directement les valeurs, ça sert à rien de faire bosser ton PC pour rien wink

Ça ne coûte rien à l'exécution, et c'est un coût infime à la compilation. Mais ça serait mieux de mettre ces constantes dans les champs d'une structure (constante).

Hors ligne

#18 Le 30/07/2008, à 19:10

wHiteweedow

Re : Comment utiliser les fontions??

Quoi cela change t'il ?

Je suis "obligé" d'utiliser des variables constantes et non une multiplication d'un nombre aléatoire pour générer les armes?
Je ne vais pas utiliser mon programme sur un Amstrad hen,, lol lol

Hors ligne

#19 Le 30/07/2008, à 21:20

wHiteweedow

Re : Comment utiliser les fontions??

Bon, j'ai réarrangé mon code avec ce que vous m'avez dit.
Dites-moi si c'est correct et ensuite, je veux savoir comment retourner ma structure à main.

struct Weapon {
      int AttackMin;
      int AttackMax;
      char* Type;
      int Level;
};

long ddNewWeapon(char monsterLevel)
{
   while(newItemCheck == 1)
   {
      //Création et formatage des variables
      struct Weapon newWeapon;

      //Génération du type d'arme
      newWeapon.Type = (rand() % (6 - 1 + 1)) + 1;
      //Calcul du level minimum de l'arme
      newWeapon.Level = monsterLevel - (rand() % (6 - 2 + 2)) + 2;

      //Calcul de la force d'attaque de l'arme générée
      if(newWeapon.Type == 6) //Axe
      {
         newWeapon.AttackMax = newWeapon.Level * (rand() % (7 - 5 + 5)) + 5;
         newWeapon.AttackMin = newWeapon.Level * (rand() % (4 - 3 + 3)) + 3;
      }
      else if(newWeapon.Type == 5) //Mace
      {
         newWeapon.AttackMax = newWeapon.Level * (rand() % (7 - 6 + 6)) + 6;
         newWeapon.AttackMin = newWeapon.Level * (rand() % (5 - 4 + 4)) + 4;
      }
      else if(newWeapon.Type == 4) //Sword
      {
         newWeapon.AttackMax = newWeapon.Level * (rand() % (6 - 4 + 4)) + 4;
         newWeapon.AttackMin = newWeapon.Level * (rand() % (2 - 1 + 1)) + 1;
      }
      else if(newWeapon.Type == 3) //Dagger
      {
         newWeapon.AttackMax = newWeapon.Level * (rand() % (4 - 2 + 2)) + 2;
         newWeapon.AttackMin = newWeapon.Level * (rand() % (2 - 1 + 1)) + 1;
      }
      else if(newWeapon.Type == 2) //Spear
      {
         newWeapon.AttackMax = newWeapon.Level * (rand() % (4 - 3 + 3)) + 3;
         newWeapon.AttackMin = newWeapon.Level * 2;
      }
      else if(newWeapon.Type == 1) //Spoon (N'attaque pas)
      {
         newWeapon.AttackMax = 0; newWeapon.AttackMin = 0;
      }

      //Validation de l'arme générée : Buggée ou pas ?
      if(newWeapon.AttackMin >= newWeapon.AttackMax && newWeapon.Level < 1)
      {
         printf("%s", errorCreateWeapon);
      }
      else
      {
         newItemCheck = 1;
         /*Arme correctement générée.
         Cet endroit pourrais être utilisée pour "dropper" l'objet.
         L'idéal serais d'inclure une fonction de droppage */
      }
   }
   return newWeapon;
}

Hors ligne

#20 Le 30/07/2008, à 22:40

melyo

Re : Comment utiliser les fontions??

Ta fonction retourne une variable de type Weapon maintenant, non plus un long. J'ai dis %d, mais le C est loin pour moi, dans mon exemple, je m'attendais pas à ce que les gens regarde l'interieur, mais plutot la déclaration et son utilisation smile

Pour l'utilisation bah rien de plus simple :

int main()
{
  Weapon w = ddnewWeapon( 'z' );
  return 0;
}

C'est vraiment une utilisation simple, et je pense qu'il vaudrait mieux renvoyer un pointeur...

Dernière modification par melyo (Le 30/07/2008, à 22:44)


"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré

Hors ligne

#21 Le 31/07/2008, à 03:48

wHiteweedow

Re : Comment utiliser les fontions??

Weapon w = ddnewWeapon( 'z' );

Pourquoi w et z ?

Sinon, merci smile

Dernière modification par wHiteweedow (Le 31/07/2008, à 03:52)

Hors ligne

#22 Le 31/07/2008, à 08:10

nicolas.sitbon

Re : Comment utiliser les fontions??

w sera le nom de ta variable de type Weapon et 'z' car dans le prototype de ta fonction ddnewWeapon, tu reçois un caractère, il a mis 'z' mais ça aurait pu être n'importe quel autre caractère.

Hors ligne

#23 Le 31/07/2008, à 08:21

champoul

Re : Comment utiliser les fontions??

wHiteweedow a écrit :
champoul a écrit :

tes calculs 6+4-4, c'est inutile hein, mets directement les valeurs, ça sert à rien de faire bosser ton PC pour rien wink

Je trouve que c'est toujours mieux avoir des armes "uniques" pour faire un jeu plus original smile

Non mais ça je suis d'accord, mais que tu mettes (6+4-4) ou 6, ton arme sera exactement la même !

Hors ligne

#24 Le 31/07/2008, à 23:55

wHiteweedow

Re : Comment utiliser les fontions??

Non mais !! big_smile

Examine un peu plus:

(rand() % (6 - 2 + 2)) + 2;

As-tu remarqué le rand() % ?

Sur le site du zér0 c'est la seule manière de créer un nombre aléatoire que je connaisse...
J'ai essayé comme cela

(rand() % (6)) + 2;

Mais ça ne marche pas, je prends donc l'a manière que j'utilise en ce moment. wink

Hors ligne

#25 Le 31/07/2008, à 23:58

Link31

Re : Comment utiliser les fontions??

Ne t'inquiète pas, je suis sûr qu'après une bonne nuit de sommeil ces deux lignes strictement équivalentes recommenceront à se comporter de la même façon lol

Dernière modification par Link31 (Le 01/08/2008, à 00:07)

Hors ligne