Types énumérés = enfer

Résolu
cs_marex Messages postés 2 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 17 décembre 2005 - 26 nov. 2005 à 18:05
cs_marex Messages postés 2 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 17 décembre 2005 - 17 déc. 2005 à 21:46
Je veut faire un jeu console pour égayer la classe pendant les temps morts du cours de programmation mais je ne comprend rien au type énuméré(je sait juste que c'est plus facile à gérer un gros programme avec ce type).

Exemple:
Type classes(guerrier, mage, paladin, assassin);

Var choixclasse : classes;
comment je fait l'interface pour que l'utilisateur choisisse une classe?

6 réponses

Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
26 nov. 2005 à 21:02
Sinon il y a ça (Ressemble un peu à la dernière méthode de f0xi) :

Type
Classes = (guerrier, mage, paladin, assassin);

implementation

evenement OnChange de Combobox :

begin
choixclasse := Classes(combobox1.itemindex);
end;
3
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
27 nov. 2005 à 01:26
Allez on prends les mêmes (ou presque) et on recommence
Un petit condensé de ce que l'on peut faire avec les types énumérés et les ensembles :

// ----- Le type énuméré -----
Type TClassePersonnage ( cpAucune // cpAucune 0 (Valeur par défaut) , cpGuerrier // cpGuerrier cpAucune + 1 1 , cpMage // cpMage cpGuerrier + 1 2
, cpPaladin // etc ...
, cpAssassin


// insérer ici de nouvelles classes
// ...


, cpNOMBRE_CLASSES // cpNOMBRE_CLASSES = 5 ici
) ;


TMultiClassePersonnage = set of TClassePersonnage ;


// ----- Les constantes permettant d'obtenir une chaine -----
// ----- pour chacun des éléments du type énuméré -----
const
S_CLASSE_PERSONNAGE : array[TClassePersonnage] of String =
( 'Aucune'
, 'Guerrier'
, 'Mage'
, 'Paladin'
, 'Assassin'


// insérer ici les chaine pour les nouvelles classes
// ...

, '-- Réservé --'
) ;


type
TJoueurMonoClasse = record
Classe : TClassePersonnage ;
end ;


TJoueurMultiClasses = record
Classes : TMultiClassePersonnage ;
end ;


var
JoueurMonoClasse : TJoueurMonoClasse ;
JoueurMultiClasse : TJoueurMultiClasses ;


// Evenement OnClick du TButton
procedure TForm1.Button1Click(Sender: TObject);
var
i : Integer ;
j : TClassePersonnage ;
S : string ;
begin
ComboBox1.Items.Clear;
ComboBox1.Text := S_CLASSE_PERSONNAGE[cpAucune];


// Un élément du type énuméré peut être vu comme un ordinal ou un entier
// low(TClassePersonnage) renvoit cpAucune
// High(TClassePersonnage) renvoit cpNOMBRE_CLASSES
// Ord(low(TClassePersonnage)) renvoit Ord(cpAucune) soit 0
// Integer(High(TClassePersonnage)) renvoit Integer(cpNOMBRE_CLASSES) soit 5
for I:=Ord(low(TClassePersonnage)) to Integer(High(TClassePersonnage))-1 do
ComboBox1.Items.Add( S_CLASSE_PERSONNAGE[TClassePersonnage(I)] ) ;

// Initialisation
JoueurMonoClasse.Classe := CpAucune ;


// Initialisation, aucunes classes
JoueurMultiClasse.Classes:=[];


// Initialisation, une classe
JoueurMultiClasse.Classes:=[cpAucune];


// Initialisation, plusieurs classes
JoueurMultiClasse.Classes:=[cpMage,cpPaladin,cpAssassin];


// Initialisation, plusieurs classes
JoueurMultiClasse.Classes:=[cpGuerrier..cpPaladin];


// Vérification de la présence d'une classe
if not( cpAssassin in JoueurMultiClasse.Classes ) then
begin
MessageDlg( 'Le Joueur "Multi Classe" n''est pas un assasin', mtInformation,[mbYes],0);
end ;


// Retrait d'une classe
JoueurMultiClasse.Classes:= JoueurMultiClasse.Classes-[cpMage];


// Ajout d'une classe
JoueurMultiClasse.Classes:= JoueurMultiClasse.Classes+[cpAssassin];


// Affichage des informations du joueur Multi classes
S := '' ;
for J:=Low(TClassePersonnage) to High(TClassePersonnage) do
begin
if ( J in JoueurMultiClasse.Classes ) then
S := S + S_CLASSE_PERSONNAGE[J] + ' ' ;
end ;
MessageDlg ( 'Classes du Joueur "Multi Classe" : ' + S
, mtInformation
,[mbYes]
,0
);
end;


// Evenement OnChange du TComboBox
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
JoueurMonoClasse.Classe := TClassePersonnage(ComboBox1.ItemIndex) ;
MessageDlg ( 'La classe du Joueur "Mono Classe" est : '
+ S_CLASSE_PERSONNAGE[JoueurMonoClasse.Classe]
, mtInformation
,[mbYes]
,0
);
end;

Pour l'utilisation, appuyer sur le bouton1 pour charger le combobox et initialiser les variables puis tester la modification de la valeur du combobox.

On remarquera que l'ajout d'une nouvelle classe dans le type énuméré, se fait de façon simple et rapide sans changer par ailleurs le code des boucles, ce qui est un gain de temps non négligeable.

Cordialement.



<HR>



Il existe 10 catégories de personne. Ceux qui connaissent le binaire et les autres...
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
26 nov. 2005 à 19:55
yarrrrr mais non!



les types enumeré c'est super simple!



exemple :



choisissez votre classe :

[tcombobox]



evenement OnChange de Combobox :



begin

case combobox1.itemindex of

0: choixclasse = guerrier;

1: choixclasse = mage;

2: choixclasse = paladin;

3: choixclasse = assassin;

end;

end;



et pouf ...



encore mieux :

type

classes(guerrier, mage, paladin, assassin);



var

choixclasse : classes;



const

tableauclasse : set of classes;



procedure TForm1.Combobox1change(sender : tobject);

begin

choixclasse := tableauclasse[combobox1.itemindex];

end;
0
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
27 nov. 2005 à 14:56
Là j'utiliserai pas les opérateurs arithmétiques...

// Retrait d'une classe
Exclude(cpMage, JoueurMultiClasse.Classes);

// Ajout d'une classe
Include(cpAssassin, JoueurMultiClasse.Classes);

Le code généré est plus performant... :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
27 nov. 2005 à 17:52
-->whiteHippo tu livres la loupe avec ton code?? heureusement qu'il y a ctrl+roulette pour sauver la mise!!

@+

jlen
0
cs_marex Messages postés 2 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 17 décembre 2005
17 déc. 2005 à 21:46
merci mais j'comprend rien parce que j'suis en prog console :(

j'ai quand meme réussi à traduire à peu pres le principe. merci :)
0
Rejoignez-nous