Version en ligne (../../../[Link].
com/informatique/tutoriels/liste-interactive)
Tutoriel : Liste Interactive
Table des matières
Liste Interactive
A!ichage par Locate
Contrôle et lancement
La force du Getkey
Liste Interactive
Bonjour à vous, amis Zér0s !
Je vois que vous souhaitez concevoir un petit programme sympathique sous Casio.
Tout d'abord, je tiens à vous renvoyer au tutoriel de Deltod ([Link]
[Link]) qui, bien qu'encore en chantier, vous montrera quelques
fondamentaux à ce sujet. Nous aborderons tout de même ici les di!érentes techniques dont
nous avons besoin, afin de réaliser l'objectif : créer une liste interactive.
Vous devez savoir que sous TI, ceci est très simple à faire. En Casio aussi, mais il faut utiliser
quelques petites astuces.
A!ichage par Locate
Parfois, on laisse certains choix à faire, lors de la création d'un jeu ou d'un tout autre programme
sous Casio. Imaginons par exemple, que vous codiez un simple jeu, où un mode "2 joueurs" est
disponible, ainsi qu'une aide, et une possibilité de quitter.
Vous allez logiquement coder :
"1: Un joueur"
"2: Deux joueurs"
"3: Aide"
"4: Quitter"?->A
Par exemple. Et ceci nous produira un simple a!ichage qui commencera à la première ligne, premier
caractère, et se terminera par le "?" symbolique demandant à notre utilisateur de rentrer la valeur
qu'il souhaite, implicitement entre 1 et 4.
Ceci peut se nommer une liste statique.
Il y a quelques lacunes dans ce code. Dont l'une est le contrôle de la valeur donnée par l'utilisateur.
Qu'est-ce qui l'empêche, en e!et, de taper un simple 6 ? Ou encore 0 ? Il faut donc contrôler la valeur
de sortie, dire "Si A est inférieur à 1 ou supérieur à 4, alors on redemande."
Nous verrons comment éviter cela.
:
De plus, une telle liste est peu agréable à lire. Le texte est collé, et à moins d'insérer de multiples
espaces pour le décaler, on ne peut pas y faire grand-chose en codant ainsi.
D'où l'utilisation de Locate.
Locate X,Y,Val
Locate a!iche Val aux coordonnées X, Y. Val peut être une chaîne de caractères "Bouh !" ou un
nombre, ou encore la valeur d'une variable.
On peut donc parfaitement écrire :
8->A
Locate 3,5,A;
Locate 3,6,"A"
Ce qui a!ichera 8 aux coordonnées (3,5), et "A" aux coordonnées (3,6).
Ne vous préoccupez point du ';' il s'agit du symbole que nous utiliserons pour le retour à la
ligne avec arrêt (attente d'une touche). Il s'agit du triangle plein, que l'on trouve en faisant
Shi", Prgm, F5.
Ce joli petit symbole arrête momentanément le code, en a!ichant -Disp- ainsi que la ligne
précédente. L'utilisateur doit alors appuyer sur EXE pour que le code continue.
Quid des coordonnées ?
Vous devez savoir que X représente l'axe des abscisses et Y celui des ordonnées. Pour éclaircir, tracez
un tableau de 21 colonnes sur 7 lignes. Il s'agit de l'écran. La première ligne correspond à Y=1. La
cinquième colonne représente X=5. Un caractère emplit l'une des cellules de notre tableau.
Écrire "18" à X=4 et Y=2, signifie que vous aurez le "1" à la position (4, 2) et le "8" à la position (5,2).
Attention !
Comme je vous l'ai dit, l'écran est alors symboliquement constitué de 21 colonnes et 7 lignes,
ce qui signifie que X est compris entre 1 et 21 et Y entre 1 et 7. Il est toutefois recommandé de
ne rien a!icher en Y=1 et Y=7 par Locate.
De plus, si vous tentez d'a!icher quelque chose en X=22 ou en Y=8, c'est-à-dire hors des
dimensions dites ci-dessus, alors un "Syn Error" vous sera retourné.
À vous de jouer !
Deux exercices vous sont proposés ici.
1) Il s'agit de créer un code a!ichant "Hello Word", tout simplement, grâce à Locate au centre de
l'écran, à la ligne 3 et 4. On doit donc avoir à l'écran, "Hello" à la ligne 3 et World à la ligne 4. Je veux
que l'on ait 3 espaces blancs à gauche. Je vous laisse donc deviner la valeur de X.
Mais je veux qu'on ait un arrêt entre l'apparition de "Hello" et celle de "World". Utilisez donc le
triangle plein dont on parlait tout à l'heure.
2) Il s'agit de reproduire la même liste statique, mais en utilisant, cette fois, Locate. Je veux qu'on ait
un décalage de 4 espaces blancs à gauche, et 2 espaces blancs en haut. A noter que vous ne devez
pas mettre le '?' dans le Locate.
:
AU FAIT : Locate se trouve par : Shi", Prgm, F6 (>), F4 (I/O), F1 (Lcte).
Pour les initiés, I/O signifie Input/Output, Entrée/Sortie... Bref.
Ça y est ?
CORRECTION
Exercice 1
Locate 4,3,"HELLO";
Locate 4,4,"WORLD"
C'est très simple, comme vous le voyez. Le choix pouvait être ardu, mais n'oubliez pas que nous
avons 3 espaces blancs à gauche. Mettre un X=3 n'aurait laissé que 2 espaces blancs à gauche. :)
Exercice 2
Locate 5,3,"1: Un joueur"
Locate 5,4,"2: Deux joueurs"
Locate 5,5,"3: Aide"
Locate 5,6,"4: Quitter"
?->A
Il s'agit encore une fois d'accumuler les Locate. Ne pas oublier de sauter une ligne (rappel : EXE saute
simplement une ligne, sans autre forme de procès, et termine la ligne de commande) entre le dernier
Locate et le '?'.
Vous savez quasiment tout de Locate. Sachez que l'on peut également utiliser des variables pour les
Coordonnées.
9->F
3->K
Locate F,K,"Bouh";
Ce simple code, par exemple, stockera 9 en F et 3 en K. Il a!iche ensuite "Bouh" aux coordonnées
(9,3).
Locate apporte un e!et visuel, mais a aussi une autre petite utilité, comme vous allez le voir. ;)
Contrôle et lancement
On a notre liste statique et un peu plus ergonomique. mais pour le moment, c'est tout ce que nous
avons de plus.
Il s'agit à présent et pour le moment de contrôler la valeur entrée par l'utilisateur et de réagir en
fonction.
?->A
:
Imaginons qu'ainsi, nous avons notre utilisateur qui tape son choix (de 1 à 4, comme nous l'avons
vu).
Si cet utilisateur tape 1, alors on envoie à un autre programme, qui contient, par exemple, le jeu.
De même s'il tape 2. On ne fait que garder la valeur de A.
Si l'utilisateur tape 3, en revanche, on doit l'amener là où il aura ses explications, l'aide sur le jeu.
Et s'il tape 4, on doit stopper le programme sans autre forme de procès.
Pour contrôler cette valeur, on utilisera simplement l'opérateur d'exécution '=>' [shi", Prgm, F3
(jump), F3 (=>)].
Et pour contrôler, un simple A=1, plutôt qu'une longue série de If / Then / Else.
Je vous renvoie encore au tuto de Deltod ([Link]
[Link]) si vous avez oublié le fonctionnement des conditions et souhaitez une explication
plus claire.
On aura donc :
?->A
A=1=>"Bouh";
A=2=>"Blah";
A=3=>"Burp";
A=4=>Stop;
Pour le moment, notre code paraît bien inutile. Intéressons-nous à la dernière ligne. Stop. C'est une
commande arrêtant l'exécution du programme. Pratique, puisque si notre utilisateur tape 4, c'est
qu'il veut en fait quitter.
Note : si cet utilisateur tape frénétiquement (deux fois) sur EXE, le programme redémarrera. Ce
qui est normal : un EXE sur un écran en mode RUN lance la dernière commande. Que ce soit un
calcul, une fonction, ou un programme.
Pour trouver Stop :
Shi", Prgm, F2 (Ctl), F4 (Stop).
Et si l'utilisateur tapait 5 ? Ou "A"erburlohdn" ?
Il su!irait de dire "SI A<1 OU A>4 ALORS on retourne à l'écran du choix".
Vous connaissez SI, OU, ALORS.
Ici, nous utiliserons :
A<1 Or A>5=>on fait ceci
Ce Or est introduit dans le tuto de Deltod ([Link]
[Link]) auquel je vous renvoie une fois encore, en cas d'oubli.
Mais qu'en est-il du "on fait ceci" ? On veut revenir à l'écran du choix. Et on a justement à notre
disposition un outil très e!icace pour cela : le Goto.
Syntaxe :
:
Goto X
Renvoie au Lbl X.
Par exemple, Goto 3 renverra à l'endroit où est écrit Label 3 (Label = Lbl).
Il faut donc un Label correspondant à chaque fois. Vous pouvez avoir plusieurs Goto sur le même
Label, mais pas plusieurs Label pour un même numéro.
Considérez les Label comme des étiquettes, et des Goto comme des "Aller à l'étiquette".
Par exemple :
Lbl 2
"Tapez 1 pour continuer"?=A
A!=1=>Goto 2
"Yeah !";
Ce code produira l'e!et suivant :
1) a!ichage de "Tapez 1..." ;
2) l'utilisateur rentre un chi!re au choix ;
3) si ce chi!re est di!érent de 1, on renvoie au Lbl 2; sinon, on a!iche "Yeah !".
Vous voyez qu'on n'a pas besoin d'un If / Then pour un contrôle aussi simple. Le Goto / Lbl est
réellement puissant.
Pour trouver Goto et Label :
SHIFT, PRGM, F3 (JUMP).
Allez, c'est parti !
Je veux que vous me fassiez la liste statique de tout à l'heure, avec ces choix conditionnels. Si
l'utilisateur tape 1 ou 2, on l'amène au Label 4.
S'il tape 3, au Label 2.
Et s'il tape 4, on arrête le programme.
Enfin, s'il tape autre chose, on le renvoie au Label 1, positionné avant la liste.
Je veux bien sûr que vous repreniez la totalité du code de notre liste statique :
Locate 5,3,"1: Un joueur"
Locate 5,4,"2: Deux joueurs"
Locate 5,5,"3: Aide"
Locate 5,6,"4: Quitter"
?->A
Voilà, vous avez toutes les clefs en main !
...
Ça y est ?
CORRECTION
:
Lbl 1
Locate 5,3,"1: Un joueur"
Locate 5,4,"2: Deux joueurs"
Locate 5,5,"3: Aide"
Locate 5,6,"4: Quitter"
?->A
A=1 Or A=2 => Goto 4
A=3 => Goto 2
A=4 => Stop
Goto 1
Le principe est simple. Le dernier Goto n'a pas besoin d'une condition : les 4 cas "légaux" (c'est-à-dire
dans le cadre du programme) étant déjà sujets à des Goto, le dernier ne sera pris en compte que si
l'utilisateur tape autre chose que 1, 2, 3, ou 4.
Goto et Label sont des outils intéressants, évitant l'utilisation d'une boucle while. Il faut néanmoins
se rappeler qu'en ce sens, ce duo n'étant pas une boucle, break ne fonctionne pas, et il faut utiliser un
voire plusieurs autres label pour "sortir" de cette "pseudo-boucle".
Jusque là, nous avons simplement vu la méthode pour une liste statique. Nous allons à présent
attaquer la liste interactive, de plain-pied, avec l'utilisation de Getkey.
La force du Getkey
Nous allons ici aborder l'utilisation de la Getkey. Il s'agit d'une pseudo-fonction récupérant le code
de la touche enfoncée.
En e!et, chaque touche a un code prédéfini. Ce qui permet, entre autres, à la machine de déterminer
que faire lorsque telle ou telle touche est pressée. Ce qui permet de dire "en appuyant surEXE,
donner le résultat de l'opération ou exécuter l'instruction le cas échéant".
Pour obtenir les codes des touches, je vais vous guider pour la création d'une sorte de "mini-
programme" capable de fournir, lorsque l'on appuie sur une touche, le code associé.
Voici les étapes :
1) on crée une pseudo-boucle avec Goto / Label
2) cette boucle continue tant qu'une touche n'est pas pressée ;
3) si une touche est pressée, on stocke le code de cette touche dans une variable qu'on a!iche
immédiatement.
Note de syntaxe :
il su!it de mettre "Getkey" pour que le programme fournisse le code de la touche appuyée.
Donc :
Getkey -> A
stockera le code de la touche appuyée dans A.
:
Pour trouver Getkey :
Shi", Prgm, F6, F4 (I/O), F2 (Gtky).
Vous devriez pouvoir y arriver sans trop de problèmes.
...
Correction !!
Lbl 0
Getkey -> A;
Goto 0
Pourquoi une boucle ?
Getkey ne stocke l'appui que lorsque l'utilisateur appuie sur la touche au moment où le Getkey est
appelé. Il faut donc mettre un Getkey dans une boucle (ou pseudo-boucle dans notre cas) pour qu'il
fonctionne concrètement. De plus, pour a!icher A, il nous faut utiliser le triangle plein (marqué ici ';',
je vous le rappelle).
Voilà : ainsi, en appuyant sur une touche, vous obtenez le code de la touche associée. Un tel
programme est souvent utile. Même si ces codes de touches sont tous dans le manuel, vous ne l'avez
sans doute pas toujours sur vous.
Nous aurons besoin des codes des touches EXE, "flèche haute" et "flèche basse" pour notre liste
interactive.
Vous obtiendrez :
EXE : 31
Flèche haute : 28
Flèche basse : 37.
J'ignore cependant si ces codes sont similaires pour tous les modèles de CASIO. Il est possible
par exemple que cela change entre la Graph35 (celle que j'utilise) et les autres. D'où
l'utilisation de ce mini-programme.
Nous avons nos codes de touches, l'utilisation de Getkey, et nous savons générer une liste statique.
Nous savons également générer un a!ichage où nous le souhaitons sur l'écran.
L'assemblage est un peu compliqué à première vue.
Nous devons créer une pseudo-boucle dans laquelle nous a!icherons notre menu.
Nous aurons une variable, nommée C par exemple, qui indiquera la position du "curseur" sur la liste.
Lorsque l'utilisateur appuyera sur la flèche haute (ou basse), on change la valeur de C en fonction. Et
lorsqu'il appuie sur EXE, on vérifie la valeur de C, pour diriger notre visiteur selon son choix.
Imaginons, par exemple, notre liste statique qui sera bientôt interactive. Lorsque C est égal à 1, cela
signifie que notre curseur est sur le premier élément de la liste ("1 joueur", dans notre cas). Pour C=2,
c'est "2 joueurs", C=3 pour "Aide", C=4 pour "Quitter".
En commençant ainsi, vous pouvez voir la structure de notre liste ! :)
:
Attention, tout de même. Nous devons bien sûr utiliser un Goto pour sortir de notre pseudo-boucle à
chaque fois, mais nous devons également vérifier que notre variable ne passe pas hors des
possibilités, c'est-à-dire qu'elle ne soit ni inférieure à 1, ni supérieure à 4. Cette vérification doit se
faire une fois la modification de C en fonction de la Getkey e!ectuée.
Imaginons que vous utilisiez le Label 1 pour créer la pseudo-boucle, le Label 2 pour commencer le
jeu (que ce soit en 1 ou 2 joueurs), et le Label 3 pour arrêter le jeu.
Nous utiliserons le symbole "->" en tant que "curseur". C'est un choix comme un autre. :-°
Je rappelle qu'il faut, à chaque passage dans la pseudo-boucle, a!icher le curseur selon la valeur de
C, et uniquement à cet endroit. N'oubliez pas non plus d'initialiser C à une valeur qui nous
convient(pourquoi pas 1 ? ;) )
Je vous laisse essayer. Il est probable que vous n'y arriviez pas directement. Dans ce cas, relisez les
parties de ce tuto, une par une, et surtout celle-ci. Car c'est notre dernière ligne droite. :D
...
Pas réussi ? Réessayez.
...
Toujours pas ? Bien. Voici la correction.
1 -> C
Lbl 1
C<1 => 1 -> C
C>4 => 4 -> C
C=1 => Locate 5,3,"->"
C!=1 => Locate 5,3," "
C=2 => Locate 5,4,"->"
C!=2 => Locate 5,4," "
C=3 => Locate 5,5,"->"
C!=3 => Locate 5,5," "
C=4 => Locate 5,6,"->"
C!=4 => Locate 5,6," "
Locate 6,3,"1 joueur"
Locate 6,4,"2 joueurs"
Locate 6,5,"aide"
Locate 6,6,"quitter"
Getkey=31 And C=4 => Goto 3
Getkey=31 And C=3 => Stop
Getkey=31 And C=1 => Goto 2
Getkey=31 And C=2 => Goto 2
Getkey=28 => C-1 -> C
Getkey=37 => C+1 -> C
Goto 1
:
Il ne vous faut pas oublier de positionner les Label 2 et 3, bien entendu. L'avantage d'une telle
pseudo-boucle devient évidente. Par exemple, à la fin du texte d'aide, vous pouvez mettre un Goto 1,
ramenant ainsi à la liste :) .
La lenteur du curseur et le manque de réactivité sont dûs à la forme de la boucle. Si vous voulez
améliorer les performances, insérez les mêmes conditions de Getkey juste avant l'a!ichage de la liste
(donc une seconde fois).
Il existe quelques façons d'améliorer ce code. Je vais en présenter quelques-unes en annexe ;) .
Voilà, vous pouvez dès lors créer une simple liste interactive.
Il est à noter que la manière proposée ici est très loin d'être la seule pour arriver à un résultat
semblable. L'usage d'un while est tout aussi possible, avec un peu plus de diversification dans le
code (usage de break, par exemple).
Je ferai probablement un autre mini-tuto à ce sujet.
Si vous avez des critiques ou des suggestions à me faire, n'hésitez pas !
: