Mini-projet n°1 : Nombre secret
Rappel de l'énoncé
- L'interface est, pour cette fois, imposée. Elle doit être similaire à ceci (seuls les textes sont à respecter) :
- Le bouton « Nouveau nombre secret » fixe un nombre secret entier entre 0 et 100. Ce nombre est choisi par
l'ordinateur, et n'est ni demandé ni montré à l'utilisateur.
- Le bouton « Proposer un nombre » demande un nombre entier à l'utilisateur. Si le nombre entier n'est pas compris
entre 0 et 100, l'utilisateur en est informé. Sinon, la position par rapport au nombre secret est indiquée :
« Le nombre secret est inférieur/supérieur à (le nombre proposé par l'utilisateur) »
- Lorsque l'utilisateur trouve le nombre secret, un message l'en informe : « bravo, le nombre secret était
(indiquer le nombre secret)
», puis le nombre secret est changé et l'utilisateur est informé de ce changement et invité à rejouer : « Nombre secret
changé, vous pouvez rejouer ».
Ce mini-projet étant le premier, il est possible que vous ayez du mal à le réaliser. Dans ce cas, n'hésitez pas dans ce cas à
consulter les indications, puis le guide pas à pas, ou en dernier recours à télécharger le mini-projet terminé (auquel vous avez
accès même si vous avez la version téléchargée du site).
Rappels et indications indispensables :
- Pour pouvoir réagir au clic sur un bouton, il faut faire un double-clic dessus dans Delphi, puis écrire les instructions dans la
procédure qui est créée à cet effet (Ecrire la procédure et la déclarer sans passer par cette étape du double-clic ne suffit en
aucun cas).
Indications
Indications générales
- Commencez par créer l'interface de votre projet : il faudra dimensionner correctement la fiche principale, y placer deux boutons,
puis les dimensionner à leur tour. N'oubliez pas de changer les textes affichés.
- Le nombre secret devra être mis en mémoire. Pour cela, une variable sera nécessaire. Le nombre secret étant un nombre entier
entre 0 et 100, le type de cette variable peut être 'byte' ou 'integer' par exemple (on préférera alors 'integer'). La variable ne
pourra pas être locale à une procédure car serait dans ce cas effacée à la fin de l'exécution de la procédure, mais devra être au
contraire globale : accessible dans toute l'unité principale, ou plutôt dans son implémentation.
- Un clic sur le bouton « Nouveau nombre secret » changera la valeur de cette variable. On utilisera les fonctions
'Trunc' et 'Random'.
- Un clic sur le bouton « Proposer un nombre » effectuera les tâches suivantes dans l'ordre :
- Demande d'un nombre sous forme de texte
- Conversion de ce texte en nombre
- Suivant trois cas : inférieur, supérieur ou égal, la réaction sera différente :
si le nombre proposé est différent, on dit s'il est inférieur ou supérieur au nombre secret, sinon, on félicite l'utilisateur, puis
on fixe un nouveau nombre comme avec l'autre bouton, et on en informe l'utilisateur.
Indications avancées
Solution pas à pas
Cette solution guidée pas à pas vous permettra de construire le projet entier. Rappelez-vous que la version de Delphi employée ici
peut différer de la votre, mais que cela n'a normalement que des conséquences mineures.
- Création du projet
- Sous Delphi, créez un nouveau projet à l'aide de la commande 'Nouveau Projet' ou 'Nouvelle Application' du menu 'Fichier'.
- Enregistrez le projet par la commande 'Enregistrer Tout' du menu Fichier. Choisissez de préférence un répertoire créé pour cette
occasion. Un nom pour le projet (fichier .dpr) vous sera demandé, entrez « NombreSecret ». Un nom d'unité (.pas) sera
également demandé pour stocker l'unique fiche et son unité associée : nommez-la « Principale » (et pensez à toujours
donner à vos unités des noms significatifs qui soient également des identificateurs)
- Création de l'interface
- Affichez la fiche principale : au besoin, sélectionnez, dans la liste des unités, l'unité 'Principale' et appuyez sur F12 pour
passer à sa fiche associée.
- Une fois la fiche visible, trouvez, dans la barre des composants, le bouton 'Button'. Le fait de cliquer sur ce bouton puis sur
la fiche place un 'Button' (un bouton, donc), sur la fiche à l'endroit où vous cliquez. Placez ainsi deux boutons sur la fiche.
- Le moment est venu de placer tout cela : il va falloir utiliser soit la souris, soit l'inspecteur d'objets. Si vous voulez
utiliser la souris, rappelez-vous que les actions que vons effectuez agissent sur le composant sélectionné (la fiche et chaque
bouton, je le rappelle, sont des composants), il vous faudra donc par exemple sélectionner un bouton (en cliquant une seule fois
dessus) avant de changer sa position ou ses dimensions à l'aide de la souris.
- En ce qui concerne l'inspecteur d'objets, affichez-le au besoin à l'aide de la touche F11. Le tableau suivant donne les
propriétés à changer ainsi que les nouvelles valeurs à donner à ces propriétés ainsi qu'une brève explication (Vous devez savoir
utiliser l'inspecteur d'objets au moins de manière rudimentaire si vous avez suivi le cours normal du guide).
Fiche |
Caption |
Le Nombre Secret |
Permet de choisir le texte de titre de la fenêtre |
Height |
148 |
Donne la hauteur de la fiche en pixels |
Width |
193 |
Donne la largeur de la fiche en pixels |
Bouton « Nouveau nombre secret » |
Caption |
Nouveau nombre secret |
Fixe le texte qui apparait sur le bouton |
Height |
25 |
Hauteur du bouton |
Left |
24 |
Décalage par rapport au bord gauche de la fiche |
Top |
24 |
Décalage par rapport au haut de la fiche |
Width |
137 |
Largeur du bouton |
Bouton « Proposer un nombre » |
Caption |
Proposer un nombre |
Fixe le texte qui apparait sur le bouton |
Height |
25 |
Hauteur du bouton |
Left |
24 |
Décalage par rapport au bord gauche de la fiche |
Top |
72 |
Décalage par rapport au haut de la fiche |
Width |
137 |
Largeur du bouton |
- Fonctionnement du bouton « Nouveau nombre secret »
Maintenant que l'interface est terminée, concentrons-nous sur le code Pascal.
- Un clic sur le premier bouton doit déclencer une action. Pour cela, le seul moyen que vous connaissiez consiste à double-cliquer
sur le bouton sous Delphi, puis à écrire des instructions dans la procédure qui est alors générée (ceci est expliqué en détail dans
un chapitre du guide). Double-cliquez donc sur le bouton « Nouveau nombre secret ». Une procédure est générée, prète à
recevoir nos instructions.
- Le principe ici est de fixer une nouvelle valeur, donc de changer la valeur d'une variable. Cette variable, nous pourrions
la déclarer dans la procédure qui vient d'être générée, mais alors elle serait non seulement inaccessible depuis d'autres procédures,
mais aussi "oubliée" lorsque la procédure se termine (elle n'existerait que pendant l'exécution de la procédure). Il nous faut donc
déclarer cette variable dans un endroit plus accessible. Parmi les possibilités, l'interface ou l'implémentation de l'unité
'Principale', ou le fichier-projet. L'endroit le plus indiqué est au début de l'implémentation de l'unité 'Principale' car alors la
variable sera accessible à toute procédure qui suivra. En outre, le fichier-projet est à exclure dans la grande majorité des cas,
et l'interface est inadaptée car la variable n'a pas à être accessible depuis d'autres unités. Déclarez donc une variable 'NbSecret'
de type 'Integer' au début de l'implémentation de l'unité (c.f. code source à la fin de cette solution).
- Quant à la procédure proprement dite, il va suffir de générer un nombre aléatoire entre 0 et 100, opération que l'on fait en
deux temps (mais en une seule instruction) : on génère un nombre aléatoire entre 0 (inclus) et 101 (exclus), puis ce nombre à
virgule est tronqué pour donner un entier entre 0 et 100. Enfin, le résultat de ces deux opérations est affecté à 'NbSecret'. Voici
l'instruction à inscrire :
NbSecret := Trunc(Random(101));
- Fonctionnement du bouton « Proposer un nombre »
Maintenant, il ne nous reste plus qu'à faire fonctionner le deuxième bouton, c'est un peu plus compliqué.
- Créez la procédure de réponse au clic sur ce bouton, comme pour le précédent.
- On va devoir ici dans un premier temps demander un nombre à l'utilisateur. Il est impossible de lui demander directement un
entier à ce stade du guide, nous devrons donc passer par une chaîne de caractères et une conversion. Il va donc nous falloir deux
variables : une de type chaîne qui stockera la réponse de l'utilisateur, et une autre de type entier pour stocker la réponse
convertie (ici encore on supposera l'utilisateur assez gentil pour ne donner que des nombres). Voici la déclaration des deux
variables locales à la procédure :
var
NbTest: Integer;
Reponse: string;
- Le questionnement de l'utilisateur passera comme d'habitude par un appel à 'InputQuery'. Il faudra, comme à chaque fois,
lui fournir une variable dont la valeur sera utilisée comme réponse suggèrée. La variable 'Reponse' servira à cela et sera
initialisée avant utilisation (il faut toujours initialiser les variables avant utilisation). Une instruction convertira ensuite
la réponse en nombre. Voici les trois premières instructions de la procédure, qui effectue les tâches décrites ci-dessus :
Reponse := '0';
InputQuery('Proposez un nombre', 'Valeur :', Reponse);
NbTest := StrToInt(Reponse);
- Plusieurs cas sont alors à envisager : soit l'utilisateur à entré un nombre inférieur ou supérieur au nombre secret, et on
l'en informe, soit il a trouvé le nombre secret et davantage de choses devront être faites. Voici la structure du bloc 'if' qui
examinera les cas :
if NbTest < NbSecret then
ShowMessage('Le nombre secret est supérieur à ' + IntToStr(NbTest))
else if NbTest > NbSecret then
ShowMessage('Le nombre secret est inférieur à ' + IntToStr(NbTest))
else
begin
...
end;
Vous noterez que dans les deux premiers cas, une simple instruction suffit et rappelle à l'utilisateur sa proposition.
- Le dernier cas nécessite un bloc d'instructions. En effet, il va falloir féliciter l'utilisateur, fixer un nouveau nombre
secret, et en avertir l'utilisateur. Voici les trois instructions à inscrire dans ce bloc (vous remarquerez que la deuxième est
identique à celle utilisée par l'autre bouton) :
ShowMessage('bravo, le nombre secret était ' + IntToStr(NbSecret));
NbSecret := Trunc(Random(101));
ShowMessage('Nombre secret changé, vous pouvez rejouer');
Le projet est maintenant complet, vous pouvez le compiler et le tester à loisir. Voici le code source complet de
l'implémentation de l'unité 'Principale' :
implementation
var
NbSecret: Integer;
procedure TForm1.Button1Click(Sender: TObject);
begin
NbSecret := Trunc(Random(101));
end;
procedure TForm1.Button2Click(Sender: TObject);
var
NbTest: Integer;
Reponse: string;
begin
Reponse := '0';
InputQuery('Proposez un nombre', 'Valeur :', Reponse);
NbTest := StrToInt(Reponse);
if NbTest < NbSecret then
ShowMessage('Le nombre secret est supérieur à ' + IntToStr(NbTest))
else if NbTest > NbSecret then
ShowMessage('Le nombre secret est inférieur à ' + IntToStr(NbTest))
else
begin
ShowMessage('bravo, le nombre secret était ' + IntToStr(NbSecret));
NbSecret := Trunc(Random(101));
ShowMessage('Nombre secret changé, vous pouvez rejouer');
end;
end;
end.
Enfin, en guise de conclusion, voici une liste de choses qui pourraient être améliorées dans ce projet. Je ne suis pas assez bête
pour dire que cette liste est complète, mais elle donne quelques idées qui feront l'objet de recherches par les plus courageux.
- Si l'utilisateur entre un nombre qui n'est pas entre 0 et 100, rien ne lui est repproché, ce serait mieux.
- La limite 0 est peu contestable, par contre, la valeur 100 pourrait être fixée par l'utilisateur au moyen d'une question posée
par un troisième bouton (il faudrait dans ce cas recalculer un nouveau nombre secret).
- L'instruction qui initialise le nombre secret est répètée deux fois. Dans ce genre de cas, il est préférable d'en faire une
procédure ou une fonction séparée, qui sera appelée en lieu et place de l'instruction.
- L'utilisateur pourrait avoir un nombre limité d'essais, et pourrait aussi avoir un score.
Téléchargement
Code source du projet : 01_nombre_secret.zip
© Copyright 2000 par Frédéric BEAULIEU. Tous droits de reproduction réservés.