π
<-

Le jeu Orlog sur la Casio Graph Math+

Le jeu Orlog sur la Casio Graph Math+

Postby Afyu » 15 Jun 2024, 22:31

Il y a quelques jours, je te présentais dans deux précédents articles mon adaptation du jeu Orlog, un mini-jeu de dés et de jetons issu du jeu Assassin's Creed : Valhalla, en une version pour NumWorks Epsilon, une version pour NumWorks Upsilon légèrement améliorée, ainsi qu'une version compatible Graph 90+E qui tire parti de sa grande mémoire de travail et des formidables possibilités offertes par l'add-in PythonExtra.
199911999720004

19006Mais la rumeur dit qu'un nouveau modèle de calculatrice Casio vient de voir le jour, avec une grande mémoire de travail et une version de Python munie d'une fonction getkey().
Ce nouveau modèle de calculatrice est en fait la Graph Math+ dont tu peux lire un test très complet réalisé par les équipes de TI-Planet et de Planète-Casio.
Contrairement à celle de la Graph 90+E qui en était dépourvue, l'implémentation Python de la Graph Math+ dispose de la fonction getkey() qui permet de détecter en temps réel un appui sur les touches et permet ainsi de faire des jeux bien plus interactifs !

Il a donc été possible d'adapter le jeu Orlog pour en faire une version qui fonctionne avec la Graph Math+ ! :#tritop#:
200572006020061

Les règles du jeu sont détaillées dans l'article qui présente les versions NumWorks.

20056La version pour la Graph Math+ est directement adaptée de la version pour la Graph 90+E, mais une simple traduction ou conversion des différentes fonctions utilisées, comme getkey() à la place de keydown(), est loin d'être suffisante !
En effet, la Graph Math+ ne dispose pas du module time et contrairement à la version pour la Graph 90+E qui utilise PythonExtra et donc tous les modules de la NumWorks, la version pour la Graph Math+ n'utilise que les modules et fonctions disponibles nativement. Il a donc fallu recoder la fonction sleep du module time qui est très régulièrement utilisée pour mettre l'exécution du script en pause durant le temps demandé en paramètre (en sec).

On peut proposer, pour recoder la fonction sleep :
Code: Select all
def sleep(k=1):
    for i in range(k*10**4):
        i**2

20058L'implémentation Python de la Graph Math+ ne comporte pas non plus de fonction fill_rect qui est pourtant bien pratique pour dessiner des rectangles et remplir des zones de l'écran, sans devoir le faire pixel par pixel. Il est possible de recoder cette fonction en utilisant 2 boucles imbriquées et la fonction set_pixel.

On peut proposer, pour recoder la fonction fill_rect :
Code: Select all
def fill_rect(x,y,dx,dy,clr):
    for i in range(x,x+dx):
        for j in range(y,y+dy):
            set_pixel(i+38,j+1,clr)
    show_screen()

20059Jusque-là, rien de bien extraordinaire. Mais on remarque un étrange +38 et un étrange +1. En effet, si la fenêtre graphique disponible sur la Graph 90+E avec PythonExtra offre une définition de 396 par 224 pixels, la fenêtre graphique de l'implémentation Python de la NumWorks n'offre que 320 par 222 pixels.

Notre cher SlyVTT a œuvré pour porter dans l'add-in PythonExtra l'ensemble des fonctions et modules disponibles dans l'implémentation Python de la NumWorks mais il y a également ajouté une extension qui permet de ne pas être limité à une fenêtre de 320 par 222 pixels mais d'exploiter la grande taille de l'écran de la Graph 90+E qui nous offre une définition de 396 par 224 pixels. Mais pour en profiter, il faut choisir des coordonnées qui commencent artificiellement à -38 en abscisses pour exploiter la marge de gauche et à -1 en ordonnée, pour récupérer la toute première ligne de l'écran.

En revanche, le premier pixel en haut à gauche de l'écran de la Graph Math+ a pour coordonnées (0,0) et non pas (-38,-1). Pour ne pas devoir modifier toutes les coordonnées du script, il était plus simple et plus rapide de convertir les coordonnées à la volée, au moment de l'affichage. :)

Par ailleurs, la fenêtre graphique de la Graph Math+ n'offre que 384 par 192 pixels (au lieu de 396 par 224 pixels pour la Graph 90+E). Il a donc fallu ajuster le placement des différents éléments du jeu sur le plateau et l'affichage des divinités.

20061Il a également été nécessaire de redéfinir la fonction draw_string (qui permet d'afficher du texte dans la zone graphique) en remettant ses différents paramètres dans l'ordre qui convient à la Graph Math+, c'est-à-dire avec la chaîne de caractères placée après les coordonnées d'affichage.

Petite remarque en passant : la fonction draw_string de la Graph Math+ ne permet pas de choisir une couleur de fond en plus de la couleur du texte, mais permet en revanche de choisir la taille de la police parmi "small", "medium" et "large". C'est la taille "small" qui est utilisée dans l'affichage compact du plateau en bas de l'écran de choix de la divinité à invoquer et c'est la taille "medium" qui est utilisée ailleurs. :D

Il est à noter qu'en revanche le module casioplot propose des fonctions qui ne sont pas disponibles avec le module kandinsky de la NumWorks, telles que la fonction clear_screen() pour effacer l'écran rapidement, sans devoir tracer un immense rectangle blanc qui recouvre l'écran, ou encore la fonction show_screen() qui permet de tirer profit du double buffering que permet la Graph Math+ et qui permet de préparer une image sans l'afficher puis d'afficher d'un coup l'image générée une fois qu'elle est prête. De quoi afficher de jolis écrans sans laisser entrevoir les étapes de construction ! :#tritop#:

20062Un dernier détail et un dernier bémol : l'appel des différentes couleurs dans la fonction set_pixel ou dans la fonction draw_string du module casioplot ne se fait pas avec autant de souplesse qu'avec les fonctions équivalentes du module kandinsky de la NumWorks. En effet, la seule forme acceptée est l'écriture sous la forme d'un triplet de nombres entiers compris entre 0 et 255. Il faut donc exclure toute autre forme.

Par ailleurs, l'implémentation Python de la Graph Math+ ne gère pas les caractères accentués. Ils ont donc été retirés, jusqu'à amélioration de la situation. :)

Mais, au fait, comment lance-t-on le jeu ?

