Version en ligne

Tutoriel : Liste Interactive

Table des matières

Liste Interactive
Affichage par Locate
Contrôle et lancement
La force du Getkey

Liste Interactive

Affichage par Locate

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 qui, bien qu'encore en chantier, vous montrera quelques fondamentaux à ce sujet. Nous aborderons tout de même ici les diffé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.

Affichage par Locate

Contrôle et lancement

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 affichage 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 effet, 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 affiche 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 affichera 8 aux coordonnées (3,5), et "A" aux coordonnées (3,6).

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

À vous de jouer !
Deux exercices vous sont proposés ici.

1) Il s'agit de créer un code affichant "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 : Shift, 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 affiche ensuite "Bouh" aux coordonnées (9,3).

Locate apporte un effet visuel, mais a aussi une autre petite utilité, comme vous allez le voir. ;)


Contrôle et lancement

Contrôle et lancement

Affichage par Locate La force du Getkey

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 '=>' [shift, 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 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.

Pour trouver Stop :
Shift, Prgm, F2 (Ctl), F4 (Stop).

Et si l'utilisateur tapait 5 ? Ou "Afterburlohdn" ?

Il suffirait 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 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 efficace 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'effet suivant :
1) affichage de "Tapez 1..." ;
2) l'utilisateur rentre un chiffre au choix ;
3) si ce chiffre est différent de 1, on renvoie au Lbl 2; sinon, on affiche "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.


Affichage par Locate La force du Getkey

La force du Getkey

Contrôle et lancement

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 effet, 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 affiche immédiatement.

Note de syntaxe :
il suffit 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 :
Shift, 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 afficher 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.

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 affichage 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 afficherons 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 effectué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.

Je rappelle qu'il faut, à chaque passage dans la pseudo-boucle, afficher 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'affichage 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 !


Contrôle et lancement