Associer un chiffre a un mot

Résolu/Fermé
BadGamer Messages postés 517 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 25 décembre 2014 - 13 janv. 2013 à 14:11
BadGamer Messages postés 517 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 25 décembre 2014 - 15 janv. 2013 à 21:04
Bonjour,

.
En gros je voudrais faire l'equivalent d'un tableau mais avec plusieurs mots (je cherche a faire un generateur de classes call of duty aléatoire)
Du genre je fait le tableau "Arme" et apres Arme[0]=mitrailette, arme[1]=sniper etc mais j'arrive pas a mettre plusieurs chaines de caracteres dans un tableau.

J'ai déja une structure "Classe" qui contient :
    char Principale[100];
    char AccessoirePrincipale[100];
    char Secondaire[100];
    char AccesoireSecondaire[100];
    char Atout1[100];
    char Atout2[100];
    char Atout3[100];
    char Mortelle[100];
    char Tactique[100];


Et apres je voudrais faire une classe ou un tableau ou une liste, enfin je ne sait pas quel type de structure utilisé pour générer un nombre et si c'est 0 alors le type est mitrailette, si c'est 2 alors c'est sniper etc, faut que je fasse un if avec chaque nombre ?

Merci d'avance

3 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 14/01/2013 à 12:11
Salut BadGamer,

Quelque chose comme cela devrait t'aider à commencer ce que tu veux faire, si j'ai bien compris (je ne connais pas Call of Duty) :

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <string.h> 

#define MAX_LEN_ST 100 
typedef struct struct_classe 
{ 
 char Principale[MAX_LEN_ST]; 
 char AccessoirePrincipale[MAX_LEN_ST]; 
 char Secondaire[MAX_LEN_ST]; 
 char AccesoireSecondaire[MAX_LEN_ST]; 
 char Atout1[MAX_LEN_ST]; 
 char Atout2[MAX_LEN_ST]; 
 char Atout3[MAX_LEN_ST]; 
 char Mortelle[MAX_LEN_ST]; 
 char Tactique[MAX_LEN_ST]; 
} CLASSE; 

#define NB_MAX_ARMES 2 
char *arme[] = 
{ "mitrailette", "sniper" }; 

int main(void) 
{ 
 /* à appeler une seule fois, pour initialiser le générateur de 
  * nombres aléatoires */ 
 srand(time(NULL )); 

 /* Création d'une "CLASSE" */ 
 CLASSE ma_classe; 
 /* sélection arme Principale */ 
 int principale = rand() % NB_MAX_ARMES; 
 strncpy(ma_classe.Principale, arme[principale], 
   sizeof(ma_classe.Principale)); 
 /* etc. autres sélections */ 

 /* affichage résultat */ 
 printf("Ma classe :\nPrincipale = %s", ma_classe.Principale); 

 /* terminer */ 
 return 0; 
}

Après, si "AccessoirePrincipale" doit contenir un accessoire qui appartient à une "arme" donnée, tu devrais sans doutes créer une structure struct_armes, qui contient les différentes armes, le nombre d'accessoires, et la liste de leurs accessoires sous la forme d'un tableau de chaînes de caractères.

Si l'arme Principale ne peut être la même que l'arme Secondaire, tu dois effectuer une vérification du nombre aléatoire tiré.

etc., selon les règles du système de création de classes.


Dal
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
14 janv. 2013 à 21:16
C'est bien d'utiliser strncpy(), mais il ne faut pas oublier de mettre explicitement le '\0' à la fin de la nouvelle chaîne.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
15 janv. 2013 à 09:47
Fiddy a raison, c'est indispensable lorsqu'on ne maîtrise pas la longueur des chaînes copiées.

Dans le cas présent, on sait que les "armes" (qui sont codées en dur dans le tableau), sont des chaînes dont la taille ne dépassent pas 100 octets, y compris le caractère \0, donc 99 caractères, le caractère \0 est déjà copié, et une nouvelle copie est redondante.

C'est la supposition (implicite) que j'ai faite en me disant que BadGamer avait vu large en dimensionnant à 100 ses chaînes. Mais Fiddy a sans doutes raison qu'une ceinture de sécurité est préférable à un grand choc, au cas où un jour tu mettrais dans ton tableau une "méga-super-arme-absolue-de-la-destruction-de-la-mort-qui-tue-apocalyptique-qui-fait-vraiment-peur-et-qui-fait-très-mal" :-D (ou si les armes sont saisies par l'utilisateur à l'avenir).

Alors, on peut effectivement faire dans ce cas :