Pour jouer à ce jeu, il faut mettre le script Python du jeu dans la mémoire de stockage (celle qui s'affiche en mode USB) de la Graph Math+ puis depuis la calculatrice, aller dans le menu Python, puis dans le Shell il faut saisir (à chaque lancement du jeu) la commande suivante from Orlog_v103_GM_IAmoyenne_sans_accents import * puis appuyer sur OK ou EXE.

Je conseille vivement de renommer le fichier et de choisir un nom bien plus court.

On peut également saisir cette ligne (une bonne fois pour toute) dans le script module.py, qui est exécuté automatiquement dès que l'on accède au Shell Python de la Graph Math+. Ensuite, pour chaque lancement du jeu, il n'y a alors plus qu'à accéder au Shell Python pour un lancement automatique, sans rien devoir saisir de plus. :#tritop#:

Ensuite, on joue en utilisant les 4 flèches et la touche EXE. Pour la version Graph Math+, j'ai ajouté la possibilité d'utiliser la touche OK pour désigner ou enlever une face de dé ou une divinité avant de valider avec EXE. La touche OK agît donc comme les flèches haut et bas.

Bon jeu ! :D


Téléchargement :
User avatar
AfyuVIP++
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 2.5%
 
Posts: 403
Images: 149
Joined: 30 Oct 2019, 19:17
Gender: Male
Calculator(s):
MyCalcs profile
Class: plutôt, oui :)

Re: Le jeu Orlog sur la Casio Graph Math+

Postby critor » 16 Jun 2024, 07:18

Félicitations donc à toi pour avoir signé le tout premier jeu Python spécifique à la Graph Math+ ! 👍
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 47%
 
Posts: 41940
Images: 15615
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Online

Re: Le jeu Orlog sur la Casio Graph Math+

Postby cent20 » 16 Jun 2024, 08:58

Bravo Afyu ! L'arrivé du getkey et la dotation en mémoire, généreuse, utilisable, va permettre à cette nouvelle plateforme de décoller. Quel est la rapidité d'affichage ? show_screen() semble excellent, mais si la construction est lente, je demande à voir. Cette rapidité dépend du CPU et de l'interface CPU / Affichage.

Possible de porter ce script pour voir si c'est plus fluide ?
https://my.numworks.com/python/schraf/gif_shuffle
Image
Enseignant de mathématiques et d'informatique. Spécialité NSI : Des projets, des tutos, mais aussi de l'art
Calculatrice NumWorks : Des applications et des jeux, scripts, 📙 Découvrir la NumWorks
User avatar
cent20VIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 48.1%
 
Posts: 1044
Images: 67
Joined: 17 May 2012, 09:49
Location: Avignon
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: nsi_xyz

Re: Le jeu Orlog sur la Casio Graph Math+

Postby critor » 16 Jun 2024, 09:05

cent20 wrote:Cette rapidité dépend du CPU et de l'interface CPU / Affichage.

Le problème principal est ailleurs.
Mis à part pour le texte, tout le reste doit être dessiné pixel par pixel, avec autant d'appels à set_pixel()

Nous n'avons pas de fonction fill_rect() dans la bibliothèque casioplot.
Mais ça a été demandé. Et vu que nous avons enfin réussi à obtenir la fonction getkey(), nous avons espoir pour la fonction fill_rect(). :)
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 47%
 
Posts: 41940
Images: 15615
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: Le jeu Orlog sur la Casio Graph Math+

Postby SlyVTT » 16 Jun 2024, 15:34

Bravo Afyu,
Joli travail de conversion pour que tout fonctionne au poil sur la Graph Math+.
Pour avoir suivi l'affaire (de loin), je peux garantir que Afyu a fait un travail énorme pour vous livrer ce tout premier jeu sur Math+ :#fou#:
Bon maintenant on a hâte de voir la prochaine production de Afyusoft :D
Some works in progress :
The GUI Toolkit NF for nSpireMyShmup for fxCG-50Magic Light for Casio Graph 90+E
and
Magic Light for nSpire CX/CX-II
Simple Text Editor for nSpireOutRun for Casio Graph 90+E
95%
50%
100%
75%
100%
And more to come ... stay tuned
User avatar
SlyVTTPremium
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 45.4%
 
Posts: 522
Images: 31
Joined: 19 Jan 2021, 09:41
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
GitHub: SlyVTT

Re: Le jeu Orlog sur la Casio Graph Math+

Postby Afyu » 16 Jun 2024, 19:28

critor wrote:Félicitations donc à toi pour avoir signé le tout premier jeu Python spécifique à la Graph Math+ ! 👍

Merci !! Je suis content du résultat :) C'est un beau jeu, tant sur les graphismes que sur la jouabilité.

SlyVTT wrote:Bravo Afyu,
Joli travail de conversion pour que tout fonctionne au poil sur la Graph Math+.
Pour avoir suivi l'affaire (de loin), je peux garantir que Afyu a fait un travail énorme pour vous livrer ce tout premier jeu sur Math+ :#fou#:
Bon maintenant on a hâte de voir la prochaine production de Afyusoft :D

Merci !! Il ne faut pas oublier que cette version est adaptée de la version Graph 90+E qui a été réalisée avec ton aide précieuse ! :D
Merci pour ton soutien et tes conseils ! :favorite:

Avant la prochaine production (et j'ai déjà une petite idée en tête), j'ai encore quelques détails à perfectionner sur la version Graph Math+. :)

cent20 wrote:Bravo Afyu ! L'arrivé du getkey et la dotation en mémoire, généreuse, utilisable, va permettre à cette nouvelle plateforme de décoller. Quel est la rapidité d'affichage ? show_screen() semble excellent, mais si la construction est lente, je demande à voir. Cette rapidité dépend du CPU et de l'interface CPU / Affichage.

Possible de porter ce script pour voir si c'est plus fluide ?
https://my.numworks.com/python/schraf/gif_shuffle

Merci !! Oui, l'arrivée de cette fonction getkey est une vraie bouffée d'air frais et enlève beaucoup de frustration, d'autant plus que la mémoire disponible est conséquente et permettrait de faire de belles choses, comme des jeux élégants et ambitieux.

