Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| SUPER MINI LOGO | |
| | Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: SUPER MINI LOGO Dim 10 Juin 2012 - 18:07 | |
| Panoramiciens de tous les continents, salut. Le langage LOGO, vous connaissez ? Sur le plan informatique, Logo est un langage de programmation orientée objet réflexif. Plus lisible que le Lisp, il en est une adaptation, ce qui lui a valu le surnom de « Lisp sans parenthèses ». Essentiellement connu pour la fameuse tortue graphique, mais est également capable de manipuler des listes, des fichiers et des entrées/sorties,... ce qui en fait un langage adapté à l'approche des concepts de l'algorithmique. Je vous propose SUPER_MINI_LOGO : un petit interpréteur LOGO, entièrement écrit en PANORAMIC. Il s'agit ici simplement d'instructions de dessin. Impossible donc, d'afficher du texte ou de créer des procédures récursives. Mais ça permet malgré tout de créer de petits programmes graphiques et d'initier les petits (et même les grands) à LOGO et de là à la programmation. SUPER_MINI_LOGO m’a pris beaucoup de temps et il comporte encore quelques bugs mais je n’ai plus envi de m’y replonger. Tel qu’il est, il permet de faire des belles choses. Le code est bien documenté par des lignes REM et il comporte une aide pour expliquer son utilisation. Lisez donc l’aide avant d’essayer de programmer en logo. - Code:
-
' ****************************************************************************** ' ' S U P E R M I N I L O G O ' ' Par Papydall ' ' ******************************************************************************
' Pour démontrer les possibilités de ce programme, voici quelques exemples ' des procedures réalisables que vous pouvez copier/coller et exécuter
' ************************************** ' POUR MAISON ' REPETE 4 [ AV 150 TD 90 ] ' TD 90 AV 50 TG 90 ' REPETE 2 [ AV 70 TD 90 AV 50 TD 90 ] ' TG 90 AV 50 TD 90 AV 150 TD 30 ' REPETE 3 [ AV 150 TD 120 ] ' TD 60 AV 20 TG 90 AV 1 LC AV 35 BC ' AV 55 TD 90 AV 20 TD 90 AV 20 ' FIN ' ***********************************
' *************************************
' POUR SUPERCUBE ' INIT LC ' FPOS -30 150 BC FPOS -150 150 FPOS -90 210 FPOS 30 210 FPOS -30 150 FPOS -30 -210 ' FPOS 30 -150 FPOS 30 -90 FPOS -30 -90 FPOS 90 -90 FPOS 90 30 FPOS -270 30 FPOS -270 -90 ' FPOS -210 -90 FPOS -210 -30 FPOS -90 -30 FPOS -90 -150 FPOS -210 -150 FPOS -210 -30 FPOS -150 30 ' FPOS -30 30 FPOS -90 -30 FPOS 90 150 FPOS 30 150 FPOS 30 210 FPOS 30 90 FPOS 90 90 FPOS 90 150 ' FPOS 90 90 FPOS 150 90 FPOS 150 -30 FPOS 90 -90 FPOS 90 30 FPOS 150 90 LC FPOS -150 30 BC ' FPOS -150 150 FPOS -150 90 FPOS -210 90 FPOS -270 30 LC FPOS -90 -150 BC FPOS -30 -90 LC ' FPOS -150 -150 BC FPOS -150 -210 FPOS -30 -210 ' FIN ' *************************************
' *** routine principale label labels : gosub labels gosub variables ' gosub initialisations gosub form0
gosub menu gosub GUI gosub initialisations end
' ****************************************************************************** ' *** définition de tous les labels labels: label variables,form0,menu,GUI,initialisations,init label nouveau,ouvrir,enregistrer,enregistrer_sous,quitter label aide,apropos,close_apropos label executer,decoder,lire_commande,interpreter,proc label couleur_crayon,couleur_fond,avance_recule,tourne_droite,tourne_gauche label baisse_crayon,leve_crayon,repeter,decode_couleur,fixe_cap,ramene_centre label apprends,exec_proc,fixe_position label axex,axey,axexy return
' ****************************************************************************** ' *** définition de toutes les variables variables: dim no%,parent_1%,parent_2%,nom_fichier$,no_open%,no_save%,no_options% dim no_apropos%,no_aide% dim i%,j%,l%,s$ dim cr,cg,cb : ' Couleurs R,G,B dim ccr,ccg,ccb : ' couleurs R,G,B du crayon dim fcr,fcg,fcb : ' Couleurs R,G,B du fond dim nl$ : nl$ = chr$(13) + chr$(10) : ' Nouvelle ligne dim version$ : version$ = "V01.00" dim creation$ : creation$ = "05 Mai 2012" dim modif$ : modif$ = "10 Juin 2012" dim form_graph%,commande$,saisie%,execution%,cmd$,long%,acmd$,res dim x0,y0,xc,yc,cap,a,b,valeur%,xp,yp,pi,rad,sens,erreur,true,false,nbrepet% dim al%,a$,acommande$,crep$,command$,nbproc%,sauv%,sauvx%,fich$,msg$ dim procedures$(99) : ' Tableau des procédures définies par l'utilisateur dim proc$ ,long dim k%,suite$ dim lx,ly ,x,y return
' ****************************************************************************** ' *** configuration de l'écran principal form0: width 0,800 : height 0,700 caption 0," S U P E R M I N I L O G O" return
' ****************************************************************************** ' *** création des menus menu: no% = no% + 1 : main_menu no% : parent_1% = no% no% = no% + 1 : sub_menu no% : parent no%,parent_1% parent_2% = no% : caption no%,"Fichier" no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"Nouveau" : on_click no%,nouveau no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"Ouvrir..." : on_click no%,ouvrir no% = no% + 1 : sub_menu no% : parent no%,parent_2% : inactive no% sauv% = no% caption no%,"Enregistrer" : on_click no%,enregistrer no% = no% + 1 : sub_menu no% : parent no%,parent_2% : inactive no% sauvx% = no% caption no%,"Enregistrer sous.." : on_click no%,enregistrer_sous no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"Quitter" : on_click no%,quitter ' *** no% = no% + 1 : memo no% : width no%,800 : height no%,600 saisie% = no% : font_size no%,10 : font_color no%,255,255,255 color no%,0,0,150 : font_bold no% : inactive no% no% = no% + 1 : button no% : top no%,600 : left no%,100 width no%,150 : caption no%,"Exécuter" : on_click no%,executer no% = no% + 1 : button no% : top no%,600 : left no%,400 width no%,150 : caption no%,"Editeur" no% = no% + 1 : form no% : width no%, 800 : height no%, 640 caption no%, "SUPER MINI LOGO GRAPH" : form_graph% = no% : inactive no% no% = no% + 1 : form no% : width no%,300 : height no%,700 left no%,800 : caption no%,"SUPER MINI LOGO EXECUTION" execution% = no% : inactive no% no% = no% + 1 : sub_menu no% : parent no%,parent_1% parent_2% = no% : caption no%,"Aide" no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"Aide" : on_click no%, aide no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"A-propos" : on_click no%, apropos return ' ****************************************************************************** ' création de tous les objets Panoramic GUI: ' *** d'abord les objets invisibles
no% = no% + 1 : open_dialog no% : no_open% = no% filter no%,"Fichier texte|*.sml" no% = no% + 1 : save_dialog no% : no_save% = no% filter no%,"Fichier texte|*.sml"
' *** la fenêtre a-propos avc ses champs no% = no% + 1 : form no% : hide no% : no_apropos% = no% : parent_1% = no% caption no%,"A-propos" top no%, 200 : left no%,200 : height no%,150 : width no%,250 on_close no%,close_apropos no% = no% + 1 : alpha no% : parent no%,parent_1% top no%,20 : left no%,20 s$ = "Application Panoramic " + nl$ s$ = s$ + "Version : " + version$ + nl$ s$ = s$ + "Date : " + creation$ + nl$ s$ = s$ + "Dernière modif : " + modif$ + nl$ s$ = s$ + "Auteur : Papydall" + nl$ caption no%,s$
' *** la fenêtre d'aide avec ses champs no% = no% + 1 : form no% : hide no% : no_aide% = no% : parent_1% = no% caption no%,"Aide" top no%, 0 : left no%,0 : height no%,700 : width no%,1030 on_close no%,close_apropos no% = no% + 1 : alpha no% : parent no%,parent_1% top no%,5 : left no%,5
s$ = string$(100," ") s$ = s$ + "M o d e d ' e m p l o i"+nl$ s$ = s$ + string$(100," ") s$ = s$ + "*************************" +nl$+nl$ s$ = s$ + "SUPER_MINI_LOGO est une version très limitée du celèbre langage LOGO qui est lui-même dérivé du langage LISP" +nl$ s$ = s$ + " utilisé dans l'intelligence artificielle." +nl$+nl$ s$ = s$ + "Il s'agit ici simplement d'instructions de dessin. Impossible donc, d'afficher du texte ou de créer des"+nl$ s$ = s$ + "procédures récursives. Mais ça permet malgré tout de créer de petits programmes graphiques et d'initier"+nl$ s$ = s$ + "les petits (et même les grands) à LOGO et de là à la programmation."+nl$ s$ = s$ + string$(200,"-") +nl$ s$ = s$ + " Actuellement, SUPER_MINI_LOGO comprend 20 commandes et on peut en rajouter d'autres."+nl$ s$ = s$ + " Certaines commandes nécessitent un ou plusieurs paramètres, d'autres aucun paramètre."+nl$ s$ = s$ + " Le programme ne fait pas la différences entre caractères minuscules et majuscules"+nl$ s$ = s$ + " Listes des commandes: "+nl$ s$ = s$ + " INIT : permet d'initialiser le système; couleur du fond en noir,couleur du tracé en vert,"+nl$ s$ = s$ + " origine de l'écran graphique au milieu de l'écran, cap de la tortue vers le Nord (90°),"+nl$ s$ = s$ + " crayon baissé (la tortue laisse une trace en se déplaçant)"+nl$ s$ = s$ + " EEG : Efface l'Ecran Graphique permet d'éffacer l'écran graphique, tous les paramètres de la tortue"+nl$ s$ = s$ + " restent inchangés ( position, cap, couleur etc...)"+nl$ s$ = s$ + " FCC couleur : Fixe la Couleur du Crayon , permet de fixer la couleur du tracé.Cette commande nécessite"+nl$ s$ = s$ + " un argument : couleur qui peut prendre l'une des 8 'valeurs' suivantes : "+nl$ s$ = s$ + " ROUGE,VERT,BLEU,NOIR,BLANC,JAUNE,VIOLET,GRIS.Exemple : FCC JAUNE"+nl$ s$ = s$ + " FCF couleur : Fixe la Couleur du Fond. Exemple FCF NOIR"+nl$ s$ = s$ + " FCAP angle : Fixe le cap de la tortue. l'argument 'angle' doit être compris entre 0 et 360°"+nl$ s$ = s$ + " 0 vers l'Est (l'axe des X), 90 vers le Nord (axe des Y),180 vers l'ouest et 270 vers le Sud."+nl$ s$ = s$ + " Exemple : FCAP 40,faire pointer la tortue vers 40° par rapport à l'axe des X (sens trigonométrique)"+nl$ s$ = s$ + " FPOS X Y : deplace la tortue au point de coordonnées X Y (0 0 étant le centre de l'écran)"+nl$ s$ = s$ + " Cette commande nécessite 2 arguments X et Y et ils doivent être separés par un espace"+nl$ s$ = s$ + " Exemple: fpos 100 200 deplace la tortue au point de coordonnées X = 100 et Y = 200 par rapport au centre(0 0)"+nl$ s$ = s$ + " CENTRE : Ramène la tortue au centre de l'écran et dirige la tortue vers le Nord(90°)"+nl$ s$ = s$ + " BC : Baisse Crayon , en se deplaçant la tortue laisse sa trace"+nl$ s$ = s$ + " LC : Lève Crayon , en se déplaçant, la tortue ne laisse pas de trace"+nl$ s$ = s$ + " AV n : Avance de n pas (n pixels) dans la direction de la tortue en laissant ou non une trace"+nl$ s$ = s$ + " selon que le crayon est baissé(BC) ou levé (LC). Exemple : AV 100"+nl$ s$ = s$ + " RE n : Recule de n pas . Exemple RE 150"+nl$ s$ = s$ + " TD a : Tourne à Droite de a dégrés par rapport à la direction de la tortue. Exemple TD 90"+nl$ s$ = s$ + " TG a : Tourne à Gauche de a dégrés par rapport à la direction de la tortue. Exemple TG 120 "+nl$ s$ = s$ + " AXEX : Trace l'axe des X"+nl$ s$ = s$ + " AXEY : Trace l'axe des Y"+nl$ s$ = s$ + " AXEXY : Trace les 2 axes"+nl$ s$ = s$ + " REPETE n [ liste_d_instructions ] : Voici une commande très puissante qui permet de répeter n fois la liste d'instructions"+nl$ s$ = s$ + " qui se trouvent entre crochets. Il doit y avoir un espace entre REPETE et n, entre n et [, entre [ et "+nl$ s$ = s$ + " la liste des intructions et entre le dernier caractère de la liste d'instructions et ]."+nl$ s$ = s$ + " La liste_d_instructions peut contenir n'importe quelle commande autorisée sauf la commande REPETE."+nl$ s$ = s$ + " Il n'est pas possible d'imbriquer des commandes REPETE!"+nl$ s$ = s$ + " Exemple : REPETE 4 [ av 200 td 90 ] dessine un carré de 200 pixels de côté "+nl$ +nl$ s$ = s$ + " Toutes ces commandes peuvent être utilisées en mode direct, c-à-d , on peut écrire une commande ou plusieurs séparéés "+nl$ s$ = s$ + " par des espaces ou des retours à la ligne(touche <enter> )"+nl$+nl$ s$ = s$ + " SUPER_MINI-LOGO vous permet également de définir des procédures( sorte de programes) que vous pouvez sauver sur"+nl$ s$ = s$ + " disque et recharger au besoin."+nl$ s$ = s$ + " Une procedure doit être comprise entre les 2 mots réservés POUR et FIN. Lorsque vous exécuter une procédure,"+nl$ s$ = s$ + " le système affiche ' vous avez défini....' les points de suspensions indiquent le nom de la procédure"+nl$ s$ = s$ + " A partir de là, vous pouvez exécuter cette procedure autant de fois que vous voulez (tant que vous n'êtes pas sorti du" +nl$ s$ = s$ + " programme ! Pour celà vous devez appeler la procédure par : @Nom_de_la_procédure, sans espace ente le signe @ et" +nl$ s$ = s$ + " Nom_de_la_procédure"+nl$ +nl$ s$ = s$ + " Exemple de définition d'une procédure"+nl$ +nl$ s$ = s$ + " POUR MAISON "+nl$ s$ = s$ + " REPETE 4 [ AV 150 TD 90 ] "+nl$ s$ = s$ + " TD 90 AV 50 TG 90 "+nl$ s$ = s$ + " REPETE 2 [ AV 70 TD 90 AV 50 TD 90 ]"+nl$ s$ = s$ + " TG 90 AV 50 TD 90 AV 150 TD 30 "+nl$ s$ = s$ + " REPETE 3 [ AV 150 TD 120 ] "+nl$ s$ = s$ + " TD 60 AV 20 TG 90 AV 1 LC AV 35 BC "+nl$ s$ = s$ + " AV 55 TD 90 AV 20 TD 90 AV 20 "+nl$ s$ = s$ + " FIN "+nl$ +nl$ s$ = s$ + " Exécutez votre procédure. Si elle est correcte, le système vous indique que vous défini MAISON. Mais si votre"+nl$ s$ = s$ + " procédure contient des erreurs, le système affiche un message d'erreur et vous invite à retourner à l'éditeur"+nl$ s$ = s$ + " pour corriger."+nl$ s$ = s$ + " Pour sauvegarder votre procédure, choisissez un répertoire à votre convenance et donnez un nom à votre procédure "+nl$ s$ = s$ + " obligatoirement suivi de l'extension .SML"+nl$ s$ = s$ + " Vous pouvez charger des procédures déjà enregistées ou définir d'autres procédures. A partir de là, vous pouvez"+nl$ s$ = s$ + " exécuter vos procédures simplement en les appelant par @Non_Procedure. Exemple @MAISON, exécute la procédure"+nl$ s$ = s$ + " MAISON qui a été définie." +nl$+nl$
font_size no%,12 : color no% ,0,80,80 : font_color no%, 255,255,0 :font_bold no% caption no%,s$
return
' ****************************************************************************** ' *** Initialiser différentes variables initialisations:
nbproc% = 0 procedures$(0) = str$(nbproc%):' procedures$(0)contient le nombre des procédures pi = 4*atn(1) : rad = pi/180 true = 1 : false = 0 lx = 800 : ly = 640 xc = lx/2 : yc = ly/2 : ' Origine de l'écran graphique cap = 90 : ' Direction de la tortue (vers le nord) acmd$ = "" gosub init
return
' ****************************************************************************** ' *** afficher la page d'aide
aide:
show no_aide% : to_foreground no_aide% : return
' ****************************************************************************** ' *** afficher la page à-propos
apropos:
inactive 0 : show no_apropos% : return
' ****************************************************************************** ' *** fermer la page a-propos
close_apropos:
hide no_apropos% : active 0 : to_foreground 0 : return
' ****************************************************************************** ' *** On sort du programme
quitter:
terminate : return
' ****************************************************************************** ' **** Nouveau fichier
nouveau:
nom_fichier$ = "" active saisie% : clear saisie% : active sauv% : active sauvx% set_focus saisie% return
' ****************************************************************************** ' **** Charger un fichier existant
ouvrir:
active saisie% : clear saisie% : set_focus saisie% s$ = file_name$(no_open%) : if s$="_" then return nom_fichier$ = s$ : file_open_read saisie%,nom_fichier$ ' charger le fichier print_target_is saisie% while file_eof(saisie%) <> 1 : file_readln saisie%,a$:print a$ : end_while file_close saisie% : active sauv% : active sauvx% return
' ****************************************************************************** ' **** Enregistrer le fichier
enregistrer:
msg$ = "Ce fichier existe déjà." + nl$ + "Voulez-vous le remplacer ?" if nom_fichier$="" message "Il n'y a aucun nom de fichier connu" return end_if if file_exists(nom_fichier$)=1 if message_confirmation_yes_no(msg$)<>1 then return end_if file_open_write saisie%,nom_fichier$ file_writeln saisie%,fich$ file_close saisie% return
' ****************************************************************************** ' **** Enregistrer le fichier sous un autre nom
enregistrer_sous:
s$ = file_name$(no_save%) : if s$="_" then return if instr(right$(s$,5),".")=0 then s$ = s$ + ".sml" nom_fichier$ = s$ : gosub enregistrer return
' ****************************************************************************** ' Interpréter et exécuter les differentes commandes de l'utilisateur
executer:
commande$ = "" : erreur = false for l% = 1 to count(saisie%) commande$ = commande$ + " " + nl$ + " " + item_read$(saisie%,l%)+ " " next l% commande$ = upper$(trim$(commande$))+" #"
fich$ = left$(commande$,instr(commande$," #")) gosub ramene_centre print_target_is execution% : cls ' **** Interpréter les différentes commandes interpreter: active execution% : to_foreground execution% : ' Zone d'info if commande$ = " #" : ' Ancune commande ? message " !!! Il n'y a rien à interpréter !!!" : ' Alors afficher print " !! ERREUR !! " : ' le message et print " Retournez à l'éditeur pour corriger" : ' sortir return end_if long% = 1
while long% < len(commande$) and erreur = false : ' Tant que la chaîne des ' commandes n'est pas vide ' et pas d'erreur gosub lire_commande : ' Extraire une commande de la chaîne des commandes if cmd$ <> "#" : ' Une commande existe ? gosub decoder : ' Alors décoder cette commande end_if if erreur = true : ' Si erreur dans la commande, afficher un message print " !! ERREUR !! " print " Retournez à l'éditeur pour corriger" end_if end_while : ' On a traité toutes les commandes
return
' ****************************************************************************** ' Extraire une commande de la chaine COMMANDE$ lire_commande: cmd$ = "" : l% = long% while mid$(commande$,l%,1) = " " : l% = l% + 1: end_while while mid$(commande$,l%,1) <> " " and mid$(commande$,l%,1) <> "#" cmd$ = cmd$ + mid$(commande$,l%,1) : l% = l% + 1 end_while long% = l% + 1
return ' ****************************************************************************** ' decoder les différentes commandes decoder: active form_graph% : to_foreground form_graph% : 2d_target_is form_graph% if cmd$ = nl$ then return : ' Il n'y a rien, juste une nouvelle ligne <CR>+<LF> if mid$(cmd$,1,1) = "@" then gosub exec_proc : return : ' Executer une procédure dejà définie if cmd$ = "INIT" then gosub init : return : ' Initialiser le mode graphique if cmd$ = "POUR" then gosub proc : return : ' Definition d'une procèdure if cmd$ = "FIN" then return : ' Fin de la procédure if cmd$ = "EEG" then cls : return : ' Efface écran graphique if cmd$ = "FCC" then gosub couleur_crayon : return : ' Fixe la couleur du crayon if cmd$ = "FCF" then gosub couleur_fond : return : ' Fixe la couleur du fond if cmd$ = "FPOS" then gosub fixe_position : return : ' Fixe la nouvelle position de la tortue if cmd$ = "BC" then gosub baisse_crayon : return : ' La tortue laisse sa trace if cmd$ = "LC" then gosub leve_crayon : return : ' La tortue ne laisse pas de trace if cmd$ = "REPETE" then gosub repeter : return : ' Boucle de repétition if cmd$ = "AV" sens = 1 : gosub avance_recule : return : ' Avancer de n pas end_if if cmd$ = "RE" sens = -1 : gosub avance_recule : return : ' Reculer de n pas end_if if cmd$ = "TD" then gosub tourne_droite : return : ' Tourner à droite if cmd$ = "TG" then gosub tourne_gauche : return : ' Tourner à gauche if cmd$ = "FCAP" then gosub fixe_cap : return : ' Fixer le cap if cmd$ = "CENTRE" then gosub ramene_centre: return : ' Ramène la tortue au ' centre de l'écran if cmd$ = "AXEX" then gosub axex : return : ' Tracer l'axe des X if cmd$ = "AXEY" then gosub axey : return : ' Tracer l'axe des Y if cmd$ = "AXEXY" then gosub axexy : return : ' Tracer les 2 axes X et Y
erreur = true res = message_error_ok (" !!!! Je ne sais pas comment faire !!!") acmd$ = "" return
' ****************************************************************************** ' *** Initialisation du mode graphique init: 2d_target_is form_graph% color form_graph% ,0,0,0 : ' Couleur du fond (noir par défaut) cr = 0 : cg = 255 : cb = 0 : ' Couleur verte 2d_pen_color cr,cg,cb : ' Couleur du tracé (vert par défaut) fcr = 0 : fcg = 0 : fcb = 0 : ' Sauvegarder la couleur du fond ccr = cr : ccg = cg : ccb = cb : ' sauvegarder la couleur du crayon 2d_poly_from xc,yc : ' Centre de l'écran graphique x0 = xc : y0 = yc : ' Origine au centre de l'écran graphique 2d_clear return
' *** Commande FCC c ---> fixe couleur crayon couleur_crayon: gosub lire_commande :' print cmd$ acmd$ = cmd$ : gosub decode_couleur 2d_pen_color cr,cg,cb ccr = cr : ccg = cg : ccb = cb : ' Sauvegarder la couleur du crayon return ' ****************************************************************************** ' *** Commande FCF c ---> fixe couleur fond couleur_fond: gosub lire_commande :' print cmd$ acmd$ = cmd$ : gosub decode_couleur color form_graph%,cr,cg,cb fcr = cr :fcg = cg : fcb = cb : ' Sauvegarder la couleur du fond return ' ****************************************************************************** ' Commande AV n /RE n ---> avance/recule de n pas dans la direction de la tortue avance_recule:
gosub lire_commande acmd$ = cmd$
if numeric(cmd$) = 0 erreur = true message " !!! Valeur numérique attendue après AV / RE !!!" : return else erreur = false end_if
valeur% = val(cmd$) if sens = 0 - 1 then cap = cap + 180 a = cos(cap*rad) : b = sin(cap*rad) xp = x0 + a * valeur% : yp = y0 - b * valeur% 2d_line x0,y0, xp,yp : x0 = xp : y0 = yp
return ' ****************************************************************************** ' *** Commande TD a ---> tourne à droite (sens horaire) d'un angle a en degrés tourne_droite:
gosub lire_commande acmd$ = cmd$ if numeric(cmd$) = 0 erreur = true message "!!! Valeur numérique attendue après TD !!!" : return end_if
valeur% = val(cmd$) cap = cap - valeur% return ' ****************************************************************************** ' *** Commande TG a ---> tourne à gauche (sens trigonométrique) d'un angle a en ' degrés tourne_gauche:
gosub lire_commande acmd$ = cmd$ if numeric(cmd$) = 0 erreur = true message "!!! Valeur numérique attendue après TG !!!" : return end_if
valeur% = val(cmd$) cap = cap + valeur% return ' ****************************************************************************** ' *** Commande FCAP a ---> Fixe cap : fixer le cap de la tortue à l'angle a en ' degrés sens trigonométrique fixe_cap:
gosub lire_commande acmd$ = cmd$ if numeric(cmd$) = 0 erreur = true message "!!! Valeur numérique attendue après FC !!!" : return end_if
valeur% = val(cmd$) cap = valeur% return ' ****************************************************************************** ' Commande CENTRE ---> Ramène la tortue au centre de l'écran graphique, ' direction nord ramene_centre: x0 = xc : y0 = yc : ' Origine de l'écran graphique cap = 90 : ' Direction de la tortue (vers le nord) ' ****************************************************************************** ' *** Commande BC ---> baisse crayon : le tracé se fait avec la couleur fixée ' par FCC c baisse_crayon: 2d_pen_color ccr,ccg,ccb : ' Restituer la couleur du crayon return ' ****************************************************************************** ' *** Commande LC ---> lève crayon : le tracé se fait dans la couleur du fond, ' donc invisible leve_crayon:
2d_pen_color fcr,fcg,fcb : ' Couleur du fond pour le crayon return ' ****************************************************************************** ' *** Commande REPETE n [ liste_d_instructions ] ---> boucle de repétitions
repeter: gosub lire_commande acmd$ = cmd$ if numeric(cmd$) = 0 erreur = true message "!!! Valeur numérique attendue après REPETE !!!" : return end_if
nbrepet% = val(cmd$) : gosub lire_commande if cmd$ <> "[" erreur = true message "!!! [ attendu après REPETE !!!" : return end_if cmd$ = acmd$ + " " + cmd$ l% = long% - 1 : al% = l% crep$ = "" : ' commande de repetition while mid$(commande$,al%,1) <> "]" cmd$ = cmd$ + mid$(commande$,al%,1) crep$ = crep$ + mid$(commande$,al%,1) al% = al% + 1 end_while cmd$ = cmd$ + mid$(commande$,al%,1) if mid$(commande$,al%,1) <> "]" erreur = true message "!!! ] attendu dans la boucle REPETE !!!" : return end_if erreur = false acommande$ = mid$(commande$,al% + 1,len(commande$)) : ' Sauvegarder les ... ' ... commandes après la boucle de répetition commande$ = crep$ : ' Traiter la boucle for i% = 1 to nbrepet% gosub interpreter next i% commande$ = acommande$ : ' Continuer le traitement après la boucle if commande$ <> " #" then gosub interpreter return ' ****************************************************************************** ' *** Commande de décodage des couleurs données par leurs noms de couleurs decode_couleur: if cmd$ = "ROUGE" cr = 255 : cg = 0 : cb = 0 : return end_if if cmd$ = "VERT" cr = 0 : cg = 255 : cb = 0 : return end_if if cmd$ = "BLEU" cr = 0 : cg = 0 : cb = 255 : return end_if if cmd$ = "NOIR" cr = 0 : cg = 0 : cb = 0 : return end_if if cmd$ = "BLANC" cr = 255 : cg = 255 : cb = 255 : return end_if if cmd$ = "JAUNE" cr = 255 : cg = 255 : cb = 0 : return end_if if cmd$ = "VIOLET" cr = 255 : cg = 0 : cb = 255 : return end_if
if cmd$ = "GRIS" cr = 127 : cg = 127 : cb = 127 : return end_if erreur = true message " !!! Un nom de couleur attendu !!!" return ' ****************************************************************************** ' *** Ajouter une procédure au tableau des procédures proc: nbproc% = nbproc% + 1 : ' Incrémenter le nombre des procédures procedures$(0) = str$(nbproc%) : ' Contient le nombre des procédures gosub lire_commande proc$ = "@" + cmd$ + mid$(commande$,l%,len(commande$))
proc$ = mid$(proc$,1,len(proc$)-5) gosub apprends return
' ****************************************************************************** ' *** Apprendre la procédure pour l'utiliser lors de l'appel par @xxx apprends: print "Vous avez défini ";cmd$ procedures$(nbproc%) = proc$ : ' Ajouter la procédure en cours au tableau return ' ****************************************************************************** ' *** Executer une procédure dejà definie exec_proc: k% = 1 : suite$ = mid$(commande$,l%,len(commande$)) suite$ = left$(suite$,instr(suite$," #"))
erreur = false repeat if cmd$ <> mid$(procedures$(k%),1,len(cmd$)) then k% = k% + 1 until cmd$ = mid$(procedures$(k%),1,len(cmd$)) or k% > val(procedures$(0)) if cmd$ = mid$(procedures$(k%),1,len(cmd$)) commande$ = upper$(procedures$(k%)) commande$ = mid$(commande$,len(cmd$)+1,len(commande$)-len(cmd$)) gosub interpreter else erreur = true message " !!! " + cmd$ + " n'est pas défini !!!" end_if commande$ = suite$ : ' Continuer le traitement
gosub interpreter return ' ****************************************************************************** ' *** Commande FPOS X Y --> Fixer la position de la tortue en X et Y ' l'origine 0 0 est au centre de l'écran et non le point supérieur gauche ! fixe_position:
gosub lire_commande acmd$ = cmd$ if numeric(cmd$) = 0 erreur = true message "!!! Valeur numérique attendue après FPOS !!!" : return end_if
x = val(cmd$) xp = xc + x
gosub lire_commande acmd$ = cmd$ if numeric(cmd$) = 0 erreur = true message "!!! Valeur numérique attendue après FPOS !!!" : return end_if
y = val(cmd$) yp = yc - y
2d_poly_to xp,yp x0 = xp : y0 = yp
return ' ****************************************************************************** ' *** Commande AXEX --> Tracer l'axe des X axex: 2d_line 0,ly/2,lx,ly/2 return ' ****************************************************************************** ' *** Commande AXEY --> Tracer l'axe des Y axey: 2d_line lx/2,0,lx/2,ly return ' ****************************************************************************** ' *** Commande AXEXY --> Tracer les 2 axes X et Y axexy: 2d_line 0,ly/2,lx,ly/2 : 2d_line lx/2,0,lx/2,ly return ' ******************************
Voici quelques exemples de procédures que vous pouvez expérimenter. Copier le code et faites Fichier, nouveau et coller ; puis bouton exécuter - Code:
-
POUR MAISON REPETE 4 [ AV 150 TD 90 ] TD 90 AV 50 TG 90 REPETE 2 [ AV 70 TD 90 AV 50 TD 90 ] TG 90 AV 50 TD 90 AV 150 TD 30 REPETE 3 [ AV 150 TD 120 ] TD 60 AV 20 TG 90 AV 1 LC AV 35 BC AV 55 TD 90 AV 20 TD 90 AV 20 FIN
- Code:
-
POUR SUPERCUBE INIT LC FPOS -30 150 BC FPOS -150 150 FPOS -90 210 FPOS 30 210 FPOS -30 150 FPOS -30 -210 FPOS 30 -150 FPOS 30 -90 FPOS -30 -90 FPOS 90 -90 FPOS 90 30 FPOS -270 30 FPOS -270 -90 FPOS -210 -90 FPOS -210 -30 FPOS -90 -30 FPOS -90 -150 FPOS -210 -150 FPOS -210 -30 FPOS -150 30 FPOS -30 30 FPOS -90 -30 FPOS 90 150 FPOS 30 150 FPOS 30 210 FPOS 30 90 FPOS 90 90 FPOS 90 150 FPOS 90 90 FPOS 150 90 FPOS 150 -30 FPOS 90 -90 FPOS 90 30 FPOS 150 90 LC FPOS -150 30 BC FPOS -150 150 FPOS -150 90 FPOS -210 90 FPOS -270 30 LC FPOS -90 -150 BC FPOS -30 -90 LC FPOS -150 -150 BC FPOS -150 -210 FPOS -30 -210 FIN
- Code:
-
POUR ROSACE REPETE 100 [ AV 200 TD 45 AV 50 TD 124 ] FIN
- Code:
-
POUR ROSACE2 REPETE 180 [ AV 200 TD 45 AV 50 TD 136 ] FIN
J’espère que ce mini interpréteur vous donne satisfaction ! | |
| | | ambroise
Nombre de messages : 264 Localisation : Haute-Savoie Date d'inscription : 29/04/2012
| Sujet: Re: SUPER MINI LOGO Dim 10 Juin 2012 - 19:02 | |
| Merci pour ce programme "amusant" !
| |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: SUPER MINI LOGO Dim 10 Juin 2012 - 20:29 | |
| Bonsoir Papydall J'avais déjà pensé faire un LOGO, mais j'attendais encore de bien maîtroser certaines instructions de Panoramic. Hélas, tu m'as devancé. Ce n'est pas grave, j'ai d'autres projets en réserve! Ton programme est bien fait. Par contre, pour certaines instructions, comme BC j'aurais mis TRACE ou LC j'auraos mis LEVE; pour RE: RECULE, etc... pour la compréhension. Je pense surtout aux enfants qui peuvent aborder la programmation avec ce genre de langage somme toute assez simple. Mais rien ne m'empêche de changer tes mots clés dans ton programme! Merci pour cet excellent programme! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: SUPER MINI LOGO Dim 10 Juin 2012 - 21:52 | |
| Salut Bignono. Tu peux toujours faire ton LOGO ; ça ne peut qu’être bénéfique pour tous. Je, surtout, fais ce programme pour tester mes connaissances en PANORAMIC. Je suis d’accord avec toi en ce qui concerne les noms des commandes : AVANCE est plus parlant que AV par exemple. Et la modification est très facile dans ce cas. Je suis certain que tu peux faire un programme beaucoup mieux que moi. Je suis un apprenti ; tu es un maitre. Quand le cœur t’en dira alors fonce ! A+ | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: SUPER MINI LOGO Dim 10 Juin 2012 - 23:43 | |
| Merci Papydal, à nous les joies du dessin ... Dis moi Papydal, je dois me tromper quelque part ou alors ce n'est pas possible Je crois que normalement si je définit: - Code:
-
POUR QCERCLE REPETE 45 [ AV 2 TD 2 ] FIN => Je l'enregistre en Qcercle.sml Ne devrais-je pas pouvoir l'utiliser ensuite dans - Code:
-
POUR PETALE REPETE 2 [ @QCERCLE TD 90 ] FIN
Là si je lance PETALE, il ne fait qu'un QCERCLE, ce qui m'ennui, mais bon, je m'y prends peut être mal. Dis moi si je fais une erreur Pareil, si je définit PETALE ainsi: - Code:
-
POUR PETALE @QCERCLE TD 90 @QCERCLE FIN => Je trace mon pétale Par contre, si je l'appelle par - Code:
-
POUR FLEUR REPETE 10 [ @PETALE TD 360/10 ] FIN => Seul la moitié d'un pétale est tracé. Je ne comprends pas, même si l'appel dans une boucle pause problème, il devrait au moins faire un pétale entier, non ? Petit problème dans le code ou c'est moi qui utilise mal ? | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: SUPER MINI LOGO Lun 11 Juin 2012 - 0:53 | |
| Sinon, une autre étoile: - Code:
-
Pour Etoile5 repete 5 [ av 50 td 144 ] Fin - Code:
-
Pour Etoile7 repete 7 [ av 50 td 102.8 ] Fin | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: SUPER MINI LOGO Lun 11 Juin 2012 - 1:45 | |
| Salut Jicehel.
Ce n’est pas toi qui prends mal. Si dans ta procédure pétale, tu remplace @qcercle par son code, tu t’aperçois qu’il y a une boucle REPETE dans une boucle REPETE. Or, les REPETE imbriquées ne sont pas possibles. J’ai essayé de les coder mais je n’y étais pas parvenu. Autre bug : quand on appelle une procédure par @PROCEDURE, tout ce qui vient après n’est pas pris en charge ! Exemple : après avoir défini QCERCLE, si tu fais @QCERCLE AV 100 …. Seul QCERCLE sera dessiné et AV 100… Ignoré.
Ceci est dû à ce que j’ai commis l’erreur que tout programmeur, même débutant, NE DOIT PAS commettre, à savoir commencer un programme sans avoir étudier, au préalable sa structure. J’ai voulu testé mes acquis en PANORAMIC (sans penser à faire un programme utilisable) et petit à petit j’ai ajouté des bouts de codes pour essayer. Je me suis trouvé donc avec un programme décousu et mal pensé. Par exemple, j’ai ajouté " #" comme marque de fin à la fin de chaque saisie (soit disant pour faciliter l’interprétation) J’ai ajouté ensuite la définition, la sauvegarde et la réutilisation d’une procédure. Son interprétation était mal étudiée.
Bref, je n’aurai pas dû poster ce programme, mais ce qui est fait est fait. Bignono a dit qu’il a envisagé de faire un programme de ce genre. J’espère qu’il le fasse car avec un Big on ne fait pas les choses à moitié.
Voilà, maintenant tu dispose du code. Si tu as envi, corriges-le, modifies-le, ou fais de lui ce qui te plaira.
A+
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: SUPER MINI LOGO Lun 11 Juin 2012 - 7:25 | |
| Je ne pense pas que tu as mal fait Papydall. Regarde mon jeu de dames, il était plein de bugs et la communauté m'a aider pour le débuggage en me disant les problèmes trouvés. Tu as essayé de faire quelque chose et ce n'est pas parfait. Soit tu t’arrêtes là et ton programme peut servir de base pour quelqu'un pour faire un interpréteur de commande ou syntaxique simple. (L’interpréteur syntaxique fonctionne très bien). Sois tu cherches à résoudre le problème de l'appel des procédure (par exemple en passant par une DLIST pour stocker le code en attente comme une pile (voir le programme de Nardo26 sur les arbres par exemple). (Genre lors de l'appel d'une procédure => Tu empiles l'état du compteur pour une boucle, le code en cours et la poisiton de retour dans le code par exemple, c'est l'idée la plus simple qui me vienne). Quand tu rencontre le mot fin, tu vérifie si tu as quelque chose dans ta dlist (en commençant par le dernier élément ajouté) et tu restaure le contexte comme ça tu peux avoir des appels imbriqués) Après comme ajout possible et pratique, il y a les paramètres de procédures, mais ça complique encore. Programmer un LOGO complet ne s'est pas fait en un jour. Tu t'es attaqué à un beau morceau Personnellement, j'espère que tu persévérera car le programme est bien parti et je te remerci d'avoir partagé ce code. Il y a pleins d'idées à récupérer dedans | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: SUPER MINI LOGO Lun 11 Juin 2012 - 14:04 | |
| En plus de la DLIST lors des appels, je te conseille de remplacer procédures$(99) par une autre DLIST, ça te permet d'avoir plus de souplesse d'utilisation (notamment de ne pas avoir à limiter ton tableau. Tu ajoutes dedans au fur et à mesure si besoin. Sinon, dans la routine quitter, tu peux supprimer le "return" qui n'est pas utile Sinon, le programme est très joliment fait au niveau du source (no d'objet, appels de sous programme et commentaires, il manque juste peut-être quelques commentaires sur les déclarations de varaibles, mais je te rassure, perso, je ne le fais pas non plus ) | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: SUPER MINI LOGO Lun 11 Juin 2012 - 15:28 | |
| Bonjour, Juste un petit détail... (mais vraiment c'est pour chipoter ) un truc aussi que je fais, par exemple sur la procédure tourne_droite: - Code:
-
tourne_droite: gosub lire_commande acmd$ = cmd$ if numeric(cmd$) = 0 erreur = true message "!!! Valeur numérique attendue après TD !!!" else valeur% = val(cmd$) cap = cap - valeur% end_if return J'essaye, dans la mesure du possible, de n'avoir qu'un seul return pour les procédures et de tout indenter entre le label et l'instruction return. Ce n'est pas obligatoire, mais je trouve que cela améliore la lisibilité du code. Une chose aussi: Il n'y pas de test sur l'existence du fichier dans la procédure "ouvrir" - Code:
-
ouvrir: ACTIVE saisie% : CLEAR saisie% : SET_FOCUS saisie% s$ = FILE_NAME$(no_open%) : IF s$<>"_" IF FILE_EXISTS(s$)=1 nom_fichier$ = s$ FILE_OPEN_READ saisie%,nom_fichier$ ' charger le fichier PRINT_TARGET_IS saisie% WHILE FILE_EOF(saisie%) <> 1 : FILE_READLN saisie%,a$:PRINT a$ : END_WHILE FILE_CLOSE saisie% ACTIVE sauv% : ACTIVE sauvx% ELSE MESSAGE "Fichier inexistant !" END_IF END_IF RETURN | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: SUPER MINI LOGO Lun 11 Juin 2012 - 23:35 | |
| Salut tout le monde. Ambroise, Bignono, Jicehel, Nardo26, merci à vous tous pour vos interventions et conseils. Comme je l’ai dis dans un précédent post, le programme a été ‘cousu’ de toutes pièces ! Je voulais expérimenter ce que j’ai pu récolter comme informations (à partir des réponses données par tous à des questions posées par certains, …) J’ai pioché un peu et même assez dans le ‘squelette’ donné par Klaus (merci Klaus). Et puis, (l’appétit vient en mangeant) je me trouve en train de fabriquer un mosaïque de programme ! @TOUS Je vous propose ceci : Du programme SUPER_MINI_LOGO, prenez les parties intéressantes, modifiez certaines parties, ajoutez d’autres fonctions. Chacun peut apporter sa contribution pour, au final, aboutir à un petit interpréteur LOGO, entièrement écrit en PANORAMIC ! Vos enfants ou vos petits-enfants peuvent s’initier à la programmation et apprendre plusieurs choses (la notion d’orientation, les rotations, la notion de polygones et la relation entre le nombre de répétitions et la valeur de l’angle pour tourner à droite ou à gauche, etc.…) Le programme sera modulaire et chacun (selon ses compétences) peut ajouter une nouvelle commande…. Ensuite, lorsque le programme sera finalisé, il peut être mis (comme exemple, avec d’autres programmes) dans la documentation de PANORAMIC. Si cette proposition vous intéresse, allez-y pour la concrétiser. | |
| | | Contenu sponsorisé
| Sujet: Re: SUPER MINI LOGO | |
| |
| | | | SUPER MINI LOGO | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |