Types énumérés = enfer [Résolu]

Signaler
Messages postés
2
Date d'inscription
vendredi 25 novembre 2005
Statut
Membre
Dernière intervention
17 décembre 2005
-
Messages postés
2
Date d'inscription
vendredi 25 novembre 2005
Statut
Membre
Dernière intervention
17 décembre 2005
-
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

Messages postés
194
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
10 octobre 2006
2
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;
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
2
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...
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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;
Messages postés
194
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
10 octobre 2006
2
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... :)
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
11
-->whiteHippo tu livres la loupe avec ton code?? heureusement qu'il y a ctrl+roulette pour sauver la mise!!

@+

jlen
Messages postés
2
Date d'inscription
vendredi 25 novembre 2005
Statut
Membre
Dernière intervention
17 décembre 2005

merci mais j'comprend rien parce que j'suis en prog console :(

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