Il y a quelques jours, dans deux précédents articles, je te présentais mon adaptation du mini-jeu WHIS pour en faire un jeu compatible avec la NumWorks, sous la forme d'une version Epsilon et d'une version un peu améliorée qui ne fonctionne qu'avec Upsilon, ainsi qu'une version Casio Graph Math+ qui profite de la grande mémoire de travail de son application Python.
Pour présenter très succintement le jeu : c'est un jeu de cartes qui se joue à 4 joueurs dans sa version originale (c'est un mini-jeu du jeu Tales of Eternia) et dont le principe ressemble beaucoup au jeu du UNO, mais en remplaçant les chiffres par les éléments Eau, Feu et Vent. Le but est de réussir à jouer toutes les cartes de sa main avant que les autres joueurs ne fassent de même avec leurs cartes.
Voici un aperçu des 14 cartes du jeu :
Une présentation assez complète du jeu, des règles et des cartes est consultable dans l'article qui présente les versions NumWorks du jeu.
Voici un aperçu des 14 cartes du jeu :
Une présentation assez complète du jeu, des règles et des cartes est consultable dans l'article qui présente les versions NumWorks du jeu.
Après avoir fait une version NumWorks Epsilon, une version NumWorks Upsilon et une version Casio Graph Math+, il était impensable de ne pas faire une version Casio Graph 90+E !
D'autant plus que cette dernière à toutes les fonctions de la Casio Graph Math+. Enfin, toutes, non, pas tout à fait !
D'autant plus que cette dernière à toutes les fonctions de la Casio Graph Math+. Enfin, toutes, non, pas tout à fait !
Ces deux calculatrices ont des capacités matérielles remarquables et en particulier une grande mémoire de stockage et une grande mémoire de travail ( ) mais leur implémentation de Python est malheureusement incomplète.
En effet, elles ne gèrent pas les caractères accentués ou avec une cédille. Ceux-ci ont donc été retirés, jusqu'à amélioration de la situation. Mais ce n'est pas le plus important.
De plus, elles sont dépourvues du module
Sans
En effet, elles ne gèrent pas les caractères accentués ou avec une cédille. Ceux-ci ont donc été retirés, jusqu'à amélioration de la situation. Mais ce n'est pas le plus important.
De plus, elles sont dépourvues du module
time
et la Graph 90+E, contrairement à la Graph Math+, est également dépourvue de la fonction getkey()
. Cette fonction permet de gérer en temps réel l'appui sur les touches de la calculatrice et son abscence complique cruellement la conception de jeux graphiques nécessitant une interaction avec le joueur !Sans
getkey()
, toute interaction implique de quitter l'interface graphique, de poser une question puis de traiter la réponse après validation (ou alors il faut ruser, comme le fait critor en interceptant l'instruction d'arrêt du script générée par l'appui sur la touche AC/ON, la seule touche qui est reconnue, ce qui est fonctionnel mais malgré tout assez peu ergonomique ).Mais la légende raconte qu'un add-in permet de lancer des jeux Python sur les Casio Graph 90+E avec un affichage très rapide et la possibilité d'utiliser les modules Python de la NumWorks.
Cet add-in est en fait PythonExtra. Nous le devons au travail remarquable de la communauté de Planète-Casio et en particulier de Lephe.
Et c'est à notre cher et talentueux SlyVTT que nous devons l'intégration des modules de la NumWorks dans la version 0.3.0 de cet add-in, qui permet maintenant de profiter de l'ensemble des scripts et jeux de la NumWorks directement sur la Graph 90+E.
Qui plus est, il est tout à fait possible de créer un jeu Python en utilisant à la fois des modules Python de Casio portés dans PythonExtra, des modules Python de NumWorks portés dans PythonExtra mais également des modules Python propres à PythonExtra, tels que gint.
Ce formidable add-in PythonExtra fournit toutes les fonctions qui manquent pour pouvoir adapter la version Graph Math+ du jeu WHIS en une version Graph 90+E !
Petite précision qui a toute son importance : le jeu doit être exécuté depuis l'add-in pour fonctionner correctement.
Cet add-in est en fait PythonExtra. Nous le devons au travail remarquable de la communauté de Planète-Casio et en particulier de Lephe.
Et c'est à notre cher et talentueux SlyVTT que nous devons l'intégration des modules de la NumWorks dans la version 0.3.0 de cet add-in, qui permet maintenant de profiter de l'ensemble des scripts et jeux de la NumWorks directement sur la Graph 90+E.
Qui plus est, il est tout à fait possible de créer un jeu Python en utilisant à la fois des modules Python de Casio portés dans PythonExtra, des modules Python de NumWorks portés dans PythonExtra mais également des modules Python propres à PythonExtra, tels que gint.
On peut, par exemple, importer la fonction
sleep
du module time qui permet de faire une pause de durée déterminée dans l'exécution d'un script, et au passage remplacer le bricolage de recodage de cette fonction que j'ai utilisé dans la version Graph Math+. Ce formidable add-in PythonExtra fournit toutes les fonctions qui manquent pour pouvoir adapter la version Graph Math+ du jeu WHIS en une version Graph 90+E !
Petite précision qui a toute son importance : le jeu doit être exécuté depuis l'add-in pour fonctionner correctement.
La simple importation de la fonction
Il y a donc tout ce qu'il faut sur la Graph 90+E pour y faire fonctionner mon adaptation du jeu WHIS !
getkey()
du module ion de NumWorks suivie du remplacement des getkey()
par des keydown()
en adaptant le nom des touches permet de rendre le jeu exécutable sur la Graph 90+E avec PythonExtra ! Il y a donc tout ce qu'il faut sur la Graph 90+E pour y faire fonctionner mon adaptation du jeu WHIS !
Cependant, l'affichage est alors extrèmement lent et l'image de l'écran de titre met environ 2 min pour être affichée, dans un lent déroulement qui rappelle un rideau qui descend.
Va-t-il falloir renoncer à cette belle image ?
Va-t-il falloir renoncer à cette belle image ?
L'image de l'écran de titre de la version Graph Math+ du jeu WHIS fait 185×185 pixels et elle est encodée puis tracée pixel par pixel avec la commande
Il a donc fallu trouver une parade pour ne pas avoir à renoncer à ce bel écran de titre (ou à deux minutes de notre temps à chaque lancement du jeu) !
set_pixel
du module casioplot. Si l'affichage de cette image prend 6 ou 7 secondes sur la Graph Math+, il prend tout de même près de 2 min sur la Graph 90+E que ça soit avec la version kandinsky (sans double buffering, donc avec effet rideau qui descend) ou avec la version casioplot (avec double buffering) de la fonction set_pixel
! Pour le jeu Orlog, l'image de l'écran de titre (la tête de loup) ne comporte que 4 couleurs et il aurait été possible de modifier l'encodage de l'image pour la traiter ligne par ligne en stockant chaque ligne sous forme de rectangles dont il faudrait seulement conserver la couleur et la longueur (c'est d'ailleurs la méthode effectivement retenue pour les images des divinités et qui accélère beaucoup leur affichage !). Pour l'image de l'écran de titre du jeu WHIS, il y a bien plus de 4 couleurs et il n'est pas forcément pertinent et efficace de stocker l'image sous forme de rectangles, la plupart des rectangles ayant une longueur de 1 pixel.
Il a donc fallu trouver une parade pour ne pas avoir à renoncer à ce bel écran de titre (ou à deux minutes de notre temps à chaque lancement du jeu) !
C'est notre cher SlyVTT qui a trouvé une solution en proposant de faire appel aux fonctions de dessin du module gint de PythonExtra. Ce module permet en effet d'encoder des images de différentes manières suivant le nombre de couleurs souhaitées et l'espace dont on dispose pour la longue chaîne de caractères qui résulte de l'encodage de l'image.
Ensuite, chaque image est tracée à la position souhaitée avec la commande
Ensuite, chaque image est tracée à la position souhaitée avec la commande
dimage(x,y,IMAGE)
où IMAGE est le nom de la variable qui stocke (entre autres) la chaîne de caractères générée lors de l'encodage de l'image et x et y sont les positions horizontales et verticales où on souhaite placer le coin supérieur gauche de l'image.Armé de son courage, de son talent et de sa patience, notre cher et talentueux SlyVTT a encodé toutes(!) les images du jeu (28 pour les visages + 14 cartes + 3 éléments + la pioche + l'image de titre) en un format géré par gint et ses fonctions de dessin ! Sans entrer dans les détails, cet encodage se fait avec une ligne de commande (par image) qui nécessite d'avoir le fxSDK installé sur son ordi. Bravo pour le petit script brillamment pensé pour automatiser le traitement et merci beaucoup pour ce grand coup de pouce !
Qui plus est, gint utilise le double buffering, ce qui signifie qu'on peut afficher une image puis préparer l'image suivante sans l'afficher et ne l'afficher que lorsqu'on le souhaite, avec la commande
En utilisant les fonctions de dessin du modeul gint et l'encodage des images qui convient, l'affichage de l'image de titre ne prend plus que 6 ou 7 secondes au lieu de 2 min !
dupdate()
(ce qui équivaut à la commande show_screen()
du module casioplot qui utilise aussi le double buffering).En utilisant les fonctions de dessin du modeul gint et l'encodage des images qui convient, l'affichage de l'image de titre ne prend plus que 6 ou 7 secondes au lieu de 2 min !
Toutefois, remplacer les quelques lignes de la fonction
En effet, j'ai utilisé un dictionnaire (un des types d'objets Python) pour faire l'association entre le nom d'une carte (une chaîne de caractères de 3 lettres) et la chaîne de caractères qui contient de manière codée les données de l'image correspondante. Ma fonction
Le souci est que gint utilise des noms de variable pour aller chercher les données à afficher, et non pas des noms sous forme de chaîne de caractères.
Pour transformer un nom de variable en chaîne de caractères, il suffit d'utiliser la commande
En revanche, dans mon cas j'ai besoin de faire la réciproque ! Le nom des Cartes est une chaîne de caractères et la fonction
Ce qui ressemble à ça :
L'affichage d'une carte est alors demandé avec la commande
Un autre point qui ne me permettait pas de simplement retirer les guillemets de tous mes noms de carte est que la fonction
IMG
que j'ai codée pour décoder et afficher les images dans la version Graph Math+ par un simple dimage(x,y,carte)
n'était pas fonctionnel.En effet, j'ai utilisé un dictionnaire (un des types d'objets Python) pour faire l'association entre le nom d'une carte (une chaîne de caractères de 3 lettres) et la chaîne de caractères qui contient de manière codée les données de l'image correspondante. Ma fonction
IMG
utilise alors le nom de la carte sous forme d'une chaîne de caractères pour aller chercher (dans le dictionnaire Image
) les données à afficher.Le souci est que gint utilise des noms de variable pour aller chercher les données à afficher, et non pas des noms sous forme de chaîne de caractères.
Pour transformer un nom de variable en chaîne de caractères, il suffit d'utiliser la commande
str()
. Par exemple, pour transformer Pio
en "Pio"
, il suffit d'utiliser la commande str(Pio)
dans laquelle on peut remplacer le nom Pio par ce que l'on souhaite, y compris de manière automatique pour le nom de chaque carte.En revanche, dans mon cas j'ai besoin de faire la réciproque ! Le nom des Cartes est une chaîne de caractères et la fonction
dimage()
attend comme paramètre un nom de variable. Je n'ai pas trouvé d'autre solution que de créer un dictionnaire qui, à un nom écrit sous forme d'une chaîne de caractères, associe un nom de variable. En fait, le nom de variable est le même que la chaîne de caractères mais sans les guillemets.Ce qui ressemble à ça :
- Code: Select all
def sansguillemet(carte):
return {'Vsi':Vsi, 'Vtq':Vtq, 'Vsp':Vsp, 'Esi':Esi, 'Etq':Etq, 'Esp':Esp, 'Fsi':Fsi, 'Ftq':Ftq, 'Fsp':Fsp, 'Tev':Tev, 'Tvf':Tvf, 'Tfe':Tfe, 'Lum':Lum, 'Obs':Obs, 'Pio':Pio, 'Eau':Eau, 'Feu':Feu, 'Vent':Vent, "Reid_content":Reid_content, "Reid_content_yeux":Reid_content_yeux, "Reid_content_yeux_fermes":Reid_content_yeux_fermes, "Reid_neutre":Reid_neutre, "Reid_neutre_yeux":Reid_neutre_yeux, "Reid_neutre_yeux_fermes":Reid_neutre_yeux_fermes, "Reid_boude":Reid_boude, "Reid_boude_yeux":Reid_boude_yeux, "Reid_boude_yeux_fermes":Reid_boude_yeux_fermes, "Farah_contente":Farah_contente, "Farah_neutre":Farah_neutre, "Farah_neutre_yeux":Farah_neutre_yeux, "Farah_neutre_yeux_fermes":Farah_neutre_yeux_fermes, "Farah_boude":Farah_boude, "Farah_boude_yeux":Farah_boude_yeux, "Farah_boude_yeux_fermes":Farah_boude_yeux_fermes, "Meredy_contente":Meredy_contente, "Meredy_neutre":Meredy_neutre, "Meredy_neutre_yeux":Meredy_neutre_yeux, "Meredy_neutre_yeux_fermes":Meredy_neutre_yeux_fermes, "Meredy_boude":Meredy_boude, "Keele_content":Keele_content, "Keele_content_yeux":Keele_content_yeux, "Keele_content_yeux_fermes":Keele_content_yeux_fermes, "Keele_neutre":Keele_neutre, "Keele_neutre_yeux":Keele_neutre_yeux, "Keele_neutre_yeux_fermes":Keele_neutre_yeux_fermes, "Keele_boude":Keele_boude, "Titre":Titre}[carte]
L'affichage d'une carte est alors demandé avec la commande
IMG(20,50,sanguillemet("Esp"))
pour afficher la carte Eau spéciale, c'est-à-dire Prisme. Un autre point qui ne me permettait pas de simplement retirer les guillemets de tous mes noms de carte est que la fonction
animation
qui s'occupe de l'animation des visages des personnages concatène des chaînes de caractères pour aller chercher la bonne image à afficher. Sans utiliser de guillemets, je ne sais pas comment réassembler ces morceaux de chaînes de caractères pour former un nom de variable pour ensuite aller chercher la bonne image. La fonction
IMG
qui s'occupe de l'affichage des images comporte également un paramètre affichage
qui permet de ne pas systématiquement afficher l'image générée. Lorsqu'on veut afficher l'écran de fin de manche ou de fin de partie, par exemple, il est souhaitable d'afficher l'image une fois que le visage des quatre personnages est généré, sans montrer l'affichage successif de chacun des visages. Petite remarque : le module gint permet également d'importer une fonction
getkey()
pour la reconnaissance de l'appui sur les touches, mais son utilisation ne m'est pas du tout familière, contrairement à la fonction keydown du module ion de NumWorks. C'est donc cette dernière que j'ai utilisée. Finalement, les versions Graph Math+ et Graph 90+E + PythonExtra de mon adaptation du jeu WHIS sont identiques pour ce qui est de la jouabilité et sont quasiment identiques visuellement, à réorganisation près des différents éléments affichés. En effet, le Python de la Graph Math+ donne accès à une zone graphique de 384×192 pixels tandis que PythonExtra utilisé sur la Graph 90+E donne accès à une zone graphique de 396×224 pixels (et il aurait été dommage de se priver de cet espace supplémentaire) !
Ce qui nous donne donc, tout comme dans la version pour la Graph Math+ :
Ce qui nous donne donc, tout comme dans la version pour la Graph Math+ :
- Un bel écran de titre au lancement du jeu.
- Un jeu entièrement bilingue avec deux langues : français et anglais
- Un écran d'accueil coloré qui montre quelques unes des cartes du jeu et qui propose d'en savoir plus sur les Cartes, d'en savoir plus sur les Règles ou de lancer une partie avec Jeu .
- Un menu Cartes qui montre chacune des 14 cartes du jeu et qui donne quelques explications les concernant
- Un menu Règles qui explique les règles du jeu tout en présentant les cartes par élément.
- La possibilité de choisir le nombre de joueurs humains lorsqu'on lance une partie
- La possibilité de choisir les personnages attribués aux joueurs humains, dans le cas d'un nombre compris entre 1 et 3.
- Dans le cas du choix de 0 joueur humain, le choix d'afficher ou non les cartes de chacun des 4 joueurs gérés par la machine lorsque c'est son tour de jouer
- Dans le cas d'un choix d'au moins 2 joueurs humains, la nécessité d'appuyer sur EXE pour afficher les cartes du joueur dont c'est le tour, pour plus de discrétion.
- Un affichage simple sous la forme d'un cadre coloré qui entoure le visage et le score des personnages et qui indique de quel joueur c'est le tour de jouer (cadre violet) et ensuite s'il joue (cadre vert) ou pioche (cadre rouge) une carte.
- Un cadre rouge qui entoure la pioche et montre le nombre de cartes piochées.
- Dans le cas de l'utilisation d'une carte Lumière, Obscurité ou Prisme, un menu de choix de l'élément demandé au joueur suivant.
Ici, Farah joue une des deux cartes Lumière qu'elle a en main (la 2ème se voit à peine) puis choisit Feu. Ensuite, ses cartes sont redessinées et on voit la carte Lumière qu'il lui reste. - Un écran de fin de manche qui résume les scores de chaque joueur
- Un écran de fin de partie qui résume, en couleurs, les scores obtenus par chaque joueur et qui propose de relancer une partie sans même devoir quitter le jeu.
Au fait, comment joue-t-on ?
- On utilise les flèches gauche et droite pour sélectionner une carte ou l'élément demandé dans le cas de l'utilisation des cartes Prisme, Lumière ou Obscurité.
- On valide avec EXE ou F1.
- On pioche volontairement ou on passe son tour volontairement avec la touche Shift.
Et comment lance-t-on le jeu ?
Pour jouer à cette version spécialement améliorée, il faut d'abord copier l'add-in PythonExtra sur la Graph 90+E puis copier le script Python du jeu. Ensuite, depuis la calculatrice, il faut lancer PythonExtra puis aller chercher le script Python dans l'arborescence et le lancer.
Bon jeu !
Pour jouer à cette version spécialement améliorée, il faut d'abord copier l'add-in PythonExtra sur la Graph 90+E puis copier le script Python du jeu. Ensuite, depuis la calculatrice, il faut lancer PythonExtra puis aller chercher le script Python dans l'arborescence et le lancer.
Bon jeu !
Téléchargements :
- Version Casio Graph 90+E (sans accents) : http://ti-pla.net/a4167070
- Fichier de l'add-in PythonExtra nécessaire pour lancer le jeu : https://git.planet-casio.com/Lephenixnoir/PythonExtra/releases/download/pe-0.3.0-beta/PythonExtra-pe-0.3.0-beta.zip