Test des jeux de la Jam Python #1 — Le début du méta Python
Posté le 26/07/2021 23:14
Bonjour à vous chers lecteurs et lectrices ! Aujourd'hui on teste ensemble les jeux de la
Jam Python #1. C'est le format habituel (concours avec un lot), mais comme il y a peu de participations (2 programmes plus un annexe) je vous propose d'étendre l'article des résultats un peu et de détailler le gameplay.
Le contexte est un peu spécial : Python a été introduit il y a quelques années au programme du lycée, et le support Python dans les calculatrices graphiques est maintenant stable. Mais le langage est très différent des autres options principales, le Basic CASIO (de l'application PRGM) et le C (des add-ins). Les forces et les faiblesses de l'interpréteur présent sur les calculatrices CASIO n'ont pas vraiment été explorées. Pour l'instant, il n'y a donc pas vraiment de méta sur les techniques de programmation Python les plus utiles pour écrire des programmes complexes et des jeux.
Commençons par tester les jeux, on parlera du code ensuite !
The Master Maze (Farhi)
Dans
The Master Maze, vous devez trouver votre chemin à travers un labyrinthe de monstres et de trésors. C'est un véritable petit RPG dans la console de CasioPython, très immersif !
Pour ce jeu Farhi a programmé une
interface graphique en mode textuel qui est responsables des boutons que vous pouvez à l'écra et qu'on contrôle avec les directions 2/4/6/8 du clavier à chaque
input().
Vous avez trois personnages que vous pouvez alterner pour progresser dans un petit donjon avec des monstres. L'ASCII art des monstres montre bien qu'il y a du potentiel supplémentaire par rapport au Basic CASIO parce que la grille de CasioPython est plus grande que celle de PRGM (30x9 contre 21x7).
J'ai trouvé le jeu très immersif, les graphismes sont vraiment soignés et le défilement du texte a un petit côté hypnotique qui marche très bien à mon goût.
Télécharger The Master Maze (
télécharger CasioPython)
Sniper (Forestiger)
Dans
Sniper, vous devez toucher le centre d'une cible autant de fois que possible avec 10 tirs. Chaque tir peut tomber dans un de 5 anneaux, pour un score de 1 à 5 par tir. Comme vous pouvez le voir, le jeu utilise entièrement le mode graphique sans le shell, et fonctionne en temps réel !
Le viseur tremble à cause de la tenue imparfaite de l'arme à feu, donc il faut ajuster le timing pour tirer quand on passe au centre de la cible. Le mouvement est aléatoire et de vitesse variable donc c'est pas tout à fait évident. Le score final est la somme des scores de chaque tir, avec un maximum de 50. (J'ai fait 42 à ma première partie, évidemment
)
On tire avec AC/ON qui est détecté par l'exception
KeyboardInterrupt. Il faut éviter d'appuyer sur AC/ON durant l'animation de rechargement, sinon le programme est interrompu pour de vrai.
C'est assez prenant, surtout quand on tient une séquence de centres. Le jeu n'a pas de composante temps dans le score, mais on pourrait compter ça aussi pour pimenter les parties, je sens venir la course au 50 !
Télécharger Sniper
Chute tridimensionnelle (Lephenixnoir)
Dans
Chute tridimensionnelle, vous devez sauter de plateforme en plateforme dans un tunnel généré aléatoirement. Il y a deux contrôles : tourner de 90° pour atteindre la plateforme de droite, et tourner de 180° pour atteindre celle du haut. Le jeu est là aussi en mode graphique et en temps réel.
On tourne vers la droite avec un appui simple sur AC/ON et on inverse vers le haut avec un appui double. Tant qu'on est sur une plateforme et loin de tout obstacle le score augmente, sinon il diminue.
Il y a trois types de régions : des régions vertes avec un itinéraire unique qu'il faut suivre, des régions rouges où il faut esquiver les obstacles, et des régions bleues (les plus difficiles) qui mélangent un peu des deux.
Ce jeu cherche surtout à être immersif par les effets 3D et le temps réel : la course se poursuit à l'infini, et le défi s'estompe assez vite quand on maîtrise bien les contrôles.
Télécharger Chute tridimensionnelle
Classement pour la Jam Python #1
Comme la plupart des game jam qu'on organise sur Planète Casio, il y avait un lot à gagner : une clé USB émulateurs offerte par CASIO Éducation, qui contient une copie de tous les émulateurs de CASIO débloqués sans limite de durée.
Il convient donc de faire un classement en règle. Bien sûr, mon programme est hors-jeu, ce serait de la triche sinon.
Le classement est tout simplement l'ordre dans lequel je vous ai présenté les participations :
- The Master Maze
De tous les programmes Python qu'on a croisés sur le site jusqu'à présent, The Master Maze me semble le mieux suggérer ce que des gros projets Python pourront être dans le futur. Le travail pour créer l'interface graphique peut sembler superficiel de loin, mais c'est ce genre de mécaniques qui permet de créer des programmes solides même dans des environnements limités (comme un shell qui ne fait que descendre).
Le gameplay est encore léger, mais pour le but de cet événement qui est de montrer les possibilités du Python, c'est réussi ! On attend avec espoir des mises à jour pour en faire le premier RPG classique Python du site.
- Sniper
Sniper montre exactement ce que Python peut faire que le Basic CASIO ne peut pas : un mode graphique fluide et en pleine résolution avec des méthodes de tracé complexes. Les programmes Basic sont bien connus pour contourner de diverses façons la lenteur de l'affichage direct (Pictures, Super DrawStat...) mais ici on a la liberté de dessiner chaque frame différemment et à partir de 0.
Évidemment, le défaut de n'avoir qu'une touche est mis en exergue, mais ça n'empêche pas de faire des jeux simples ni de combiner avec l'usage d'input() comme le font The Master Maze ou par exemple la démo de point-and-click de Dark Storm, PyCPaCPoC.
Merci beaucoup à
Farhi et
Forestiger pour toute la matière à décortiquer.
Farhi remporte du coup la clé USB émulateurs (je te contacterai par MP pour discuter des détails), bravo ! o/
Le début du méta Python
Comme vous pouvez le voir, ces premiers programmes esquissent le futur méta Python pour les jeux et programmes.
Pour les lecteurs moins familiers avec Python sur CASIO par rapport aux autres langages, voici un petit résumé pour vous mettre dans le bain.
- Le langage est à peu près aussi accessible que le Basic, et donc beaucoup plus facile à approcher que le C.
- Le dessin utilise du double-buffering, c'est-à-dire qu'on prépare une image en interne et qu'on l'affiche à l'écran une fois finie seulement. Ça diffère du Basic CASIO où toutes les opérations graphiques se font directement à l'écran. Le dessin en Python a donc beaucoup de potentiel pour être très rapide.
- D'un autre côté, on n'a que deux fonctions (set_pixel() et draw_string() du module casioplot), donc les fonctions de dessin plus compliquées doivent être codées en Python.
- Python a des structures de données : listes, tuples, ensembles, dictionnaires, ce qui est incroyablement utile. En Basic CASIO il n'y a que des listes et des matrices numériques. En C on peut coder ce qu'on veut, mais c'est très fastidieux, donc Python est de loin le meilleur.
- En termes de performances en général, Python est sans trop de doute meilleur que le Basic CASIO, tout en restant un bon cran en-dessous des add-ins.
- Par contre, on ne peut pas lire les entrées clavier sauf avec input() ou l'exception KeyboardInterrupt, ce qui limite énormément les options pour les jeux en mode graphique.
Je vais profiter de l'occasion pour revenir sur quelques points techniques utiles aux futurs programmeurs Python.
Composants réutilisables : la première chose à ne pas sous-estimer est l'usage de bibliothèques. Par exemple
les interface graphique de Farhi, ou bien
GeoLib de Shadow15510, ou bien
Sprito de KikoODX. C'est classique pour les add-ins, mais un peu fastidieux ; et c'est essentiellement impossible à faire sous une forme aussi modulaire en Basic CASIO. L'usage des bibliothèques facilitera beaucoup de choses compliquées en Python, parce que tout le code subtil peut être écrit une seule fois et partagé !
Utilisation de AC/ON comme entrée clavier : à la fois Sniper et Chute tridimensionnelle utilisent AC/ON comme touche de saisie. J'ai pas mal expérimenté avec dans mon propre programme, et on peut assez aisément gérer les doubles ou triples pressions. On peut aussi se protéger très efficacement contre les interruptions malencontreuses avec des
try bien placés. La seule vraie limitation c'es que ça interrompt le frame, qu'il faut donc recommencer.
Fonctions de dessin compliquées : Sniper contient des fonctions de dessin pour des lignes et des arcs de cercle. Même si la méthode choisie est imparfaite (très efficace à coder mais chère en calculs), le principe de dessiner toutes les formes à base de
set_pixel() en temps réel est une vraie nouveauté par rapport au Basic. En plus, on peut faire des bibliothèques pour éviter de les recoder tout le temps. Les performances sont loin d'atteindre celles des add-ins (Chute tridimensionnelle passe la majorité de son temps à dessiner les lignes, d'où la fenêtre réduire) mais une fois les bons mécanismes Python trouvés je n'ai pas de doute que ce sera très optimisé.
Si vous avez d'autres retours d'expériences ou éléments techniques à suggérer pour raffiner cette description du développement Python sur CASIO, les commentaires n'attendent que vous.
À bientôt sur Planète Casio !
Citer : Posté le 27/07/2021 01:18 | #
Nice ! Content que ce jeu vous ait plu !
Et j'espère que mon système d'interface ouvrira de nouvelles portes pour la création de programmes sur Python !
Albert Einstein
Citer : Posté le 27/07/2021 06:31 | #
Very inspiring comment! Now I start to like CASIO python.
And congratulations to Farhi!
Citer : Posté le 27/07/2021 10:02 | #
Nice ! Content que ce jeu vous ait plu !
Et j'espère que mon système d'interface ouvrira de nouvelles portes pour la création de programmes sur Python !
Bravo à toi ! Au fait j'ai oublié de le mentionner mais le jeu ne tourne pas sur l'application PYTHON (le bug exact est l'absence d'enumerate), si tu peux le porter je suis sûr que l'audience sera beaucoup plus large (MicroPython est un peu niche quand même !)
Very inspiring comment! Now I start to like CASIO python.
That's nice to hear! The limitations can be frustrating sometimes, but I'm confident it will be more pleasing to use over time. The same happened to me with CASIO Basic; being used to C, I used to be annoyed at all the quirks, but now that I more or less know how to use them it's a lot more fun.
I'm thinking it would be a good idea to program and time drawing functions for more geometry, maybe contribute that to GeoLib.
Citer : Posté le 27/07/2021 10:55 | #
Merci
Je vais remplacer les enumerate, et si vous avez des idées pour l'améliorer n'hésitez pas à me le faire savoir.
Albert Einstein
Citer : Posté le 27/07/2021 12:15 | #
J'ai trouvé l'ASCII art des monstres complètement délirant, il y a sans doute moyen d'en transposer un peu sur le donjon. Je sais pas trop ce que ça donnerait sur l'appli PYTHON parce qu'il y a moins de lignes, mais au pire on peut toujours envisager un backend graphique pour ta lib (ie. ajouter une option pour utiliser non pas print mais une fonction de dessin avec une police personnalisée) pour avoir la bonne taille.
Les mécaniques de combat manquent un peu de dynamique je trouve, on a tendance à beaucoup bruteforce. S'il pouvait y avoir des différences marquées entre les trois joueurs (par exemple chacun un skill unique avec un effet différent), alors on aurait beaucoup plus envie de changer. J'ai vu que les boucliers sont différents mais je ne sais pas si ça a un effet d'ailleurs.
Citer : Posté le 30/07/2021 19:03 | #
C'est fait ! J'ai remplacé les enumerate, et j'ai rajouté deux, trois ajouts :
Il y a maintenant des coups critiques.
Capacités :
Pierre a moins de chance de se faire toucher, et quand il se protège, il récupère 1 point de vie supplémentaire que les autres.
Paul a plus de chance de toucher l'ennemi, et quand il se fait toucher, il subit moins de dégâts.
Jack a plus de chance de faire un Coup Critique, et ses Coups Critiques font plus de dégâts.
Quand aux boucliers, il servait juste à reconnaitre le personnage qu'on joue.
Voilà, bon amusement
Albert Einstein
Citer : Posté le 30/07/2021 21:12 | #
Bravo à tous ! vous êtes tous bons voire excellents !