La revue des projets - 136
Posté le 13/01/2019 22:03
On se retrouve après une semaine creuse pour notre rendez-vous de projets hebdomadaire. Au programme : électronique, pokémons, et interpréteurs Basic. Bonne lecture !
La deuxième semaine de 2019 a été assez tranquille et même assez peu active dans l'ensemble. Pourtant, en coulisses, plus d'un continue de travailler sur un projet secret (ou peut-être même la domination du monde !).
On commence ce soir avec
Disperseur, dont le dernier programme permet de simuler des circuits électriques. Vous placez vos sources de courant (des leviers), tirez les câbles et observez le passage du courant dans le circuit. Pour ça, vous avez des ampoules qui changent joyeusement de couleur selon leur statut. Ajoutez des diodes et quelques portes AND et vous obtenez un cocktail
Dispersif !
Alors comment tout ça marche-t-il ? Pour vous, le making of !
Disperseur a écrit :Bonjour à tous sur Planète Casio !
Comme certains d'entre vous l'auront déjà lu j'ai récemment posté mon tout dernier programme
Circuit. Pour ceux qui n'ont pas eu l'occasion de lire la description du programme, il s'agit d'un simulateur de circuit électronique. Vous pouvez y créer des circuits électriques et surtout les faire fonctionner. Je ne m'étalerais pas trop là dessus, j'en parle
ici.
Aujourd'hui je vais vous parler de la manière dont ce programme à été développé. Avant toute chose, je précise que je parlerai un peu technique.
Tout d'abord, je me suis simplement penché sur le problème des « câbles ». En effet, simuler le déplacement d'un courant dans un câble n'est pas si simple que ça n'y paraît. Dans l'ignorance de la solution je publie donc le topic
Circuits dans l'espoir que quelqu'un me guide un peu. Grâce toute la gentillesse de Hackcell, je me suis donc renseigné sur certains sites qu'elle m'a proposé. N'y ayant pas trouvé de possible piste je me lance donc dans des réflexions très compliquées. Je finis donc par comprendre que la méthode du signal qui parcourt littéralement le câble pour aller alimenter une sortie est beaucoup trop compliquée car elle emploie des notions de programmation que je ne connais pas.
Après maintes réflexions je me trouve une petite piste qui me semble pas idiote du tout. Elle consiste à stocker le circuit dans une matrice sous la forme de valeurs puis à lire cette matrice de gauche à droite et de haut en bas. Lorsque le pointeur de la boucle qui lit la matrice se trouve sur une valeur qui est entourée (toujours dans la matrice) d'un ou de plusieurs éléments (valeurs) qui sont « alimentés » alors on alimente l'élément se trouvant à la place du pointeur. Et ainsi de suite plusieurs fois pour être sur que le signal se propage dans tout le circuit. Lancé sur cette piste je me lance dans l'élaboration du programme.
Rapidement je me rends compte qu'un premier problème se pose : comment coder un élément allumé ou éteint ? La solution : chaque élément, c'est à dire chaque câble, levier (alimentation), ampoule est codé avec un nombre dans la matrice qui sert de support au circuit. Ce nombre est constitué de deux parties, l'une, la dizaine, correspond au type de l'élément (10=levier, 20=câble,... etc), l'autre, l'unité, correspond à l'état de l'élément (0=éteint, 1=allumé). On peut de cette manière distinguer par exemple un levier allumé d'un levier éteint. Ainsi, lors de la lecture de la matrice, un élément allumé aura son code (nombre dans la matrice) se terminant par un « 1 ».
Je termine donc le programme dans cette lancée puis crée mon premier circuit. Déjà le programme se trouvait très lent. A la première exécution je constate que l'ampoule qui se trouve avant le levier (j'avais : [Ampoule][2*Câble][levier]) ne s'allume pas. En fait le signal ne se propageait que de gauche à droite en raison de la boucle de lecture de la matrice. Pour régler ce problème, j'ajoute un double de la première boucle mais qui lit la matrice dans l'autre sens : de droite à gauche et de bas en haut. De cette manière le courant peut aller dans toutes les directions.
Au départ, pour savoir si un élément était allumé je faisait un simple test pour touts les éléments possibles. Ce qui s’avérait très long. Pour parer à cette répétition, je finis par découvrir la commande « Frac » qui permet de récupérer la partie décimale d'un nombre. Je remplace donc toutes mes conditions par de simple calculs avec « Frac » : je divise le nombre qui correspond à un élément à coté du pointeur de la boucle dans la matrice par 10 puis en récupère la partie décimale. Si je trouve « 0,1 » c'est que l'élément est alimenté, si je trouve zéro, alors il ne l'est pas.
Ce fut la dernière mise au point de ce programme. Suite à celle-ci je n'ait fait que des modifications esthétiques et de contenu (ajout d'éléments).
Malgré mes efforts ce programme reste lent. Il est néanmoins très fonctionnel. Je conseille de l'utiliser sur le programme
C.Basic de
Sentaro21, il y est presque instantané comparé au 15s d'attente à chaque placement d'élément et exécutions en Basic.
N'hésitez pas à tester le programme maintenant et à commenter !
Merci de m'avoir lu et à bientôt sur Planète Casio !
Effectivement, ce genre de simulations n'est pas facile car il y a une grande quantité de données à traiter à chaque étape (21×7 objets pouvant contenir du courant à l'écran). As-tu pensé à utiliser des techniques de calcul matriciel pour travailler sur toute la matrice en une seule opération ?
Notre second article de la soirée est partagé par
Lightmare. Son topic
Pokémon Obsidienne [C.Basic] suscite de l'attention en tant que l'un des premiers gros projets C.Basic. L'interpréteur est mis à l'épreuve mais produit de très bons résultats !
Voyons comme avance la programmation du futur meilleur Pokémon Basic de Planète Casio !
Lightmaaaaare ! a écrit :bonjouuuur ! j'apporte des nouvelles fraîchement pêchée sur mon projet de pokemon Obsidienne codé en C.Basic ! Premièrement, je tiens à remercier vivement les commentaires de soutien du projet qui ont été publiés lors de la dernière RDP
!
Alors maintenant, du concret :
- j'ai ajouté le menu avec : - les sauvegardes
- la liste des pokémons
- l'écran de combat ( la beauté graphique n'est pas au rendez-vous mais j'en profite pour caser le premier pokémon du jeu : Evoli ! )
- changement de la manière de gérer le changement de cartes ( l'ancien programme ne permettait pas de changer de map si on était pas sur un bord d'écran
)
- une démo téléchargeable sur le
topic dédié ! hell yeah !
Superbe ! N'hésite pas à mettre plus de photos, voire -soyons fous- une vidéo de ce jeu en pleine action !
La dernière intervention de ce soir est de
Krevo_. L'homme au projet unique (le seul qui y parvient... !) et son
Casio Basic Web Interpreter qui permet d'exécuter des programmes Basic dans votre navigateur, sans installation ni calculatrice.
L'outil s'est amélioré progressivement depuis 2014, et y voit exécutés des programmes toujours plus complexes. Alors, quelle surprise pour nous ce soir ?
Krevo_ a écrit :Dans la
Rdp 129, je vous annonçait le redémarrage de mon projet
Casio Basic Web Interpreter. Aujourd'hui, 2 mois plus tard, il est temps de faire un point d'étape.
Petite liste des ajouts fait entre-temps :
- ajout de la fonction 'GetKey' avec un petit clavier virtuel et un programme d'exemple éponyme.
- Syntax error avec le numéro de ligne correspondante (..... ce qui m'a amené à envisager de faire monter la version du compilateur/parser "js/cc" car je pense que j'aurais moins galéré .... mais ça ne se fait pas sans bien tester et éventuellement réécrire certains morceaux) ... du coup le textarea est augmenté à sa gauche avec les numéro de lignes ce qui est plus pratique.
- GetKey : j'ai mis un mapping / correspondance clavier du pc <-> clavier virtuel calculatrice (donc on peut cliquer sur les touches du clavier virtuel et ça alimente getKey et réponds aussi à l'input ... et inversement)... voir les programmes d'exemple "GetKey" et "TextMenu".
- ajout de And/Or/Xor/Not (et d'un programme de test/exemple : "Bool. table") ... comme ça on peut faire les exemples du tutoriel Basic Casio de ce site, en bas de la page conditions.
- (du coup revu ≥, ≤, ≠, <, > pour qu'ils renvoient bien 0 ou 1 et non true/false de Javascript)
- ajout des variables manquantes : rhô ("r") et thêta ("θ" ou "t") .... parce que c'était pas grand chose à faire...
- ajout de la touche DEL (code touche Casio : 44) sur le clavier virtuel (mappée au Backspace du clavier PC)
- début du support des listes
Et là grosse nouvelle de ce début d'année 2019, c'est que j'ajoute dès à présent :
- le
support des couleurs (White, Black, Blue, Red, Magenta, Green, Cyan, Yellow) et les instructions qui vont avec (Plot/Line-Color color et le support de
color devant une instruction graphique type F-Line, Horizontal, ...)
- le
support d'une "haute" résolution d'écran de 379x187 pixels (qui correspond à la taille de la
zone addressable en Basic de l'écran d'une Graph 90+E sauf erreur...)
Ainsi donc les démos "screen saver" et "random dots" sont modifiés pour utiliser des couleurs. Et un nouveau programme d'exemple fait son apparition "lines" :
Certains verront dans tout ça un fort lien avec le gain récent d'un Graph 90+E au
puzzle de l'avent... c'est pas impossible
Pour la suite, je ne manque pas de choses à faire. Il y a d'une part une liste de problèmes connus à régler et une liste conséquente d'instructions non-encore implémentées. Sans parler de quelques surprises "fonctionnelles" à venir dans l'année, selon le temps qui pourra être consacré au projet et les difficultés rencontrées.
A bientôt.
Krevo_
Des couleurs et de la haute résolution ! Oui, tout le monde aura pensé à la Graph 90+E. Un jour peut-être on pourra tester les programmes Basic sans même posséder la calculatrice appropriée ?
Voilà qui conclut la revue des projets de ce soir. Soutenez les créateurs de cette semaine et n'hésitez pas à nous parler de vos propres projets, sur le forum ou dans la revue de la semaine prochaine !
À bientôt sur Planète Casio !
Lire la revue des projets précédente : La revue des projets - 135
Soumettre à un article pour la prochaine revue : Formulaire de soumission
Ces deux dernières semaines, sept programmes ont été publiés :
•
Circuit de
Disperseur
•
City de
Krevo_
•
La Lorien de
Shadow15510
•
Tuiles et co de
Shadow15510
•
Calendrier univ de
Krevo_
•
Carton de loto de
Theodu26
•
Ptune3 de
Sentaro21
Citer : Posté le 13/01/2019 22:19 | #
Bravo Lephen' pour ta rapidité .
P.S:oublie pas ma lettre
Passé ici il y a peu. ಥ‿ಥ
Jouez à Mario sans arrêt sur votre Casio !
City Heroes
Piano Casio
Micro GIMP
Citer : Posté le 13/01/2019 22:23 | #
Désolé, je te cause des problèmes... je remonte tout ça dans la liste de priorité pour pas te faire attendre.
Citer : Posté le 13/01/2019 22:54 | #
Merci pour cette RdP riche et intéressante !
Citer : Posté le 14/01/2019 00:42 | #
Sympa tout ça
Citer : Posté le 14/01/2019 07:23 | #
@Lephenixnoir : à l'occasion j'aimerais que tu me parle un peu de la technique matricielle stp
-Planétarium 2
Citer : Posté le 14/01/2019 07:42 | #
Génial Lephe ! Je vais mettre le topic a jour quand j'aurai le temps !
Sinon piur le Casio Web interpreter, je me demandais si on pouvait utiliser directement un fichier g1m ou non ?
Dijkstra - The Witcher
Citer : Posté le 14/01/2019 07:57 | #
@Lephenixnoir : à l'occasion j'aimerais que tu me parle un peu de la technique matricielle stp
Eh bien, c'est pas très difficile : imagine que tu arrives à prendre ta matrice et la « décaler » d'une colonne vers la droite. Tu auras donc deux matrices dont les positions I,J donnent les états originaux des cases I,J et I-1,J. Ensuite tu peux écrire une fonction mathématique pour combiner les deux (il faut donc t'arranger pour que le format d'entiers que tu utilises marche bien) et l'appliquer sur toute la matrice !
Citer : Posté le 14/01/2019 09:34 | #
Sinon piur le Casio Web interpreter, je me demandais si on pouvait utiliser directement un fichier g1m ou non ?
Non, hélas. Le projet n'en est pas encore au stade de pouvoir le faire, ... mais c'est quelque-chose qu'il faudra faire à terme.
Citer : Posté le 14/01/2019 09:36 | #
Désolé, je te cause des problèmes... je remonte tout ça dans la liste de priorité pour pas te faire attendre.
OK merci
Passé ici il y a peu. ಥ‿ಥ
Jouez à Mario sans arrêt sur votre Casio !
City Heroes
Piano Casio
Micro GIMP
Citer : Posté le 14/01/2019 12:19 | #
@Lephenixnoir: oui mais je vois pas comment je peut propager le courant de cette manière ? Avec une fonction combinée a ta technique être..
-Planétarium 2
Citer : Posté le 14/01/2019 13:34 | #
Par exemple, suppose que dans ta matrice il y a un 1 s'il y a du courant et 0 sinon (pas d'autres infos, pour simplifier).
Mettons que Mat A c'est la matrice actuelle. Tu calcules Mat B en décalant Mat A vers la droite, en suite tu peux faire :
Mat A+Mat B>0→Mat A
et hop, tout le courant qui était dans la matrice A s'est propagé vers la droite.
Citer : Posté le 14/01/2019 14:24 | #
Il serait juste de parler de tous les programmes publiés depuis la précédente Rdp (donc ici sur les 2 dernières semaines, puisqu'il n'y a pas eu de Rdp dimanche dernier)
Citer : Posté le 14/01/2019 17:41 | #
@Lephenixnoir: Mais on peut pas décaler la matrice de 1 vers la gauche autrement que par boucle non ? Et ça change si on ajoute des dizaines aux nombres que contient la matrice pour ajouter une info comme je fais actuellement ?
-Planétarium 2
Citer : Posté le 14/01/2019 18:11 | #
Il serait juste de parler de tous les programmes publiés depuis la précédente Rdp (donc ici sur les 2 dernières semaines, puisqu'il n'y a pas eu de Rdp dimanche dernier)
Urg, ce que je suis... inefficace. Toutes mes excuses, c'est corrigé. -_-"
@Lephenixnoir: Mais on peut pas décaler la matrice de 1 vers la gauche autrement que par boucle non ? Et ça change si on ajoute des dizaines aux nombres que contient la matrice pour ajouter une info comme je fais actuellement ?
Ben déjà tu peux utiliser Mat→List() et List→Mat(), ce qui te permet de ne travailler qu'avec les colonnes. Il n'y a même pas de boucle.
Ensuite, c'est là que tu commences à t'amuser. Tout ce que tu fais avec les entiers (modulos, divisions, parties entières) pour maintenir ton format, tu peux faire exactement pareil sur la matrice : ça agira juste sur toutes les cases en même temps.
Si j'étais toi, je séparerais le courant et le type d'objet dans deux matrices différentes pour profiter d'avoir des formats moins compliqués.
Ajouté le 14/01/2019 à 18:17 :
Encore modifié, puisque les utilitaires ne sortent pas sur la page où je croyais qu'ils sortent... enfin le script est pas comme il faut... comme tout le reste du site de toute façon.
Citer : Posté le 14/01/2019 18:52 | #
@Lephenixnoir : Ok du coup je décale dans chaque direction la matrice pour déplacer le courant dans toutes les directions ?
-Planétarium 2
Citer : Posté le 14/01/2019 18:54 | #
Je veux un Mentali dans ce jeu, Lightmare. Tu m'entends ? Tu as fait un Evoli, c'est bien, c'est cute. Mais il faut un Mentali. Sinon c'est pas un bon jeu Pokemon. La survie de Planet-Casio dépend de toi. Voilà.
Bravo à Disperseur pour ton programme, il a l'air vraiment bien réalisé. Compte-tu ajoutern d'autres fonctionnalités à ton utilitaire ?
Ajouté le 14/01/2019 à 18:48 :
Je signale au passage que, ayant supprimé mon système d'exploitation, je ne peux pas assurer une communication sur les réseaux sociaux...
Citer : Posté le 14/01/2019 18:59 | #
@Massena: Merci !
Tu peut tester sinon ça serait cool. Et oui je compte ajouter la porte logique xor ainsi que des timers (Ça va pas être de la tarte ).
-Planétarium 2
Citer : Posté le 14/01/2019 19:04 | #
@Lephenixnoir : Ok du coup je décale dans chaque direction la matrice pour déplacer le courant dans toutes les directions ?
Yup. C'est l'idée.
Je signale au passage que, ayant supprimé mon système d'exploitation, je ne peux pas assurer une communication sur les réseaux sociaux...
Noté, pas de problème ! Dis-nous quand tu auras une estimation du temps que ça va durer.
Citer : Posté le 14/01/2019 19:06 | #
@Lephenixnoir : Mais pour la décaler verticalement j'utilise les listes mais alors horizontalement ?
-Planétarium 2
Citer : Posté le 14/01/2019 19:27 | #
Eh bien tu transposes, tu décales verticalement et tu re-transposes !