Extraventure : faites votre propre aventure dont vous être le héros

Ce programme écrit en Python permet de créer sont propre jeu d’aventure à la façon des livres-jeu « dont vous êtes le héros » qui étaient si populaires fin des années 80s. L’idée de créer ce programme m’est venue en lisant le numéro 31 du magazine Jeux et Stratégie, qui comporte un article d’initiation au jeu d’aventure, Le mystère de la statue maudite (voir la suite de cet article). J’ai eu envie d’en faire une version informatique (34 ans après la publication) puis eu l’idée de faire un programme générique de gestion de jeu d’aventure simple.

Le principe

L’aventure est décrite dans un fichier ini dont la syntaxe est explicitée dans la suite de cet article.

Le jeu est très simple. Le joueur navigue dans l’aventure en effectuant un choix parmi un nombre fini d’options numérotées. En début de partie, il dispose d’un nombre de points de vie prédéfini qui par la suite évolue à la hausse ou à la baisse. Si le nombre de points de vie tombe à zéro, l’aventure est terminée…

L’aventure peut être lancée suivant deux modes ; en mode console (dans un terminal) ou en mode graphique (dans une fenêtre). Le mode graphique permet d’ajouter des images.

Installation et lancement

Extraventure est distribué sous licence GPL version 3. L’archive au format tar compressé est téléchargeable ici :

L’archive contient, à titre d’exemple, le jeu d’aventure « Le mystère de la statue maudite« . Le fichier mystere_statue_maudite.ini ainsi que les fichiers images contenus dans le répertoire img sont donnés à titre d’exemple et ne sont pas distribués suivant la licence GPL. Ils sont issus du magazine Jeux et Stratégie dont les actuels propriétaires conservent la propriété intellectuelle.

Pour installer le jeu, il suffit d’extraire l’archive dans un répertoire de votre choix :

tar xvzf extraventure.tar.gz

Pour lancer une aventure, depuis la console saisir la commande suivante :

./extraventure.py <option>  <fichier ini> 
Mode console si <option> est 'text','texte','txt' ou 'console'
Mode graphique si <option> est 'graphic', 'graphics' ou 'graphique'

<fichier ini> désigne le fichier qui décrit l'aventure qui sera entreprise par le joueur.
Comment créer votre aventure ?

Très simplement, en décrivant votre aventure dans un seul fichier ini. La syntaxe est volontairement simple. Il comporte une première section INTRO suivie de plusieurs sections SCENE.

La section INTRO est unique, elle permet de présenter l’aventure et affiche une aide si le joueur le souhaite. Voici la syntaxe :

INTRO = {
titre = "titre de l'aventure"
image = "image_intro.pgm" # Nom du fichier image d'intro, vide ("") si pas d'image.
desc = "description ou introduction"
vie = 12 # Nombre de points de vie en début de partie.
aide = "aide pour le joueur"
}

Chaque SCENE décrit une scène de l’aventure, c’est à dire ce que voit le joueur et les actions possibles. La SCENE comporte un numéro qui est son identifiant unique, une image optionnelle, une description, une sous-section VIE (optionnelle) permettant de faire évoluer les points de vie du joueur, – plusieurs sous-sections CHOIX (optionnelles) qui décrivent les options offertes au joueur, et une sous-section FIN (optionnelle) qui met fin à l’aventure.

SCENE = {
num = 1 # Identifiant unique de la scène.
image = "image_scene.pgm" # Nom du fichier image de la scene, peut être vide ("").
desc = "description de la scène"
VIE = { desc = "description", vie = nombre }
# Optionnel. Permet de faire évoluer le nombre de points de vie de la valeur indiquée (positive ou négative).
CHOIX = { desc = "description du 1er choix", goto = id_scene_choix_1 }
# Si le joueur choisi cette option, la scène suivante sera celle définie par l'id à la droite du goto
CHOIX = { desc = "description du 2ème choix", goto = id_scene_choix_2 }
…..
….. # Autant de choix que l'on veut
}
Implémentation

Extraventure a été développé en langage Python 3 et utilise la programmation objet. L’interface graphique s’appuie sur Tkinter qui est l’interface standard de Python. Ainsi, Extraventure est multi-plateforme. Le détail des fichiers sources figurer dans le README.txt distribué avec le programme.

Hommage à Jeux & Stratégie

Ce jeu est un hommage au magazine Jeux & Stratégie. Il a été publié dans le numéro 31 datant de février/mars 1985 (le magazine était bimensuel à cette période).
Le scénario a été conçu par Denis Gerfaud (concepteur du jeu de rôle onirique Rêve de Dragons). Il a été conçu comme un jeu d’initiation au jeu de rôle, en présentant un jeu d’aventure simplifié, pouvant également servir de base à un scénario plus élaboré.
Le jeu initial se déroulait sans l’aide d’un ordinateur, à la manière d’un jeu d’aventure dont vous êtes le héros.