strncpy(ma_classe.Principale, arme[principale],
			sizeof(ma_classe.Principale));
ma_classe.Principale[sizeof(ma_classe.Principale)] = '\0';

Même si la chaîne est déjà terminée avant, cela ne fait rien, et le code est plus sûr pour l'avenir.


Dal
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
15 janv. 2013 à 19:45
Rien à redire :-)
C'est effectivement un réflexe à prendre lorsque l'on utilise strncpy().
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
14 janv. 2013 à 21:19
Quand tu parles de classe, tu entends les classes en C++ ?
Car les classes n'existent pas en C. Dans ce cas, il faut utiliser les structures comme fait dans le code de [Dal]
0
BadGamer Messages postés 517 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 25 décembre 2014 132
15 janv. 2013 à 18:33
Je parle de structure je n'ai pas encore vu le C++
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
15 janv. 2013 à 19:46
D'accord, dans ce cas, oublie le mot "classe" ^^. En programmation, "classe" désigne un concept bien précis en programmation orientée objet.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
15 janv. 2013 à 19:50
En fait, je pense que ce mot vient de son jeu en ligne, où ils parlent de classes de personnages :

https://callofduty.fandom.com/wiki/Create-A-Class


Dal
0
BadGamer Messages postés 517 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 25 décembre 2014 132
15 janv. 2013 à 19:52
Ah mais oui quand je dit une classe je parle du jeu désolé !!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
15 janv. 2013 à 19:56
Au temps pour moi alors ^^.
0
BadGamer Messages postés 517 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 25 décembre 2014 132
15 janv. 2013 à 18:37
J'ai mis 100 pour ne pas me prendre la tete, avec 30 ça devrait etre bon mais bon voila on est pas a quelques octets ^^
Le passage que je ne comprend pas c'est:

 int principale = rand() % NB_MAX_ARMES; 
 strncpy(ma_classe.Principale, arme[principale], 
   sizeof(ma_classe.Principale)); 
 /* etc. autres sélections */ 


Car le rand() % NB_MAX_ARMES; vas juste générer un nombre aléatoire et apres justement ce que je ne sait pas c'est comment associer ce nombre aléatoire au mot...pourrais tu detailler juste ce passage stp car le reste c'est bon je maîtrise c'est juste l'association du nombre aléatoire a une arme =)
Merci d'avance
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 15/01/2013 à 19:43
Bon, on va décomposer.

1.

char *arme[] =  
{ "mitrailette", "sniper" }; 

Signifie que arme[0] contient "mitrailette" et arme[1] contient "sniper".

2.

Comme on a définit NB_MAX_ARMES à 2

int principale = rand() % NB_MAX_ARMES;

génère un nombre aléatoire de 0 à NB_MAX_ARMES - 1, donc, ici, de 0 à 1, et place ce nombre dans la variable "principale".

3.

arme[principale]

renvoie donc à l'arme choisie aléatoirement.

4.

strncpy(ma_classe.Principale, arme[principale],  
   sizeof(ma_classe.Principale));

copie la chaîne de caractères dans ma_classe.Principale

5.

ma_classe.Principale[sizeof(ma_classe.Principale)] = '\0';

(re-)termine la chaîne si cela était nécessaire (cf. commentaire de fiddy).


Dal
0
BadGamer Messages postés 517 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 25 décembre 2014 132
Modifié par BadGamer le 15/01/2013 à 19:44
Ah d'accord mais j'avais essayé un truc du genre char *arme[] =
{ "mitrailette", "sniper" }; sauf que je n'arrivais pas a mettre plusieurs mot dans un tableau ! Car une chaine est elle meme un tableau en quelque sorte...on fait un tableau 2D la ?
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
15 janv. 2013 à 20:04
char *arme[] définit un tableau de pointeurs sur des chars (lis la déclaration de droite à gauche).

Les indices permettent, en fait, de passer d'un pointeur à un autre.

Ce n'est pas réellement un tableau 2D de ce point de vue là, car le tableau arme ne contient que des pointeurs.

Certes, les pointeurs pointent vers des espaces mémoires alloués par le compilateur où se trouvent des char terminés par \0, alors, j'imagine qu'on peut en discuter :-)


Dal
0
BadGamer Messages postés 517 Date d'inscription mercredi 24 novembre 2010 Statut Membre Dernière intervention 25 décembre 2014 132
15 janv. 2013 à 21:04
Ah d'accord super c'est cette notion que je ne gere pas ! Je vais aller regarder deux trois cours merci =)
0