Variables en BASIC Applesoft

Après avoir porté le jeu « La maison du fou » du BASIC Applesoft vers le GW-BASIC, je me suis aperçu d’une différence de comportement difficilement explicable entre les deux versions. Le fonctionnement du monte-charge de la maison n’était pas le même. Comment expliquer cela ? Après quelques tâtonnements, j’ai réalisé que cela était dû à une limitation forte sur les noms de variables en Applesoft. Regarder l’exemple suivant :

Confusion entre pommes et poires ?

Mais kesskisspassdonc ?!!? L’Apple II mélange-t-il les pommes et les poires ? C’est en quelque sorte ce qu’il se passe, en effet.

Le BASIC Applesoft permet de nommer vos variables avec un nombre de caractères important (je ne connais pas la limite réelle). Cependant, il ne prend en compte que les deux premiers caractères ! Ainsi pour ce interpréteur, POMME et POIRE sont les mêmes variables, ce qui est trompeur quand on ne connait pas cette contrainte.

Ainsi dans « La maison du fou » version Applesoft, les variables MCH (Monte Charge Haut) et MCB (Monte Charge Bas) sont les mêmes ! Le correctif est très simple, il suffit de renommer ces deux variables avec des noms de deux caractères seulement (MH et MB). J’ai donc repris le programme, et vous pouvez télécharger la version corrigée sur la page de la maison du fou.

Et c’est l’occasion de rejouer à cette aventure sur votre ordinateur favori. La correction du bogue rend le jeu un peu moins facile.

Complétion automatique pour vos jeux d’aventure

Dans les anciens jeux d’aventure textuels (ou semi-textuels puisque certains affichaient des graphismes), le joueur était invité à saisir des actions du type « prendre clef » ou « ouvrir porte ». Le vocabulaire était en général assez limité et le joueur passait du temps à chercher les bonnes commandes ; le programme peut par exemple comprendre le verbe « prendre » mais pas « ramasser » et s’il ne comprend pas, renvoie un message souvent peu explicite. Se pose également la question de l’utilisation du verbe à l’impératif ou à l’infinitif qui dépend du choix du concepteur du jeu (« attaque monstre » ou « attaquer monstre » ?).

En travaillant sur un jeu d’aventure en BASIC publié dans Micro 7, j’ai eu l’idée, pour faciliter la saisie des actions, d’améliorer le programme en ajoutant un algorithme de complétion automatique, afin d’éviter la recherche fastidieuse de vocabulaire.

Principe

Le fonctionnement est similaire à l’auto-complétion du shell Bash ; l’algorithme propose la chaîne de caractères complétant ce que l’utilisateur a commencé à entrer.

Illustrons ceci par un exemple où, parmi les commandes possibles, figurent « ALLER NORD », « ALLER SUD », « ALLUMER LAMPE » et « ATTAQUER MONSTRE ».

  • A l’invite de commande, l’utilisateur saisit la première lettre « A ». Toutes les commandes précitées seront toujours possibles (par contre une commande commençant par une autre lettre, telle que « BOIRE POTION » ou « REGARDER SALLE » sera exclue)
  • Puis le joueur frappe la lettre « L » ; la commande « ATTAQUER MONSTRE » est alors exclue, et seules les trois commandes commençant par AL restent possible. L’algorithme va alors afficher la chaine « ALL » puisque qu’il n’y a pas d’autre possibilité.
  • L’utilisateur tape alors ‘U’ ; à ce stade, il n’y a plus de choix, la seule commande restante étant « ALLUMER LAMPE ».

L’algorithme proposé a d’abord été développé en langage Python, qui présente l’avantage d’être structuré ; la mise au point de l’algorithme est plus aisée (je trouve). Le principe est relativement simple :

  • Sur saisie d’un caractère par l’utilisateur, parcours de l’ensemble des commandes possibles et élimination des commandes qui ne correspondent pas au motif saisi.
  • Puis, parmi les solutions restantes, on vérifie que les possibilités restantes ne présentent pas une suite de caractère identique au-delà de la saisie déjà effectuée. Toujours avec l’exemple précédent, si l’utilisateur a déjà saisi ‘A’ puis ‘L’, le caractère suivant de toutes les possibilités restantes est ‘L’ donc l’on propose à utilisateur la chaîne « ALL ». S’il saisi ensuite la lettre ‘E’, le programme affichera « ALLER  » puisqu’il n’y a pas d’autre possibilité. Ceci facilite considérablement la saisie.
  • On continue ainsi jusqu’à ce qu’il ne reste plus qu’une solution (succès) ou zéro solution (échec).
L’implémentation en Python 

Le programme ci-dessous, easy_input.py est une implémentation en Python 3 du principe proposé précédemment.

Dans ce programme , la fonction get_idx_commande() renvoie l’index de la commande choisie par l’utilisateur parmi une liste de commandes pré-définies (la liste est passée en paramètre). Si aucune commande n’est trouvée, la fonction renvoie -1.

L’interface utilisateur est rudimentaire, les saisies des caractères étant affichées ligne après ligne (mais l’objectif n’était pas de faire joli).

L’implémentation en BASIC

J’ai ensuite transcrit ce programme en BASIC Applesoft, et par conséquence, le nom des variables est limité à deux caractères. La transcription vers d’autres dialectes BASIC est très facile. Voici le programme téléchargeable :

Le sous-programme effectuant la complétion et se trouve à la ligne 100. Il renvoie la variable IX comprise entre 0 et NC, NC étant le nombre de commandes possibles. Un valeur nulle de IX indique que l’utilisateur n’a pas saisi de commande valide.

Comparé à la version sous Python, le programme améliore l’affichage puisque la saisie des caractères se fait sur une seule ligne.

Auto-complétion en BASIC Applesoft

Une fois la commande trouvée par l’algorithme l’utilisateur doit la valider en tapant la touche ‘Entrée’. Il peut à tout moment annuler sa saisie en appuyant sur la touche ‘Backspace’, et doit alors recommencer la saisie depuis le début.

A noter que le transcodage d’un programme structuré en Python vers un programme BASIC farci de GOTO est un sujet intéressant qui pourrait faire l’objet d’un article à part.

Intégration dans vos propres jeux

Vous pouvez directement intégrer le S/P à partir de la ligne 100 dans votre programme, en modifiant les numéros de lignes si nécessaire (si c’est le cas ne pas oublier de modifier les numéros de lignes après les GOTO).

Il faut ensuite adapter la liste des commandes possibles définies sous la forme de DATA aux lignes 40 et 41, et ne pas oublier de modifier la valeur de NC.

Il faudra également veiller à ce que les noms des variables du S/P d’auto-complétion ne sont pas déjà utilisées dans votre programme, car il n’y a pas de notion de variable locale en BASIC old school ; tout est global. Vous risqueriez ainsi d’introduire des régressions difficiles à débugger.

Un exemple d’utilisation à venir : une maison trop tranquille

Enfin je vous propose un exemple d’utilisation de ce S/P dans un petit jeu d’aventure qui a été publié par feu le magasine Micro 7 ; « Une maison trop tranquille ».

Mais il va falloir un peu de patience car je suis toujours en phase de débogage. Rendez-vous dans un prochain article !