Vous êtes au départ dans un lieu inconnu ; votre but est de trouver la sortie.
Vous possédez au début 12 points de survie. Chaque situation difficile, un combat par exemple, vous coûtera un certain nombre de points.
Tant qu’il vous reste des points de survie, vous êtes en vie et sortez vainqueur de la situation (avec les points en moins) ; s’il ne vous en reste pas assez, vous succombez… et c’est la fin.

Bon courage !!

Pas tibulaire… mais presque !

Une maison trop tranquille

« Dans la maison c’est le silence. Seule la queue du chat balance. »
Amateurs de grand frisson, essayez de sortir de cette maison trop tranquille ! Les pièges sont là. Avec de la chance, beaucoup de chance, vous parviendrez peut-être à en sortir ou à découvrir le trésor. Sinon, on se reverra dans l’au-delà.

U n long listing qui en vaut la peine. C’est un jeu classique d’aventure qui vous est proposé. Le Basic employé est un Microsoft avec quelques fonctions typiquement MICRAL.
But du jeu : Le joueur doit sortir de la maison dans laquelle il est enfermé et si possible avec un trésor. Pour progresser à travers la maison il faut donner des ordres à I’ ordinateur du style : ALLER NORD, PRENDRE CLEF, MONTER ESCALIER, etc. Pour obtenir la liste de toutes les commandes que I’ ordinateur comprend, il faut taper : VOCABULAIRE, et pour savoir quels objets on transporte, il suffit de taper : INVENTAIRE.

Ce programme d’aventure en mode texte en BASIC pour MICRAL 80-22 a été publié dans un cahier du logiciel du magazine MICRO 7. Je l’ai adapté au GW-BASIC et effectué pas mal de changements :

  1. Utilisation de minuscules et de caractères accentués.
  2. Utilisation de la complétion automatique tel que proposée dans cet article.
  3. Quelques astuces (voir le README.txt)
  4. Gestion de l’affichage complètement différente (le Basic MICRAL ayant des fonctions d’affichage en mode texte assez rudimentaires)
La page d’intro…

Et voici le programme :

Je ne suis sûr d’avoir tout débogué. Laisser moi un commentaire si vous trouvez la solution (j’ai joint un plan pour vous aider) ou si vous détectez quelques bugs….

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 !

Programmer en GW-BASIC en 2020

GW-BASIC

Cette semaine, je publie une nouvelle page sur la programmation en BASIC des premiers IBM-PC ; le GW-BASIC ou BASICA .

Comment programmer dans ce langage sur un PC moderne ? Cet article vous donnera deux solutions. Et à titre d’illustration, vous aurez en prime une version pour IBM PC du jeu « La maison du fou« , avec les accents et en couleurs, s’il vous plaît !

Un intro en couleur pour la maison du fou

Emulateurs, jeux, éducatif : Nouveautés sur Retroprogrammez !

Après plusieurs mois sans aucun changement, je profite du confinement actuel pour mettre à jour le site. Voici les nouveautés :

  • Reprise du menu principal pour qu’il soit plus lisible et plus cohérent.
  • Reprise de la page des émulateurs Apple II avec deux nouveaux émulateurs testés, des plus originaux : MicroM8, multi-plateforme et venant d’Australie et Apple2ix pour faire fonctionner vos vieux programmes sous Androïd.
  • Ajout d’un jeu éducatif du magazine Micro7 : Eprouvant.
  • Un nouveau jeu d’aventure en BASIC, en hommage à Jeux & Stratégie : Le vaisseau fantôme.

A vous de ( retro) jouer !

Tetris en BASIC Applesoft

J’ai découvert il y a peu le site australien Paleotronic qui a l’air excellent, avec quelques programmes intéressants pour Apple II, dont un émulateur Apple II qui semble performant : microM8. Je ferai un article sur ce dernier ultérieurement.

Un Tetris en Basic sur Apple II

Ils ont également publié un programme de Tetris en BASIC Applesoft. Le listing est téléchargeable sous la forme d’images au format PNG, ce qui nécessite d’entrer le programme « à la main », comme au bon vieux temps…. L’ayant fait (à l’aide d’un OCR – j’avoue), vous trouverez le programme sous la forme d’un fichier texte que vous n’aurez plus qu’à copier / coller dans votre émulateur favori. Il est téléchargeable ici.