L'affichage est plutôt rapide, la fonction show_screen() est quasiment instantanée, lorsque l'image est prête. En revanche, la construction de l'image peut prendre plus de temps, en particulier à cause de l'absence de la commande fill_rect(), comme expliqué par critor, qui impose d'utiliser set_pixel() un grand nombre de fois.
L'affichage des 20 divinités (image + caractéristiques), lors de la phase de choix au lancement d'une partie, prend 34sec en tout, en les enchaînant, soit environ 1,5 sec par divinité. Avant d'avoir supprimé les grands rectangles blancs qui effaçaient une partie de l'écran entre chaque divinité, on était à 1min22sec. Ici, la commande clear_screen() fait des merveilles !

J'ai choisi d'afficher l'écran à la fin de chaque rectangle tracé. Ça fait un effet rideau descendant qui est plutôt sympa et surtout qui évite d'avoir un temps de "chargement" lors de la construction d'une image en arrière plan.

Pour la vidéo, je regarderai ça et je te dirai :)

Edit : c'est fait !

J'ai 1,23sec par image avec le code suivant :
Code: Select all
from casioplot import *
#from time import sleep
from random import randint,random

def fill_rect(x,y,dx,dy,clr):
  for i in range(x,x+dx):
    for j in range(y,y+dy):
      set_pixel(i,j,clr)


