Tous droits réservés

TP : Plus ou moins

Jeunes gens, il est temps de mettre en pratique ce que vous avez appris jusqu’à présent !

Ce TP est récurrent dans de nombreux tutoriels, mais c’est un bon exercice qui vous fait travailler les bases. Nous allons faire le jeu du "plus ou moins". Certes ce n’est certainement pas une application commune du langage COBOL, mais c’est plus amusant que de vous demander une application de comptabilité et de calculer je-ne-sais-quoi. :-°

Préparation

Pré-requis

Certaines notions sont indispensables pour réussir ce TP, si vous n’êtes pas sûrs de vous, n’hésitez pas à revenir quelques chapitres en arrière !

Nous allons donc avoir besoin :

  • de connaitre la syntaxe de base ;
  • d’avoir bien compris les conditions ;
  • et de savoir utiliser les boucles !

Consignes

Pour ceux qui ne connaissent pas déjà le principe, voilà ce que vous devez faire.

On demande à notre joueur d’entrer un chiffre entre 1 et 100, et l’objectif est que le joueur trouve le chiffre fixé de manière aléatoire par l’ordinateur. Pour l’aider, on va lui indiquer si les chiffres qu’il tape au fur et à mesure sont inférieurs ou supérieurs au nombre à trouver.

Si le chiffre n’est pas le bon, on lui redemande jusqu’à qu’il le trouve. Et quand il l’aura trouvé, on lui affichera un message de félicitations pour lui dire qu’il a gagné la partie.

Dernières astuces

Il vous manque encore un petit quelque chose pour arriver à faire le TP, on va voir comment générer un nombre aléatoire. Dans cet exemple, on génère un nombre entre 1 et 100 :

      * Ce code se place dans PROCEDURE DIVISION.
      * seed est une variable au format suivant : 9(8)
      MOVE FUNCTION CURRENT-DATE(9:8) TO seed.
      COMPUTE nbAleatoire = FUNCTION RANDOM (seed) * 100 + 1.

La fonction RANDOM génère un nombre entre 0 et 1 exclu. On a également besoin d’un paramètre pour avoir un nombre vraiment aléatoire. Ensuite on multiplie ce nombre par 100, ce qui donne un chiffre entre 0 et 99, alors on ajoute 1 pour avoir un chiffre entre 1 et 100.

Aide supplémentaire

Si jamais vous pensez avoir bien compris ce qui vous est demandé, vous pouvez ne pas lire cette partie et vous lancer dans le code !

Sinon je vais vous aider à définir ce qu’il est nécessaire d’avoir dans votre code tout en restant assez bref, mais encore une fois, essayez de faire sans !

Vous avez craqué ? Bon je vais essayer de vous guider :

  • Deux variables entières, une qui stock le nombre aléatoire et l’autre le nombre entré par l’utilisateur
  • Au minimum 4 plages dont une de saisie pour récupérer l’entrée de l’utilisateur
  • Une fois le nombre entré, on le compare à celui de l’ordinateur et selon le cas on informe l’utilisateur
  • Il faut aussi une boucle pour redemander plusieurs fois à l’utilisateur de taper un nombre s’il se trompe

Il n’y a vraiment rien d’exceptionnel mais si vous n’avez toujours aucune idée de ce qu’il faut faire, je vous conseille de relire les parties qui vous posent problème. ^^

Correction

Vous avez fini ? Vous êtes sûrs ? Attention ne trichez pas, ce n’est pas dans votre intérêt. ;)

Je vais vous proposer une des solutions possibles afin de réaliser notre mini-jeu.

      IDENTIFICATION DIVISION.
      PROGRAM-ID. PlusOuMoins.

      DATA DIVISION.
      WORKING-STORAGE SECTION.

      77 seed PIC 9(8) VALUE 0.
      77 nbAleatoire PIC 999.
      77 nbEntree PIC 999.

      SCREEN SECTION.

      1 pla-titre.
          2 BLANK SCREEN.
          2 LINE 2 COL 15 VALUE 'Jeu du plus et du moins !'.

      1 pla-plus.
          2 LINE 4 COL 5 VALUE 'C''est plus !'.

      1 pla-moins.
          2 LINE 4 COL 5 VALUE 'C''est moins'.

      1 pla-trouve.
          2 LINE 4 COL 5 VALUE 'Bravo ! Vous avez trouve !'.

      1 pls-nb.
          2 LINE 6 COL 5 VALUE 'Veuillez entrer un nombre : '.
          2 PIC zzz TO nbEntree REQUIRED.


      PROCEDURE DIVISION.

      INITIALIZE nbEntree.
      MOVE FUNCTION CURRENT-DATE(9:8) TO seed.

      DISPLAY pla-titre.

      COMPUTE nbAleatoire = FUNCTION RANDOM (seed) * 100 + 1.

      PERFORM UNTIL nbEntree = nbAleatoire
         DISPLAY pls-nb
         ACCEPT pls-nb

         IF nbEntree > nbAleatoire THEN
             DISPLAY pla-moins
         ELSE
             DISPLAY pla-plus
         END-IF
      END-PERFORM.

      DISPLAY pla-trouve.

      STOP RUN.

Améliorations possibles

Voici une petite liste d’idées pour améliorer votre petit jeu, encore une fois c’est un TP récurrent donc les idées restent plus ou moins les mêmes :

  • Proposer différents intervalles de valeurs possibles
  • Afficher le nombre d’essais à l’utilisateur, une fois le nombre trouvé
  • Demander à refaire une partie quand la partie est finie

Bonus : un peu de couleur

Jeunes gens, laissez-moi vous donner une petite astuce en guise de récompense après une séance de dur labeur ! Je vais vous apprendre à mettre un peu de couleur dans votre console.

Voilà le secret :

      01 pla-erreur.
           02 LINE 5 COL 10
           "     C'est plus grand !     "
           FOREGROUND-COLOR 15
           BACKGROUND-COLOR 4.

Vous l’aurez compris, ceci est un message d’erreur écrit en blanc sur fond rouge, comme un message d’erreur plus ou moins traditionnel.
On a donc la propriété FOREGROUND-COLOR qui correspond à la couleur du texte, et BACKGROUND-COLOR qui correspond au fond du texte.

Attention à la disposition des points, il n’y a pas de point après le texte cette fois, mais après la dernière instruction de couleur !

Bien sûr, vous n’êtes pas obligés d’utiliser les 2 propriétés à chaque fois, une suffit. ;)

Les couleurs sont au nombre de 16, entre 0 et 15. Et comme je vous aime bien, je vous ai préparé un tableau récapitulatif des couleurs :

Code

Couleur

0

Noir

1

Bleu

2

Vert

3

Bleu clair

4

Marron

5

Violet

6

Kaki

7

Gris clair

8

Gris

9

Bleu clair

10

Vert clair

11

Cyan

12

Rouge

13

Rose

14

Jaune

15

Blanc

Voilà ! Maintenant il ne vous reste plus qu’à donner de la couleur à notre mini-jeu ! :soleil:


Voilà pour les notions essentielles ! Même avec de bonnes bases dans d’autres langages, il faut avouer que COBOL ne ressemble vraiment pas à la majorité (syntaxiquement parlant).

Sur ce, si vous êtes encore d’attaque, vous pouvez déjà entamer la prochaine partie !