Mini-projet n°1 : Nombre secret

Rappel de l'énoncé

  1. L'interface est, pour cette fois, imposée. Elle doit être similaire à ceci (seuls les textes sont à respecter) :
    Interface à créer sous Delphi
  2. 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.
  3. 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) »
  4. 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 :

Indications
Indications générales
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.

  1. Création du projet
    1. Sous Delphi, créez un nouveau projet à l'aide de la commande 'Nouveau Projet' ou 'Nouvelle Application' du menu 'Fichier'.
    2. 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)

  2. Création de l'interface
    1. 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.
    2. 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.
    3. 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.
    4. 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

  3. Fonctionnement du bouton « Nouveau nombre secret »

    Maintenant que l'interface est terminée, concentrons-nous sur le code Pascal.

    1. 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.
    2. 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).
    3. 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));

  4. 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é.

    1. Créez la procédure de réponse au clic sur ce bouton, comme pour le précédent.
    2. 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;

    3. 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);

    4. 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.
    5. 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

{$R *.DFM}

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.

  1. Si l'utilisateur entre un nombre qui n'est pas entre 0 et 100, rien ne lui est repproché, ce serait mieux.
  2. 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).
  3. 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.
  4. 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.