def memoire(n):
  if n == 0: return b"!.*######$9######$8#$####$9#####$$7###$#$$6#%#$#$$5#$#%##$6#$#$#$$6#$###%$6#$###$####$5#####%####$7#%####$7#%###$$6#%###$$6#%###$$:######$8#$####$7#%###$$4#'###%$2###$#&###$$1###%#$#######$$0###&#$#######$$/###'#$#%#$$4#%###&$4#&###&$2#'###&$2#&#$#&$2#&#%#%$2#%#&#%$2#%#&#%$2#$#(#%$1#$#)#%$0#%#)#%$/#%#*#%$/#$#*#%$/#$#+#$$/#$#,#$$/###,#$$/###-##$/###-#$$.##$J##$,###.#&$)#$#/#%$)#(#,#%$9#$&5"
  if n == 1: return b"!,E###$##$9######$9######$8#$####$8###$#$$8#####$$8###%##$6#$#%#%$4#####$###$$6#'####$4#(###$$3#+$3#)####$4#(###$$4###(##$5#$#$######$3#$#$#&####$2#####(####$2#####(####$2#####)####$1#####)###$$0#####%###&####$2#%###&$4#%###%$5#%###%$5#%###%$5#)$5#%###$$6#%###$$6#%###$$7#$###%$6#$#$#%$5#$#%#%$4#$#&#%$3#$#'#$$3#$#(#$$2#$#)#$$1#$#*##$1#$#*##$1#$$;###,#$$/###,#%$:#$$:#$$-#$#-#$$,#&($"
  if n == 2: return b"!,E###$##$9######$9######$8#$####$8###$#$$8#####$$8###%##$6#$#%#%$4#####$###$$6#'####$4#(###$$3#+$3#)####$4#(###$$4###(##$5#$#$######$3#$#$#&####$2#####(####$2#####(####$2#####)####$1#####)###$$0#####%###&####$2#%###&$4#%###%$5#%###%$5#%###%$5#)$5#%###$$6#%###$$6#%###$$7#$###%$6#$#$#%$5#$#%#%$4#$#&#%$3#$#'#$$3#$#(#$$2#$#)#$$1#$#*##$1#$#*##$1#$$;###,#$$/###,#%$:#$$:#$$-#$#-#$$,#&($"
  if n == 3: return b"!,H##$9######$9######$9######$8#$#%##$6###$#####$$4#$#&#$$4#$###$#%#$$2#$###$#%#%$1#$###$#&#%$0#$###$###$###$$3#)#$##$2#)#$##$1#*#$##$3#(#%##$0###,##$0###$###%#$#%##$/###%#(#$##$2#)#%##$-###%#*#$##$-###%#*#%##$,###%#&###%#%##$0#&###%#%#$$*###&#%###&$/###&#%###&$/###&#%###&$/###&#%###%$5#%###%$5#%###%$5#%###$$6#%###$$7#$###$$7#$#$#$$6#$#$#$$6#%###%$6#$#$#$$6#$#$#$$6#$#$#$$7###%##$7##$;#$#%##$:#$$7###$#$$;#$$4#&#$##$4#'#$##'U"
  if n == 4: return b"!+/##$;##$;#$$:#$%T######$7#########$$6###&##$5#$###$###$$4#$###$$7#####$#$#$$2#$###)####$0#$###)$3#####)####$0###$#)####$/#$#$#)###$$.###'###(#$$+#$#'#%#)##$'#%#+#'#&#%#X#$#,#)#(#%$,#*$4#*$4#*$4#*$4#%#$#%$4#%###&$4#%###&$5#$###%$6#$#$#$$6#$#$#$$6#$###%$6#$###%$6#$#$#$$6#$#$#$$6#$#%#$$5#$#%#$$5#$#%#$$5#$#&##$5#$#&##$5#$#&##$6##$;##&%#$$3#$#'#$$3#%#&#$$2#%#'##'U"
  if n == 5: return b"!.,######$9######$9######$9###%##$7######$9#%#$##$6#$#%###*#$#U###.#####$#####*#$#U#$#*###%#%#,###W###)#,#)##$##$#'#,#####&##$%#$#&###$#)#%#####$$&#&#&#)#%#%$)###(#($6#($;##$6#&$<#%$4#*$4#*$4#*$4#+$3#+$3#&###&$3#&###&$3#&###&$4#%#$#%$4#%#$#%$5#$#$#$$6#$#$#$$6#$#$#$$6#$#%#$$5#$#%#$$4#$#'#$$3#$#'#$$3#$#'#%$2#$#(#$$2#$#)##$2###*##$2##$;##&)#$$0###+#$$/#$#+#$'R"
  if n == 6: return b"!,J##$9######$0#$#)###$#$#&##$)#$#)###$#$#&#$$)###)###%###'##$1##########$7#$#+##$'###(#&#########'##$,#&#######$#$#$#%##$+#'#$#%###$###%$'#%#######*$.#$#'#($6#($6#($6###&##$7#&%Q#)$5#)$5#*$4#*$4#*$4#*$4#%#$#%$4#%#$#%$4#&###%$4#%#$#%$5#$#$#$$6#$#$#$$6#%###$$6#%###$$7#$###$$7#$###$$7#$###$$7#$###$$7#$###$$7#$#$##$8#$####$8###$##$8###$##$8###$##'6#$###$$6#&###$$4#%#$#%'V"
  if n == 7: return b"!,J##$9######$0#$#)###$#$#&##$)#$#)###$#$#&#$$)###)###%###'##$1##########$7#$#+##$'###(#&#########'##$,#&#######$#$#$#%##$+#'#$#%###$###%$'#%#######*$.#$#'#($6#($6#($6###&##$7#&%Q#)$5#)$5#*$4#*$4#*$4#*$4#%#$#%$4#%#$#%$4#&###%$4#%#$#%$5#$#$#$$6#$#$#$$6#%###$$6#%###$$7#$###$$7#$###$$7#$###$$7#$###$$7#$###$$7#$#$##$8#$####$8###$##$8###$##$8###$##'6#$###$$6#&###$$4#%#$#%'V"
  if n == 8: return b"!.&###'#######&##$-###(###########%#$$2###########'##$)###)###########(##$(###)###%###(#$$&###*###%###&#%$'###*#$#$#####$####$)#%###%###$###########$$/#%###$#####%#$$1#$#######%$5###$#'$5#($6#($6#($:#$$6#&%Q#*$4#*$4#*$4#*$4#*$4#%#$#%$4#&###%$5#%###%$5#%###%$5#%###%$6#$###%$6#$###$$7#$###$$7#$###$$6#%#$#$$5#$#%#%$4#$#&#$$3#$#(#$$2#$#(#$$2#$#)##$2###*##$2###+##$1##&*#$$.#$#,#$$.#$#,#$$.#%#+#$'S"
  if n == 9: return b"!(8##$:#$$;##$+###)##$3###)##$3###(#$#*##$*###(######$9###%###(##$0#$#$#$#'##$0###%#$#&#$$)###(###$#############$$*###%#&###$#######$$,#%###%############$3#&#$#$$6#)$5#)$6###$#%$7#%$8#&$<#$$5#*$4#*$4#*$4#*$4#+$3#+$3#%#$#&$3#&###&$3#%#$#%$5#$#$#%$5#$#$#%$5#$#$#%$5#$#%#$$5#$#%#$$5#$#&#$$4#$#&#$$4#$#&#$$4#$#'#$$3#$#'#$$3#$#(##$3###)##$3###)##$3##$;##&(##$2###*#$$1#$#)#$$0#$#*#$'T"
  if n == 10: return b"!,H##$:#######)##$1#######)##$0#$####$8#$#*##$1#%#####'##$1#$#$#$#&##$*#$#(#$#)##$,###%#$#&###$#%$,#%###)$2#$###*$4#*$5#)$6#($6###%#$$7#%$8#%$;#&$5#)$5#*$4#*$4#*$4#*$4#&###%$4#&###%$5#%###%$5#%###%$5#%###%$6#$###$$7#$###$$8#####$$8#####$$8#&$9#%$9#%$9#%$;##$;##$;##$;##$;##%U#$$:#%$9#$$:#$'X"
  if n == 11: return b"!,H##$:#######)##$1#######)##$0#$####$8#$#*##$1#%#####'##$1#$#$#$#&##$*#$#(#$#)##$,###%#$#&###$#%$,#%###)$2#$###*$4#*$5#)$6#($6###%#$$7#%$8#%$;#&$5#)$5#*$4#*$4#*$4#*$4#&###%$4#&###%$5#%###%$5#%###%$5#%###%$6#$###$$7#$###$$8#####$$8#####$$8#&$9#%$9#%$9#%$;##$;##$;##$;##$;##%U#$$:#%$9#$$:#$'X"
  if n == 12: return b"!,H######$8#$####$8#'$8#&$6###%#$$6#######$##$5#$#&##$3#####$###$####$2#$#'######$2#*#$##$1#+###$$.###%#)###$$-###&#)#%##$,#&###)#&##$/#$#&#$$4###$#%#(##$1###+##$2#'#&##$1#)$4#*$4#*$4#+$3#+$3#&###&$3#&###%$4#&###%$4#%#$#%$4#%#$#%$4#%#$#$$5#%#$#$$6#$#$#$$6#$#$#$$6#%###$$7#$###$$7#$###%$7#'$8#####$$:#$$:##$;##$;##$;##'8#$$:#%($"
  if n == 13: return b"!+-##$;#$$8#$###$$8#####%$7###$#$$:#%$6#$###%$5###&#$$2#####$###%####$2#$#%#%####$1#+####$1#,$2#####)$2###%#(#$#$$-###&#(#&##$,###(#&#&##$1#$#%##%L###$#)$2###$#)$1#$#$#*$0###%#*$4#*$3#+$3#+$3#&###&$3#%#$#&$3#%#$#%$4#%#$#%$4#%#$#%$4#%#%#$$5#$#%#$$5#$#%#$$5#$#%#$$6#$#$#$$6#$#$#$$7###$#$$7###$#$$:#$$8###$##$9######$7#$#$##$7###%##$6#$$?##$;##$;##(&"
  if n == 14: return b"!,E#$$:#%$9#%$9#&$7#####&$7###$#%$5###$#####%$4###$###&##$0#$#####$#$#####$##$.#&###&#####%##$-#,###$###$$,#+###$###%$,#+#'#$$.#)$2###$#($3###$###%#$$7#%####$6#'$3###$#$$:#)$4#*$4#+$3#+$0###$#+$0###$#+$3#&###&$3#&###&$4#%#$#%$4#%#$#%$4#%#$#%$5#$#$#%$5#$#$#%$5#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$7###$##$8###$##$8###$##%Q#$####$8#$#$#$$5#$#$#&('"
  if n == 15: return b"!)E##$;#%$8#####$$8#####$$8#####$$8#####$$:#$$:#%#####$#$$/#######$#######&#$$-#$#########&#$#$#$$+#&#%#($/#,$3#+$2#####)$2###$#)$2###$###$#&$5#%#$##%O#)$5#*$2#####*$1#$###*$3#+$3#+$4#&###%$4#%#$#%$4#%###&$4#%###&$4#%###%$6#$###%$6#$###%$6#$###%$6#$###%$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$7###$#$$7###$#$$7###$#$$:##$8###$##%R##$:#$#$##$7#$#$#$$7##(."
  if n == 16: return b"!+'##$;#%$8#'$7#'$8#&$8#&$8#&#$#'$/#####%#########%#%$.#########%####$0#%#$##############$/#'#%##$3#####&###&$4#)$5#($2###%#($2###%#($2###%#($:#$%O#)$5#)$4#*$4#*$4#*$4#%#$#%$4#&###%$4#%#$#%$4#%###&$5#$#$#%$4#%#$#$$5#%#$#$$5#$#$#%$5#$#$#%$5#$#%#$$5#$#%#$$5###&#$$:#$$:#$$4###'#$$4###'#$$3#$#'##$3#$#(##$;##'9##$:#%(,"
  if n == 17: return b"!,@#$$8#####$$8#####$$7#$###$$8#####$$:#%$7###$#$$7###$#$###$$2#################%$0#####$###########$#%#$$,###########&#####%$.###$#'#$#$$/###$#)###$$2#)###$$.###%#($2###)#%$5#&%N###$#)$2###$#*$1###$#*$1###$#*$3#+$3#+$3#&###&$3#&###%$4#&###%$5#$#$#%$5#$#$#$$6#$###%$6#$###%$6#$###%$6#$###$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$##$7###$#$$7###$#$$:##$;##$7##$:#$$9#%#%#$$4#$#%#%$4#$#%#'(."
  if n == 18: return b"!+$##$:######$8#$####$8###$#$$7###$#$$8#####$$;##$7###%##$:#####&$2###%#####'$1#######$#'###$$.#$###$#%#$#&#$$.#)#%#$$0#)###$$/###$#(####$1###$#(####$8#####$$:#$$0###$#)$2###$#)$2###$#*$1###$#*$3#+$3#+$3#+$3#&###%$4#&###%$4#%###&$4#%###%$6#$###%$6#$###%$6#$###%$5#%###$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6###%#$$6###%##$7###%##$;##%Q##$:#$#%##$5#$#%#%$9#&(/"
  if n == 19: return b"!,>##$;#$$:#$$7###$#%$6#$###%$6###$#%$6###%#$$6###%#####&$8#&#$#$$1#'#$#&$-#*###%$0#)####$4#(####$2###$#&####$3###$#&$8#($:##$4###$#%$5###$#$#%##$6#)$4#*$4#*$4#*$4#&###%$4#%#$#%$3#&###&$3#%#$#%$4#$#%#%$4#$#$#%$5#$#$#%$5#$#$#$$6#$#$#$$6#$#$#$$6###%#$$6###%#$$:#$$:#$$5#%#$#$$5#$#%#$$5###&#$$4#$#&##$;##'8#$$9#%(2"
  if n == 20: return b"!,=##$8######$9#$#$##$7#$#$##$7#$#$##$7###%#$$6###&#####&$1#####$#######&#%##$-#&#$#&###%$.#####$###%#$#$$2#$###$####$5#'####$5#'####$3#####&####$4#($5#$#&#%$3##$;#####($3#####*$2#####*$2#####*$2#####*$2#,$4#%###&$4#%###%$5#%###%$5#$###%$6#$###%$6#$###$$7#$###$$6#%###$$6#$#$##$8###$##$8###$##$8#####$$:#$$:#$$:#$$7###$##$7#%####$6#%#$##(R#$$;##(3"
  if n == 21: return b"!-T###$##$8###$##$7#%###$$6#%###$$6#$#$#$$6###&#$###%$1###$#####$###$#######$$.#############&###%$.###&#&###$$0#####'#$##$3#(####$3#)$5#(###$$5#&####$4#####&$6###'#$$3###%#%$5#####$$9#*$2#####*$4#*$4#*$1###$#%###&$1###$#%###&$4#%###&$4#)$5#%###%$5#%###$$7#$###$$7#$####$7#%####$7#&$8#$####$8#$####$8#$####$8#$$:#$$:#$$:##$;##$;##'8#$$9#%(5"
  if n == 22: return b"!,9######$9######$9#$$:#$#$##$7#$#$###$##$4#$#$#####&$2###%#####%$3#############%####$1#############%###$$1#%#$#%#$#$$0#%###&#$#$$0#*#$##$1#*#$##$1#*#$##$3###$#%####$5#%#%##$;##$2#####(####$3#)####$1#####)$2###$#*$0###%#*$/###&#%#$#%$4#*$4#*$4#%###&$5#$#$#%$5#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6#$###$$7#$###$$7#$###$$7#$####$7#$###$$8#####$$8######$9######'8##$:##$;##$:#$$:#$(3"
  if n == 23: return b"!*X##$9######$9######$9######$8#$####$8#$$9#%#####$#%$2#$#%#####%$2#$#$#####'$1#$#$#####&####$0###&#'###$$2#)#$##$2#)#%##$1#)#%##$1#*#$##$1#*#$##$2#)#$##$1###%##$6#$#'#%$,###$#%#$#*#$##$1#*#$##$1#+###$$0#+$3#+$3#'###&$2#&#$#&$2#&#$#&$2#&#%#&$1#%#'#%$2#$#(#$$2#$#'#%$2#$#'#%$2#$#'#%$2#$#'#$$2#%#'#$$2#%#(##$2#%#(##$2#%$9#$$:#$#)#$$1#$#*##$1#$#*#$$1##%T##$;#$$:#$(2"
  if n == 24: return b"!)=#$$9#%####$7#%####$6#&####$6#&########$4#&$8#%#&######$2#$#%#########$$0#%#####%#&$0#$#####$#($0#$#%#(####$/#####+####$1#+#$##$0#+$4#*#%##$/###$#)#%##$.###.##$.###%#$#$#%$/#%#'#'#%##$%###-#*#$##$1#*#$##$2#*#$##$1#*#$#$$/#+$3#,$2#&#$#&$2#&#%#%$2#%#&#%$1#&#'#%$0#&#'#%$0#&#(#$$1#$#)#%$0#$#*#$$0#$#*#%$/#$#+#$$0#$#*#$$0#$#+#$$/#$#,##$/#$#,##$/#$$;###-##$/##$;###-#%$;#$$;#$$*#%$8#'$6#&(/"
  if n == 25: return b"!)=#$$9#%####$7#%####$6#&####$6#&########$4#&$8#%#&######$2#$#%#########$$0#%#####%#&$0#$#####$#($0#$#%#(####$/#####+####$1#+#$##$0#+$4#*#%##$/###$#)#%##$.###.##$.###%#$#$#%$/#%#'#'#%##$%###-#*#$##$1#*#$##$2#*#$##$1#*#$#$$/#+$3#,$2#&#$#&$2#&#%#%$2#%#&#%$1#&#'#%$0#&#'#%$0#&#(#$$1#$#)#%$0#$#*#$$0#$#*#%$/#$#+#$$0#$#*#$$0#$#+#$$/#$#,##$/#$#,##$/#$$;###-##$/##$;###-#%$;#$$;#$$*#%$8#'$6#&(/"
  if n == 26: return b"!)=#$$9#%####$7#%####$6#&####$6#&########$4#&$8#%#&######$2#$#%#########$$0#%#####%#&$0#$#####$#($0#$#%#(####$/#####+####$1#+#$##$0#+$4#*#%##$/###$#)#%##$.###.##$.###%#$#$#%$/#%#'#'#%##$%###-#*#$##$1#*#$##$2#*#$##$1#*#$#$$/#+$3#,$2#'###&$2#&#%#%$2#%#&#%$1#&#'#%$0#&#'#%$0#&#(#$$1#$#)#%$0#$#*#$$0#$#*#%$/#$#+#$$0#$#*#$$0#$#+#$$/#$#,##$/#$#,##$/#$$;###-##$/##$;###-#%$;#$$;#$$*#%$8#'$6#&(/"
  if n == 27: return b"!*X##$9######$9######$9######$8#$####$8#$$9#%#####$#%$2#$#%#####%$2#$#$#####'$1#$#$#####&####$0###&#'###$$2#)#$##$2#)#%##$1#)#%##$1#*#$##$1#*#$##$2#)#$##$1###%##$6#$#'#%$,###$#%#$#*#$##$1#*#$##$1#+###$$0#+$3#+$3#'###&$2#&#$#&$2#&#$#&$2#&#%#&$1#%#'#%$2#$#(#$$2#$#'#%$2#$#'#%$2#$#'#%$2#$#'#$$2#%#'#$$2#%#(##$2#%#(##$2#%$9#$$:#$#)#$$1#$#*##$1#$#*#$$1##%T##$;#$$:#$(2"
  if n == 28: return b"!*X##$9######$9######$9######$8#$####$8#$$9#%#####$#%$2#$#%#####%$2#$#$#####'$1#$#$#####&####$0###&#'###$$2#)#$##$2#)#%##$1#)#%##$1#*#$##$1#*#$##$2#)#$##$1###%##$6#$#'#%$,###$#%#$#*#$##$1#*#$##$1#+###$$0#+$3#+$3#'###&$2#&#$#&$2#&#$#&$2#&#%#&$1#%#'#%$2#$#(#$$2#$#'#%$2#$#'#%$2#$#'#%$2#$#'#$$2#%#'#$$2#%#(##$2#%#(##$2#%$9#$$:#$#)#$$1#$#*##$1#$#*#$$1##%T##$;#$$:#$(2"
  if n == 29: return b"!-T###$##$8###$##$7#%###$$6#%###$$6#$#$#$$6###&#$###%$1###$#####$###$#######$$.#############&###%$.###&#&###$$0#####'#$##$3#(####$4#($5#(###$$5#&####$4#####&$6###'#$$3###%#%$5#####$$9#*$2#####*$4#*$4#*$1###$#%###&$1###$#%###&$4#%###&$4#)$5#%###%$5#%###$$7#$###$$7#$####$7#%####$7#&$8#$####$8#$####$8#$####$8#$$:#$$:#$$:##$;##$;##'8#$$9#%(5"
  if n == 30: return b"!-T###$##$8###$##$7#%###$$6#%###$$6#$#$#$$6###&#$###%$1###$#####$###$#######$$.#############&###%$.###&#&###$$0#####'#$##$3#(####$4#($5#(###$$5#&####$4#####&$6###'#$$3###%#%$5#####$$9#*$2#####*$4#*$4#*$1###$#%###&$1###$#%###&$4#%###&$4#)$5#%###%$5#%###$$7#$###$$7#$####$7#%####$7#&$8#$####$8#$####$8#$####$8#$$:#$$:#$$:##$;##$;##'8#$$9#%(5"
  if n == 31: return b"!,>##$;#$$:#$$7###$#%$6#$###%$6###$#%$6###%#$$6###%#####&$8#&#$#$$1#'#$#&$-#*###%$0#)####$4#(####$2###$#&####$3###$#&$8#($:##$4###$#%$5###$#$#%##$6#)$4#*$4#*$4#*$4#&###%$4#%#$#%$3#&###&$3#%#$#%$4#$#%#%$4#$#$#%$5#$#$#%$5#$#$#$$6#$#$#$$6#$#$#$$6###%#$$6###%#$$:#$$:#$$5#%#$#$$5#$#%#$$5###&#$$4#$#&##$;##'8#$$9#%(2"
  if n == 32: return b"!+$##$:######$8#$####$8###$#$$7###$#$$8#####$$;##$7###%##$:#####&$2###%#####'$1#######$#'###$$.#$###$#%#$#&#$$.#)#%#$$0#)###$$/###$#(####$1###$#(####$8#####$$:#$$0###$#)$2###$#)$2###$#*$1###$#*$3#+$3#+$3#+$3#&###&$3#&###%$4#%###&$4#%###%$6#$###%$6#$###%$6#$###%$5#%###$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6###%#$$6###%##$7###%##$;##%Q##$:#$#%##$5#$#%#%$9#&(/"
  if n == 33: return b"!+$##$:######$8#$####$8###$#$$7###$#$$8#####$$;##$7###%##$:#####&$2###%#####'$1#######$#'###$$.#$###$#%#$#&#$$.#)#%#$$0#)###$$/###$#(####$1###$#(####$8#####$$:#$$0###$#)$2###$#)$2###$#*$1###$#*$3#+$3#+$3#+$3#&###&$3#&###%$4#%###&$4#%###%$6#$###%$6#$###%$6#$###%$5#%###$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6###%#$$6###%##$7###%##$;##%Q##$:#$#%##$5#$#%#%$9#&(/"
  if n == 34: return b"!+'##$;#%$8#'$7#'$8#&$8#&$8#&#$#'$/#####%#########%#%$.#########%####$0#%#$##############$/#'#%##$3#####&###&$4#)$5#($2###%#($2###%#($2###%#($:#$%O#)$5#)$4#*$4#*$4#*$4#%#$#%$4#&###%$4#%#$#%$4#%###&$4#%#$#%$4#%#$#$$5#%#$#$$5#$#$#%$5#$#$#%$5#$#%#$$5#$#%#$$5###&#$$:#$$:#$$4###'#$$4###'#$$3#$#'##$3#$#(##$;##'9##$:#%(,"
  if n == 35: return b"!)E##$;#%$8#####$$8#####$$8#####$$8#####$$:#$$:#%#####$#$$/#######$#######&#$$-#$#########&#$#$#$$+#&#%#($/#,$3#+$2#####)$2###$#)$2###$###$#&$5#%#$##%O#)$5#*$2#####*$1#$###*$3#+$3#+$4#&###%$4#%#$#%$4#%###&$4#%###&$4#%###%$6#$###%$6#$###%$6#$###%$6#$###%$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$7###$#$$7###$#$$7###$#$$:##$8###$##%R##$:#$#$##$7#$#$#$$7##(."
  if n == 36: return b"!,E#$$:#%$9#%$9#&$7#####&$7###$#%$5###$#####%$4###$###&##$0#$#####$#$#####$##$.#&###&#####%##$-#,###$###$$,#+###$########$,#+#'#$$.#)$2###$#($3###$###%#$$7#%####$6#'$3###$#$$:#)$4#*$4#+$3#+$0###$#+$0###$#+$3#&###&$3#&###&$4#%#$#%$4#%#$#%$4#%#$#%$5#$#$#%$5#$#$#%$5#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$7###$##$8###$##$8###$##%Q#$####$8#$#$#$$5#$#$#&('"
  if n == 37: return b"!+-##$;#$$8#$###$$8#####%$7###$#$$:#%$6#$###%$5###&#$$2#####$###%####$2#$#%#%####$1#+####$1#,$2#####)$2###%#(#$#$$-###&#(#&##$,###(#&#&##$1#$#%##%L###$#)$2###$#)$1#$#$#*$0###%#*$4#*$3#+$3#+$3#&###&$3#%#$#&$3#%#$#%$4#%#$#%$4#%#$#%$4#%#%#$$5#$#%#$$5#$#%#$$5#$#%#$$6#$#$#$$6#$#$#$$7###$#$$7###$#$$:#$$8###$##$9######$7#$#$##$7###%##$6#$$?##$;##$;##(&"
  if n == 38: return b"!+-##$;#$$8#$###$$8#####%$7###$#$$:#%$6#$###%$5###&#$$2#####$###%####$2#$#%#%####$1#+####$1#,$2#####)$2###%#(#$#$$-###&#(#&##$,###(#&#&##$1#$#%##%L###$#)$2###$#)$1#$#$#*$0###%#*$4#*$3#+$3#+$3#&###&$3#%#$#&$3#%#$#%$4#%#$#%$4#%#$#%$4#%#%#$$5#$#%#$$5#$#%#$$5#$#%#$$6#$#$#$$6#$#$#$$7###$#$$7###$#$$:#$$8###$##$9######$7#$#$##$7###%##$6#$$?##$;##$;##(&"
  if n == 39: return b"!/E######$9###$##$8######$9######$8##$;##########$7###%##$5#####$#%######$2#$#%#$#$###%##$,#$###)#######%$+#$#$#)$6#($6#($6#($6#$###%$7#$$>#$$5#)$4#*$4#+$3#+$4#*$4#%###&$4#%###%$5#%###%$6#$###%$6#$###$$8#####$$8#####$$8#####$$:#$$:#$$:#$$:#$$:#$$:#$$:#$$:#$$:##$;##%U###$#$$7#$###$$7#$####'X"
  if n == 40: return b"!,H##$:#######)##$1#######)##$0#$####$8#$#*##$1#%#####'##$1#$#$#$#&##$*#$#(#$#)##$,###%#$#&###$#%$,#%###)$2#$###*$4#*$5#)$6#($6###%#$$7#%$8#%$;#&$5#)$5#*$4#*$4#*$4#*$4#&###%$4#&###%$5#%###%$5#%###%$5#%###%$6#$###$$7#$###$$8#####$$8#####$$8#&$9#%$9#%$9#%$;##$;##$;##$;##$;##%U#$$:#%$9#$$:#$'X"
  if n == 41: return b"!(8#$$:##$;##$2#######(##$2######$9######$2###(#######)##$*###(###$###(##$*###(###%###'##$1###&###%#$$/#########$#####$#%$+###$#%#%#$$1#%###&###$$1###$#+$5#)$5#)$6###%#$$7#%$8#$$;#'$5#*$4#*$4#*$4#*$4#*$4#&###%$4#%#$#%$4#&###%$5#%###%$5#%###%$5#%###%$6#$###%$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#$$6#$#$#%$5#$#%#$$6###%#$$6###%#$$6###%#$$6#$#%##$7###%##'5###%##$6#$#%##$6#$#%#$$:#$'V"
  if n == 42: return b"!.&###'#######&##$-###(###########%#$$2###########'##$)###)###########(##$(###)###%###(#$$&###*###%###&#%$'###*#$#$#####$####$)#%###%###$###########$$/#%###$#####%#$$1#$#######%$5###$#'$5#($6#($6#($:#$$6#&%Q#*$4#*$4#*$4#*$4#*$4#%#$#%$4#&###%$5#%###%$5#%###%$5#%###%$6#$###%$6#$###$$7#$###$$7#$###$$6#%#$#$$5#$#%#%$4#$#&#$$3#$#(#$$2#$#(#$$2#$#)##$2###*##$2###+##$1##&*#$$.#$#,#$$.#$#,#$$.#%#+#$'S"
  if n == 43: return b"!,J##$3#$#&#######&##$.###'#######'##$,###(#######)##$*###(###,##$(###)#$#+#$$'###)#$#$###(#%$%###'#$###$#$#####%####$(#%###&###$#$#$###$$.#'#%######$4#)$6#($6#($6#($6#($;##$6#$$;#($4#*$4#*$4#*$4#+$3#+$3#&###&$3#&###%$5#%###%$5#%###%$5#%###%$6#$###%$6#$###%$6#$###$$7#$###$$7#$#$#$$7#$###$$7#$###$$7#$###$$7#$###$$7#$###$$8#####$$8###$##$8##'9#$####$7#%####$7#$#$#$'W"
  if n == 44: return b"!,J##$3#$#&#######&##$.###'#######'##$,###(#######)##$*###(###,##$(###)#$#+#$$'###)#$#$###(#%$%###'#$###$#$#####%####$(#%###&###$#$#$###$$.#'#%######$4#)$6#($6#($6#($6#($;##$6#$$;#($4#*$4#*$4#*$4#+$3#+$3#&###&$3#&###%$5#%###%$5#%###%$5#%###%$6#$###%$6#$###%$6#$###$$7#$###$$7#$#$#$$7#$###$$7#$###$$7#$###$$7#$###$$7#$###$$8#####$$8###$##$8##'9#$####$7#%####$7#$#$#$'W"
  if n == 45: return b"!,J##$9######$9######$9######$.###,###%###)##$##$#,###########)##$$###,###%#$#(##$%###)#########$#####(##$%###(#$#######%#$###&##$&###&#&###&#$#$$*###&#'###%#$###%##$(###########$#)#&#$$(#$#'#(#(##$/#($6###%#$$7#%%S#($5#*$4#*$4#*$4#*$4#*$4#*$4#&###%$4#&###%$5#%###%$5#%###%$5#%###%$6#$###%$6#$#$#$$6#$#$#$$6#$#$#$$5#$#&#$$4#$#&#$$4#$#&#%$3#$#'#$$3#$#'#$$3#$#(##$4###(##$;##'1###*##$2#$#)#$$1###*#$'S"
  if n == 46: return b"!+/##$;##$;#$$:#$%T######$7#########$$6###&##$5#$###$###$$4#$###$$7#####$#$#$$2#$###)####$0#$###)$3#####)####$0###$#)####$/#$#$#)###$$.###'###(#$$+#$#'#%#)##$'#%#+#'#&#%#X#$#,#)#(#%$,#*$4#*$4#*$4#*$4#%#$#%$4#%###&$4#%###&$5#$###%$6#$#$#$$6#$#$#$$6#$###%$6#$###%$6#$#$#$$6#$#$#$$6#$#%#$$5#$#%#$$5#$#%#$$5#$#&##$5#$#&##$5#$#&##$6##$;##&%#$$3#$#'#$$3#%#&#$$2#%#'##'U"
  if n == 47: return b"!,H##$;#$$:#$$8##########$7###%##$6#$#######$$4#%###'$4#$#&#$$4#$###%#$##$4###########$##$5#$#$#####%$3#%###&$2#*$4#+####$3#)####$1#####)#$##$0###,#$$.###%#%#$#$#$##$.###(#&#%##$,###&#*#$##$+###'#*#%##$*###'#*#&##$(###(#*#'##$&#$#(#*$,###)#%#$#%$,###)#&###%$4#&###%$4#&###$$5#%#$#$$5#%#$#$$6#$#$#$$6#$#$##$7#$#$##$7#%###$$7#$###$$7#$###$$7#%####$8#$####$8#$####$8#$####$8#$####$9##%V##$9#$####$6#('W"
  if n == 48: return b"!,G##$;######$8#$####$9######$;##$7#####&$6#%###$####$4#$###%###$$2#$#(#%$1#$#$#########%$1#$###)$4#)#$##$1#*#$##$1#*#$#$$1#)#%##$0#####$#)#$$/###$###%#$#%##$/###%#($2###$#)#%##$.###$#*#$##$.###$#*#%##$-###$#*#%#$$/#%###&#%##$0#%###&$4#$###&$2###$#$###&$2###$#$###%$6#$###%$6#$###%$6#$###$$8#####%$7#$###%$6#$#$#%$5#$#%#%$4#$#&#$$4#$#'##$4#$#(##$4#$#)##$2###)#$$2###*#$$1###+#$$0###+##'/#$$9#%($"
  if n == 49: return b"!,G##$;######$8#$####$9######$;##$7#####&$6#%###$####$4#$###%###$$2#$#(#%$1#$#$#########%$1#$###)$4#)#$##$1#*#$##$1#*#$#$$1#)#%##$0#####$#)#$$/###$###%#$#%##$/###%#($2###$#)#%##$.###$#*#$##$.###$#*#%##$-###$#*#%#$$/#%###&#%##$0#%###&$4#$###&$2###$#$###&$2###$#$###%$6#$###%$6#$###%$6#$###$$8#####%$7#$###%$6#$#$#%$5#$#%#%$4#$#&#$$4#$#'##$4#$#(##$4#$#)##$2###)#$$2###*#$$1###+#$$0###+##'/#$$9#%($"


