Planète Casio - Tout le forum - Flux RSS http://www.planet-casio.com Programmes Casio, Jeux, Cours pour Calculatrices Casio fr-FR https://www.planet-casio.com/images/logo.gif Planète Casio - Tout le forum - Flux RSS http://www.planet-casio.com 55 50 Programmes Casio, Jeux, Cours pour Calculatrices Casio. Fri, 30 Jul 2021 17:40:34 GMT Fri, 30 Jul 2021 17:40:34 GMT contact@planet-casio.com (Planet Casio) contact@planet-casio.com (Planet Casio) 5 Fonction pour arrondir des valeurs https://www.planet-casio.com/Fr/forums/topic16836--.html Bon, je vous la fais courte : je suis en train de chercher pour arrondir la variable X de telle sorte que : - Seuls les 4 premiers chiffres significatifs sont retenus; - La décimale la plus petite à garder est 0.001 (autrement dit, revient à faire un RndFix(X, 3) ) Voici pour le moment ce que j'ai (les * sont des multiplications) : 10^Intg log Abs X*(RndFix(X,3)*10^-Intg log Abs X+1E11-1E11 Ce code pèse exactement 26 octets (en enlevant les signes de multiplications étant inutiles), et une chose est particulièrement gênante : la fonction n'est pas définie en X=0. Si vous vous demandez ce que font les 1E11 : l'ordre de calcul est le suivant : RndFix(X,3)*10^-Intg log Abs X, qui va arrondir à 3 décimales X puis, grâce à une puissance de 10, "placer" X dans l'intervalle [1,9[. on y ajoute ensuite 1E11, et comme lors d'un calcul seuls 15 chiffres significatifs sont enregistrés cela permet d'arrondir une nouvelle fois notre variable. On ré-enlève ce 1E11, et finalement on remet la variable X à la même puissance de 10 qu'initialement. Cela peut paraître incensé/inutile, mais je n'ai pas trouver d'autre moyen étant donné qu'un RndFix dans un autre provoque une erreur... J'aimerais ne pas à chaque fois tester si X est non nul, c'est pourquoi je fais appel à vous ! ;) N'hésitez pas à changer complètement de méthode, mais j'ai une grosse préférence pour les fonctions que l'on peut enregistrer dans les fonctions graphiques (Y1 par ex) - qui sont faciles à évaluer, merci ! Tue, 27 Jul 2021 21:31:59 +0200 Test des jeux de la Jam Python #1 — Le début du méta Python https://www.planet-casio.com/Fr/forums/topic16835--.html 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. ^^ jam-python-1-banner.png 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 ! jam-python-1-tmmaze.gif 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. ^^ :here: 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 ! jam-python-1-sniper.gif 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 ! :here: 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. https://www.planet-casio.com/storage/program-images/4171-Chute_tridimensionnelle.gif 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. :here: 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. ;) https://www.casio-education.fr/wp-content/themes/casio/assets/images/logo.svg goodies-2021-3.jpg Il convient donc de faire un classement en règle. Bien sûr, mon programme est hors-jeu, ce serait de la triche sinon. :lol: 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. :D 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. :D 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 ! ;) Mon, 26 Jul 2021 23:14:27 +0200 [En cours] Portage de CGDOOM sur Graph 90+E https://www.planet-casio.com/Fr/forums/topic16834--.html Si vous ne connaissez pas, CGDOOM c'est un port pour Prizm (d'un port pour Nspire) de DOOM premier du nom, créé par Martin Poupe. Clairement un des jeux les plus impressionnants qu'on peut trouver sur la plateforme. J'avais déjà essayé de porter CGDOOM sur la Graph 90+E en 2018, mais sans succès. Je l'ai mentionné trivialement dans une réponse sur Cemetech cette année et Martin Poupe l'a relevé, ce qui m'a donné envie d'y retourner. Statut actuel : CGDOOM marche chez plusieurs personnes et a été bien amélioré. J'ai besoin de tests supplémentaires ! :) Téléchargement : CG_Doom.g3a (lien direct) et doom.wad (dans l'archive du programme) Instructions : copier CG_Doom.g3a et doom.wad dans la mémoire de stockage, puis lancer DOOM dans le menu principal. WAD de DOOM Ultimate, pour les aventureux (plus de niveaux) : doomu.wad (renommer `doom.wad` au transfert) Résumé des éléments importants pour les joueurs : Le WAD shareware (`doom.wad`) marche au moins jusqu'à la fin du niveau 4, le WAD de DOOM Ultimate (`doomu.wad`) est encore à tester. Le chargement initial va beaucoup plus vite qu'avec la version originale de CGDOOM (à moitié grâce aux performances de la Graph 90+E, à moitié grâce à des optimisations) et il y a une barre de chargement. Le jeu est tout à fait fluide même sans overlock. On peut appuyer sur plusieurs touches à la fois pendant le jeu (ce qui n'était pas possible avec la version originale). Vidéo (du tout premier essai, j'en ferai une autre rapidement) : https://www.planet-casio.com/storage/staff/CGDOOM-Graph90-1.mp4 Et pour ceux que ça intéresse, quelques éléments techniques : Il a fallu compiler avec libfxcg parce que le mini-SDK est trop vieux (quasiment introuvable) Il y avait des bugs dans le `calloc()` et le `memcpy()` de libfxcg (le premier dur à trouver parce que GCC choisissait de l'appeler mais le code ne le mentionnait pas), ce qui créait des problèmes partout. Je deviens paranoïaque. J'ai fini par utiliser le `memcpy` de la fxlibc. Les fragments de `doom.wad` était cherchées par morceaux de 4 kio. Yatis m'a fait savoir que la seule façon vraiment vraiment safe était de couper par morceaux de 512 octets. Un bon paquet d'optimisations sur les accès à la Flash : tester les secteurs probables en priorités, indexer les plus probables sur une recherche binaire, un peu d'assembleur maison, et un usage judicieux du cache principalement. J'ai modifié l'allocateur interne de DOOM pour pouvoir séparer le tas en plusieurs zones, ce qui permet de fournir plus de mémoire. Les contrôles étaient lus avec le syscall `PRGM_GetKey()`, j'ai remplacé ça par un accès direct au KEYSC pour avoir les pressions simultanées. Mon, 26 Jul 2021 18:34:09 +0200 Interface Graphique Textuel pour Graph 35+ et 90 https://www.planet-casio.com/Fr/forums/topic16832--.html Bonjour les amis ! Je créé ce nouveau Topic pour proposer une partie précise des sources de mon projet que j'ai soumis pour le Jam Python #1 Comme certains l'ont remarqué python (que ça soit sur Graph 35 ou 90) n'est pas le langage le plus adapté pour créer des jeux sous calculatrice. Malgré tout, j'ai tenté de créer une "Moteur Graphique Textuel" conçu pour python. Il sera donc utilisable normalement pour Graph 35 ou 90. Je vais donc détailler son fonctionnement ici. Voici tout d'abord le code au complet : import math dim = [30,8] def Clear(): print(""" """*(dim[1]+1)) class Curseur: def __init__(self): self.LstBoutons=[] self.index = 0 class Bouton: def __init__(self,curseur,Txt): curseur.LstBoutons.append(self) self.curseur = curseur self.text = Txt def GetString(self): if self.curseur.LstBoutons[self.curseur.index]==self: return self.text else: return self.text.replace("["," ").replace("]"," ") class Image: def __init__(self,data): self.data=data def GetWidth(name): w=0 for i in name.split("\n"): if len(i)>w: w=len(i) return w def GetHeight(name): return len(name.split("\n")) def GetImage(name): if name[0]=="\n": name=name[1:] w,h=GetWidth(name),GetHeight(name) Lst = name.split("\n") Screen=[] for i in range(h): temp=[] for o in range(w): temp.append(" ") Screen.append(temp) for Y,i in enumerate(Lst): for X,o in enumerate(i): (Screen)=o return Screen class StringVar: def __init__(self,data): self.data=data class Interface: def __init__(self): self.curseur = Curseur() self.Widgets = [] self._lastCmd="" def FindIndexOfWidget(self,adress): for i in range(len(self.Widgets)): if (self.Widgets)[0]==adress: return i def Clear(self): self.Widgets = [] self._lastCmd="" self.curseur.index = 0 self.curseur.LstBoutons=[] def Print(self): Screen=[] for i in range(dim[1]): temp=[] for o in range(dim[0]): temp.append(" ") Screen.append(temp) for i in self.Widgets: Text = "" try: if type(i[0])==Image: x,y=i[3],i[2] for indY,y1 in enumerate(i[0].data): for indX,x1 in enumerate(y1): try: (Screen[indY+y])[indX+x]=x1 except:pass else: if type(i[0])==str: Text=i[0] elif type(i[0])==StringVar: Text=str(i[0].data) elif type(i[0])==Bouton: Text=i[0].GetString() if i[1]=="PlaceCenter": x=int((dim[0]/2)-math.ceil(len(Text)/2)) for x1,lettre in enumerate(Text): (Screen[i[2]])[x+x1]=lettre elif i[1]=="Locate": x=i[3] for x1,lettre in enumerate(Text): (Screen[i[2]])[x+x1]=lettre except: pass for i in Screen: line = "" for o in i: line+=o print(line) def Draw(self): self.Print() cmd = input() self._lastCmd = cmd if cmd=="": return self.curseur.index,cmd,self.curseur.LstBoutons[self.curseur.index] else: return None,cmd,None def RemoveWidget(self,adress): if type(adress)==Bouton: self.curseur.LstBoutons.remove(adress) self.curseur.index=0 for i in range(len(self.Widgets)): if (self.Widgets)[0]==adress: del self.Widgets return def PlaceCenter(self,obj,Ln): self.Widgets.append([obj,"PlaceCenter",Ln]) def Locate(self,obj,Ln,Col): self.Widgets.append([obj,"Locate",Ln,Col]) def UpdateCursor(self): if self._lastCmd in ["8","4","6","2"]: x,y=0,0 for i in self.Widgets: if type(i[0])!=Bouton: continue Text = i[0].GetString() if i[0]==self.curseur.LstBoutons[self.curseur.index]: if i[1]=="PlaceCenter": x=int((dim[0]/2)-math.ceil(len(Text)/2)) y=i[2] elif i[1]=="Locate": x=i[3] y=i[2] direction=[None,100] for i in self.Widgets: if type(i[0])!=Bouton: continue dis = 100 x1,y1=0,0 Text = i[0].GetString() if i[1]=="PlaceCenter": x1,y1= int((dim[0]/2)-math.ceil(len(Text)/2)),i[2] elif i[1]=="Locate" : x1,y1= i[3],i[2] dis = math.sqrt(((y1-y)**2)+ (x1-x)**2) if self._lastCmd=="8": if y1<y and dis<direction[1]: direction=[i[0],dis] if self._lastCmd=="2": if y1>y and dis<direction[1]: direction=[i[0],dis] if self._lastCmd=="4": if x1<x and dis<direction[1]: direction=[i[0],dis] if self._lastCmd=="6": if x1>x and dis<direction[1]: direction=[i[0],dis] if direction[0]!=None: self.curseur.index = self.curseur.LstBoutons.index(direction[0]) def WaitBouttonInput(self): retour = None while retour == None: retour , _ , _ = self.Draw() if retour == None: self.UpdateCursor() return retour def BoiteConfirmValide(txt): interface = Interface() txt = txt.split(" ") interface.Locate("#"*dim[0],0,0) y=1 while len(txt)>0: msg="" while len(txt)>0 and len(msg)+len(txt[0])<dim[0]-3: msg+=" "+txt.pop(0) interface.Locate(msg,y,0) y+=1 interface.Locate("#"*dim[0],dim[1]-1,0) interface.Locate(Bouton(interface.curseur," "),dim[1]-1,int((dim[0]/4)-math.ceil(7/2))+1) interface.Locate(Bouton(interface.curseur," "),dim[1]-1,int((3*dim[0]/4)-math.ceil(7/2))) return interface.WaitBouttonInput() == 0 def BoiteConfirmOK(txt): interface = Interface() txt = txt.split(" ") interface.Locate("#"*dim[0],0,0) y=1 while len(txt)>0: msg="" while len(txt)>0 and len(msg)+len(txt[0])<dim[0]-3: msg+=" "+txt.pop(0) interface.Locate(msg,y,0) y+=1 interface.Locate("#"*dim[0],dim[1]-1,0) interface.PlaceCenter(Bouton(interface.curseur," "),dim[1]-1) interface.Draw() return True def MainMenu(Titre): Clear() interface = Interface() interface.PlaceCenter((len(Titre)+2)*"=",0) interface.PlaceCenter(" "+Titre+" ",1) interface.PlaceCenter((len(Titre)+2)*"=",2) interface.PlaceCenter(Bouton(interface.curseur,"[Commencer une partie]"),4) interface.PlaceCenter(Bouton(interface.curseur,"[Entrer un code] "),5) interface.PlaceCenter(Bouton(interface.curseur," "),7) return interface.WaitBouttonInput() La variable Dim est très importante, comme vos aurez pus le deviner c'est les dimensions de l'écran. (pour Graph 35 les dimensions sont 30x8) La fonction Clear permet de "nettoyer" l'écran. Pour être précis, l'écran n'est jamais nettoyé, il défile plutôt, c'est-à-dire que si vous appuyez sur la flèche du haut, vous vos apercevrez qu'il y a les anciens affichages. La Class Curseur sert à pointer un Bouton (c'est comme une souris d'ordinateur) La Class Bouton est comme son nom l'indique permet de créer un bouton, on lui donne un curseur et son texte en entrée. Il est obligatoire de mettre entre crochets le texte que vous souhaitez (exemple : "") Exemple de bouton : curseur = Curseur() Bouton(curseur,"[Commencer une partie]") Mais jusqu'à présent tout ça ne sert a rien sans la Class "Interface". Cette Class permet de manipuler facilement les éléments présentés ci-dessus. C'est à dire qu'elle permet de se balader facilement sur un menu par exemple et se charge de l'affichage ainsi que l'ordre de déplacement du curseur sur les Boutons. Pour placer un élément on peut utiliser les fonctions PlaceCenter et Locate. PlaceCenter permet de placer au centre d'une ligne l'élément voulu. (PlaceCenter(élément,ligne) Exemple : interface = Interface() interface.PlaceCenter("Tire du jeu",0) interface.PlaceCenter(Bouton(interface.curseur,"[Commencer une partie]"),4) Quant à Locate, cette fonction permet de placer un élément à des coordonnées exactes. (Locate(élément,ligne,colonne) Exemple : interface = Interface() interface.Locate("Coucou",0,0)#place "coucou" sur le coin supérieur gauche interface.Locate("Coucou",dim[1]-1,0)#place "coucou" sur le coin inférieur gauche Maintenant qu'on a placé les éléments, on peut les afficher, et il existe 3 manières de le faire. -Print -Draw -WaitBouttonInput Print affiche juste l'interface. (cette fonction renvoie None) Quant à Draw, cette fonction effectue un Print puis attend une entrée de l'utilisateur. (cette fonction renvoie l'index du curseur,l'entrée brut et le bouton qui est sélèctionné par le curseur. Pour finir, la fonction WaitBouttonInput (qui est la plus conseillé) attent que l'utilisateur valide sont choix (renvoie l'index du bouton sélèctionner). Exemple: def Confirm(): interface = Interface() interface.PlaceCenter("Voulez-vous quittez ?",0) interface.PlaceCenter(Bouton(interface.curseur," "),3)#index = 0 car initialisé en premier interface.PlaceCenter(Bouton(interface.curseur," "),4)#index = 1 car initialisé en second etc... return interface.WaitBouttonInput() == 0#renvoie True si est sélectionné Comme python est capricieux, il n'existe pas de GetKey, il a fallu créer un système pour contrôler l'interface. Tout d'abord, oubliez la croix directionnelle de votre calculatrice ! La croix directionnelle est remplacée par les touches 2,4,6,8. 8 : Haut 4 : gauche 6 : droite 2 : bas Chaque action doit être validée par la touche EXE (par exemple si vous voulez aller en haut appuyez sur 8 puis EXE) Autrement dit, pour effectuer une action vous devez appuyer sur au moins deux touches. Vous pouvez aussi supprimer les éléments d'une interface en utilisant RemoveWidget. Exemple : interface = Interface() interface.PlaceCenter("coucou",0) interface.RemoveWidget("coucou") Exemple 2 : interface = Interface() btn=Bouton(interface.curseur,"[Commencer une partie]") interface.PlaceCenter(btn,4) interface.RemoveWidget(btn) Maintenant je vais vous présenter d'autre type qui existe : Image et StringVar Oui c'est possible d'afficher des images faites en caractère ascii Exemple : un coffre __________ /\____;;___\ | / / ./_________/ |\ \ | |---------| \ | )) | \|_________| Exemple 2 : Un soldat | _|_ o __ I /|\)_) / \ Le double slash est indispensable donc les images ci-dessus devrai être : player1=""" | _|_ o __ I /|\\)_) / \\ """ chest=""" __________ /\\____;;___\\ | / / ./_________/ |\\ \\ | |---------| \\ | )) | \\|_________| """ Ensuite, il faut transformer cette chaine de caractère en Image donc pour faire ça voici le code : player1_Image=Image(GetImage(player1)) Puis on peut l'afficher sur l'interface avec Locate (PlaceCenter ne fonctionne pas pour les Images) Exemple : player1_Image=Image(GetImage(player1)) interface = Interface() interface.Locate(player1_Image,0,0) Pour finir, la Class StringVar permet de changer le texte de l'interface. Exemple sans StringVar: interface = Interface() interface.PlaceCenter("test",0) interface.RemoveWidget("test") interface.PlaceCenter("test 2",0) Exemple avec StringVar: interface = Interface() txt = StringVar("test") interface.PlaceCenter(txt,0) txt.data = "test 2" Une interface doit toujour contenir au moins un bouton même s'il est invisible Exemple de bouton invisible : interface = Interface() interface.Locate(Bouton(interface.curseur,""),-1,-1) Dans le code intégral vous trouverez trois fonctions supplémentaire : BoiteConfirmValide et BoiteConfirmOK et MainMenu Dont je vous laisse le soin de découvrir leur utilité par vous même. Bug que vous allez sûrement rencontrer : "Maximum recursion depth exceeded" Ce bug arrive quand vous faites trop d'appel d'initiation de class à la suite. Exemple où ça risque de planter : Class A: def __init__(self): pass Class B: def __init__(self): self.a = a() Class C: def __init__(self): self.b = B() Class D: def __init__(self): self.c = C() d= D() Donc pour palier à cela, vous pouvez transformer ce code : class Fight: def __init__(self,plateau,monster): self.interface = Interface() etc... class PlateauDeJeu: def __init__(self,x,y): self.fight = Fight(self,"Monstre1") etc... pdj = PlateauDeJeu(0,0) en : interfaceFight=Interface() class Fight: def __init__(self,plateau,monster): interfaceFight.Clear() self.interface = interfaceFight etc... class PlateauDeJeu: def __init__(self,x,y): self.fight = Fight(self,"Monstre1") etc... pdj = PlateauDeJeu(0,0) Voilà, j'espère que cela vous sera utile. Sat, 24 Jul 2021 19:56:55 +0200 Résultat du vote du Jeu du Mois de Juin 2021 https://www.planet-casio.com/Fr/forums/topic16831--.html Bonjour à tous ! Après quelques semaines d'attentes (à vrai dire j'avais oublié, vous pouvez me taper), voici les résultats du vote du jeu du mois de Juin ! En pleine période olympique, venez découvrir avec nous le podium et les différentes médailles ! Pour rappel, seulement 3 jeux étaient à l'honneur en Juin. Sans plus tarder, voici les résultats : - En troisième place avec la médaille de bronze, Protomine de KikooDX avec ses 3 points - En seconde place et sa médaille d'argent, le grand Heartache demo de Masséna avec ses 4 points - Et la médaille d'or, le champion olympique : Plague de Shadow15510 avec ses 9 points et remportant les premières places sur l'ensemble des votes ! news_rdp212.png https://www.planet-casio.com/storage/forums/titre3-163523.pngJe ne sais pas qui a dessiné ça mais c'est beau :whistle: En cette période pandémique, arriverez-vous à contaminer le monde avec votre virus ? Danc cette adaptation du jeu original vous n'avez la possibilité que d'activer 3 capacités en même temps. Couplé à la recherche boostée aux stéroïdes, vous pouvez y passer du temps ! = Lien du jeu = Tu as donc le droit de mettre le magnifique trophée JDM sur la page du programme ! Trophee_JDM.png Trophee_JDM.png Un grand bravo à Shadow15510 et son adaptation qui a su séduire ! Je profite de l'occasion pour vous annoncer la fin du développement de la version couleur, nous devrions la poster d'ici peu :p Bravo à tous et encore une fois, À bientôt sur Planète Casio ! Sat, 24 Jul 2021 00:24:57 +0200 fxIP : Implémentation TCP/IP, avec client IRC et serveur web ! https://www.planet-casio.com/Fr/forums/topic16830--.html Plus tôt dans le mois, Manawyrm nous a présenté une nouveauté impressionnante : un port d'un client TCP/IP pour sa fx-9750G II (équivalent à la Graph 35+USB). Le programme utilise un port de µIP, et s'en sert pour supporter un client IRC, et même un serveur web permettant d'accéder à une page web hébergée sur sa calculatrice ! :D Tenez-vous bien à vos chaises, c'est une sacrée affaire ! Topic original : » fxIP - TCP/IP stack, IRC client and webserver « (en anglais) Page Github du projet : github.com/Manawyrm/fxIP (en anglais aussi) Le client TCP/IP fxIP utilise un port de µIP (projet Github) qui est une mini-implémentation du protocole TCP/IP. µIP permet de créer et décoder des paquets IP (qui sont des messages dans le protocole d'Internet) et des paquets TCP (un protocole qui étend IP en garantissant que les messages arrivent intacts et dans le bon ordre). La calculatrice qui exécute fxIP communique avec un ordinateur par le biais du câble 3-pin qui est connecté à un port série. La calculatrice dispose de sa propre adresse IP (attribuée par l'ordinateur), de sorte que tous les messages à destination de la calculatrice qui passent par l'ordinateur lui sont transférés. Normalement on ne peut pas utiliser le protocole TCP/IP directement sur une liaison série parce qu'on ne peut pas détecter la fin des paquets, donc fxIP envoie des messages dans le protocole SLIP qui ajoute une marqueur de paquet. Voyez le détail de la configuration réseau ici. Notez que le driver série n'est pas disponible dans gint, donc Manawyrm et TobleMiner ont encapsulé les syscalls de communication série. ^^ Le résultat de cet effort, c'est que la calculatrice devient un objet connecté à Internet par le biais de son ordinateur, et peut communiquer avec d'autres machines et serveurs. :D On peut voir par exemple sur cette capture que la calculatrice répond au ping de l'ordinateur. https://camo.githubusercontent.com/197f687a28b489bde0e4dd51d3463fad4ec6c62c5304c1bcd11e902782404670/68747470733a2f2f73637265656e73686f742e746273706163652e64652f7577616f6e746665716c6b2e706e67 Source : Manawyrm/fxIP Client IRC La suite évidemment c'est de programmer des applications qui accèdent au réseau. Pour ça, fxIP contient un client IRC qui se connecte automatiquement à libera.chat (le successeur de freenode déchu), ce qui en fait un véritable chat Internet sur la calculatrice !! https://www.youtube.com/watch?v=afkrucsMMrc Les messages échangés avec le serveur IRC sont stockés dans un buffer tournant pour conserver un historique. Comme promis, c'est une sacrée affaire. :lol: Vidéo supplémentaire : une calculatrice compose un numéro de téléphone par le port série Serveur web Et ce n'est pas tout, parce que Manawyrm a aussi profité d'avoir sa calculatrice en réseau pour en faire un serveur web et y héberger une page accessible par le public ! Vous pouvez voir une capture de la première version ci-dessous ou visiter directement le site à l'adresse http://fxip.as203478.net/ (avec presque l'uptime d'un vrai serveur professionnel :lol: ). https://www.planet-casio.com/storage/forums/fxip-screenshot-16830.jpg La calculatrice fait tourner le serveur HTTP complet et envoie la page directement à votre navigateur, l'ordinateur ne sert que comme pont pour accéder à Internet. Si vous n'êtes pas familier avec les technologies web ça peut être un peu dur à voir, mais c'est un énorme boulot qui est fait côté calculatrice ! ;) Dans tous les cas l'exploit est impressionnant. Il ne reste plus qu'à coller une ESP8266 (petit composant électronique pouvant échanger en WiFi) dans le boîtier pour donner à fxIP la mobilité et les capacités d'un véritable objet connecté ! :lol: Conclusion fxIP repousse les limites de la communication série/réseau sur calculatrice CASIO, en portant sur une fx-9750G II (Graph 35+USB) les protocoles fondamentaux du web, TCP et IP. En utilisant un ordinateur comme point d'accès via la liaison série, fxIP peut discuter sur des salons IRC publics et même servir de serveur web en utilisant les protocoles standard. Bravo Manawyrm et TobleMiner pour le superbe défi technique ! o/ Et à bientôt sur Planète Casio ! ;) Thu, 22 Jul 2021 15:35:12 +0200 source des modules python https://www.planet-casio.com/Fr/forums/topic16829--.html Bonjour concernant les modules python de la Casio 90E ou 35+E Est-il possible d’en obtenir les sources ? Ceci afin d’essayer d’étudier les mécanismes internes. Merci Wed, 21 Jul 2021 21:21:51 +0200 Jam Python #1 - Harmonie à trois ! https://www.planet-casio.com/Fr/forums/topic16828--.html Bienvenue à tous dans la Jam Python #1 de Planète Casio ! :D jam-python-1-logo.png Cet événement est le premier concours de programmation Python sur le site, et les options disponibles pour coder des jeux n'ont pas encore été explorées en détail. Tout le monde est à égalité, il suffit de quelques astuces bien placées pour avoir un avantage sur un jeu bien pensé. ^^ Le thème pour cette fois est : « Harmonie à trois » C'est léger exprès pour ne pas réduire les options en termes de programmation et de gameplay, je le propose plus pour guider l'imagination que pour imposer des choix de conception. ;) Pour participer, publiez sur le site un jeu en Python avant Samedi 24 Juillet, 18 heures, et annoncez-le par un commentaire dans ce sujet. :) Vous pouvez voir l'ensemble des règles et certaines techniques utiles sur le topic de l'annonce, je vous rappelle juste les principaux modèles concernés : https://www.planet-casio.com/images/icones/calc/g35+e2.png Graph 35+E II (avec l'application PYTHON) https://www.planet-casio.com/images/icones/calc/g90+e.png Graph 90+E (avec l'application PYTHON) https://www.planet-casio.com/images/icones/calc/g35+e.png Graph 35+ USB/35+E (avec CasioPython) https://www.planet-casio.com/images/icones/calc/g75+e.png Graph 75/75+/75+E (avec CasioPython) La meilleure participation remportera une clé USB émulateurs, généreusement offerte par CASIO Éducation, qui contient une copie de tous les émulateurs de CASIO (utilisables sans limite de durée) et qui reçoit même les mises à jours. :D https://www.casio-education.fr/wp-content/themes/casio/assets/images/logo.svg goodies-2021-3.jpg Bon courage à tous, je compte sur vous pour poussez les possibilités du Python ! :bounce: Sat, 17 Jul 2021 22:12:14 +0200 [Annonce] Jam Python #1 https://www.planet-casio.com/Fr/forums/topic16827--.html Salut à tous ! Les vacances sont toutes fraîches, mais ce n'est pas une raison pour laisser filer les calculatrices. Au contraire, c'est le moment de lancer les jeux vidéo dessus ! :lol: La semaine prochaine aura lieu la toute première Game Jam Python de Planète Casio. ;) jam-python-1-logo.png Le principe est aussi simple que possible : pour participer, publiez sur le site un jeu en Python, construit sur le thème qui sera annoncé Samedi 17 à 18 heures, avant Samedi 24 à 18 heures. ;) Les capacités du Python pour faire des jeux n'ont pas encore été explorées très en détail, donc pas d'inquiétudes, le thème sera large et se prêtera à tous les genres de jeux (ou presque) pour ne pas vous limiter. ^^ Le meilleur programme recevra clé USB émulateurs CASIO permanente qui contient tous les émulateurs de CASIO utilisables sans limite de durée. Ils reçoivent même des mises à jour de temps en temps, comme des nouvelles applications. Ce lot est offert généreusement par CASIO Éducation. :D https://www.casio-education.fr/wp-content/themes/casio/assets/images/logo.svg goodies-2021-3.jpg Petite fiche de rappel : Dates : du Samedi 17 (18 heures) au Samedi 24 (18 heures) Langage : Python uniquement (n'importe quelle implémentation) Thème : révélé Samedi 17 à 18 heures Lot : une clé USB contenant tous les émulateurs CASIO (avec mises à jour) Instructions de participation : il suffit d'avoir un compte et de poster le programme dans les dates. Il n'y a pas besoin de s'inscrire/déclarer à l'avance, mais ça m'aide si vous le faites. ^^ Informations utiles Voici les (principaux) modèles qui peuvent participer à cet événement : https://www.planet-casio.com/images/icones/calc/g35+e2.png Graph 35+E II (avec l'application PYTHON) https://www.planet-casio.com/images/icones/calc/g90+e.png Graph 90+E (avec l'application PYTHON) https://www.planet-casio.com/images/icones/calc/g35+e.png Graph 35+ USB/35+E (avec CasioPython) https://www.planet-casio.com/images/icones/calc/g75+e.png Graph 75/75+/75+E (avec CasioPython) Vous pouvez accéder au tutoriel de transfert pour chaque modèle à partir du comparateur de calculatrices. Pour ceux qui ne sont pas tout à fait familiers avec les jeux en Python, voici un rappel de quelques astuces ! Interagir avec le clavier avec `input()` : vous pouvez interagir avec l'utilisateur en utilisant la fonction `input()` pour lire une entrée textuelle. Cependant, ça ne marche que sur le shell (l'écran texte). Interagir avec AC/ON dans l'écran graphique : vous pouvez interagir avec la touche AC/ON à tout moment, même en mode graphique, parce que AC/ON produit une exception `KeyboardInterrupt`. try: while True: pass except KeyboardInterrupt: # AC/ON a été pressé ! Afficher des pixels à l'écran : les Graph 35+E II et Graph 90+E disposent du module `casioplot` qui permet de dessiner à l'écran. Il y a une présentation de casioplot dans cet article de l'an dernier et une description plus complète sur cette page de wiki. ;) Afficher des formes plus complexes : vous pouvez trouver des fonctions de dessin plus complexes comme des rectangles et des lignes dans `turtle.py` et `matplotl.py`, les codes des modules `turtle` et `matplotl` de CASIO (plus précisément les versions qui existaient avant que ces modules ne soient intégrés à l'OS). Autres outils de dessin : vous pouvez utiliser GeoLib de Shadow15510 : (le topic ici et le programme ici), Sprito de KikooDX (le topic ici). Autres sources d'inspiration : regardez par exemple le concours de démos graphiques de l'an dernier, l'usage de Sprito pour afficher du texte personnalisé ou encore le moteur de map de RPmaker. Bon courage à tous, et amusez-vous bien en explorant les possibilités de ce langage encore nouveau et qui peut en faire plus que ce qu'on soupçonne ! :bounce: Tue, 13 Jul 2021 22:53:23 +0200 fxIP - TCP/IP stack, IRC client and webserver https://www.planet-casio.com/Fr/forums/topic16826--.html Hello! Je m'excuse de ne pas parler français. J'espère que ça ne pose pas de problème que j'écrive en anglais ici. ^^ I wrote fxIP, a port of uIP to Casio fx-Calculators, an IRC client and a webserver. https://github.com/Manawyrm/fxIP Using the 2.5mm serial port, SLIP-encapsulated IPv4 packets can be sent to the calculator. It could even be connected to a modem directly :lol: I made a short YouTube-clip showing the IRC client (while chatting on libera): https://www.youtube.com/watch?v=afkrucsMMrc If you're very quick, http://casio.as203478.net/ is a webpage directly hosted on my casio. It might not be available anymore in a few hours/days... It uses the fantastic fxsdk by lephenixnoir, and we added rudimentary serial support. fxsdk really is a fantastic pice of software, one of the best libraries I've used. Thank you very much for making it! Best regards Tobias (manawyrm) Mon, 12 Jul 2021 21:36:28 +0200