#1 Le 30/07/2008, à 05: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 . 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
Dernière modification par wHiteweedow (Le 30/07/2008, à 05:56)
Hors ligne
#2 Le 30/07/2008, à 06: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, à 07: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++
Hors ligne
#4 Le 30/07/2008, à 08:08
- slasher_fun
Re : Comment utiliser les fontions??
Vi, faut faire des classes plutôt que des struct
Hors ligne
#5 Le 30/07/2008, à 08:54
- nicolas.sitbon
Re : Comment utiliser les fontions??
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++
Je ne vois pas de C++ dans son code!
Hors ligne
#6 Le 30/07/2008, à 09:02
- nicolas.sitbon
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...
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, à 09:38)
Hors ligne
#7 Le 30/07/2008, à 10:32
- champoul
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++
Je ne vois pas de C++ dans son code!
Putain c'est juste ce sont les "new*" qui m'ont fait pensé ça au premier coup d'oeil Et puis à 8H j'ai un peu la tête dans le pâté
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é Et si vraiment il veut continuer en C, il peut utiliser ce que j'ai mis dans mon post
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
Dernière modification par champoul (Le 30/07/2008, à 10:34)
Hors ligne
#8 Le 30/07/2008, à 10:33
- melyo
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 :
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, à 10:39
- nicolas.sitbon
Re : Comment utiliser les fontions??
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
explique je ne comprends pas!
Hors ligne
#10 Le 30/07/2008, à 10:41
- nicolas.sitbon
Re : Comment utiliser les fontions??
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, à 10:44
- champoul
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
explique je ne comprends pas!
Je parlais à wHiteweedow, dans le code de son premier post
Hors ligne
#12 Le 30/07/2008, à 12:10
- nicolas.sitbon
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
explique je ne comprends pas!
Je parlais à wHiteweedow, dans le code de son premier post
OK autant pour moi
Hors ligne
#13 Le 30/07/2008, à 16:11
- wHiteweedow
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...
Eeh ben merci Mais pourquoi %d au lieu de %ld?
tes calculs 6+4-4, c'est inutile hein, mets directement les valeurs, ça sert à rien de faire bosser ton PC pour rien
Je trouve que c'est toujours mieux avoir des armes "uniques" pour faire un jeu plus original
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++
Alors vers la fin de la fonction, je stocke toutes mes variables dans une seule variables et je fais mon return
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
Dernière modification par wHiteweedow (Le 30/07/2008, à 16:40)
Hors ligne
#14 Le 30/07/2008, à 16: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, à 16:45
- nicolas.sitbon
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?
En dehors de toute fonction.
Hors ligne
#16 Le 30/07/2008, à 16:56
- wHiteweedow
Re : Comment utiliser les fontions??
Oké merci
Hors ligne
#17 Le 30/07/2008, à 18:07
- Link31
Re : Comment utiliser les fontions??
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
Ç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, à 18: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
Hors ligne
#19 Le 30/07/2008, à 20: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, à 21: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
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, à 21:44)
"L'évasion n'est jamais qu'une construction de l'esprit" - Léo Ferré
Hors ligne
#21 Le 31/07/2008, à 02:48
- wHiteweedow
Re : Comment utiliser les fontions??
Weapon w = ddnewWeapon( 'z' );
Pourquoi w et z ?
Sinon, merci
Dernière modification par wHiteweedow (Le 31/07/2008, à 02:52)
Hors ligne
#22 Le 31/07/2008, à 07: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, à 07:21
- champoul
Re : Comment utiliser les fontions??
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
Je trouve que c'est toujours mieux avoir des armes "uniques" pour faire un jeu plus original
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, à 22:55
- wHiteweedow
Re : Comment utiliser les fontions??
Non mais !!
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.
Hors ligne
#25 Le 31/07/2008, à 22: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
Dernière modification par Link31 (Le 31/07/2008, à 23:07)
Hors ligne