w,h = 80,55
r = 320 // w

def taille(n):
  return  54 * (n[0] - 35) + n[1] - 34

def remplir(x,y,t,c):

  while t > 0:
    d = min(t, w - x)
    fill_rect(r*x,2+r*y,r*d,r-2,c)
    x += d
    t -= d
    if x == w:
      x = 0
      y += 1
      if y >= h: y = 0
  return x,y

def aff():
  k, sens = 0, 1
  while True:
    k = (k + sens) % 50
    if random()<.01: sens *= -1
    img = memoire(k)
    COUL = [(randint(0,255),randint(0,255),randint(0,255)),(0,0,0)]
    i = 0
    x,y = 0,0
    while i < len(img):
      v = img[i]
      if v == 32 or v == 33:
        c = v - 32
        i += 1
        #sleep(.02)
      else:
        t = taille(img[i:i+2])
        x,y = remplir(x,y,t,COUL[c])
        i += 2
        c = 1 - c
    show_screen()

fill_rect(0,0,384,192,(0,0,0))
aff()
User avatar
AfyuVIP++
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 2.5%
 
Posts: 403
Images: 149
Joined: 30 Oct 2019, 19:17
Gender: Male
Calculator(s):
MyCalcs profile
Class: plutôt, oui :)

Re: Le jeu Orlog sur la Casio Graph Math+

Postby critor » 16 Jun 2024, 21:36

critor wrote:Félicitations donc à toi pour avoir signé le tout premier jeu Python spécifique à la Graph Math+ ! 👍

Erreur de ma part, on t'a doublé il y a 12 jours.

Voici à ma connaissance le premier jeu Python getkey pour Graph Math+ :


Mais Orlog a clairement demandé bien davantage de travail sur les graphismes. ;)
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 47%
 
Posts: 41940
Images: 15615
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor


Return to News Casio

Who is online

Users browsing this forum: No registered users and 5 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
643 utilisateurs:
>624 invités
>11 membres
>8 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)