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 |
|
|
| La fourmi de Langton | |
| | 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: La fourmi de Langton Ven 7 Oct 2016 - 3:30 | |
| - Code:
-
rem ============================================================================ rem La fourmi de Langton rem Par Papydall rem ============================================================================ rem Règles du jeu : rem Sur une grille dont les cases peuvent être blanches ou bleues, on met une rem petite flèche invisible dans la case centrale : ce sera notre fourmi. rem L orientation de la flèche indiquera sa direction. rem A chaque tour, la fourmi se déplace selon les règles suivantes : rem Si la fourmi est sur une case blanche, elle effectue une rotation vers la droite. rem Si elle est sur une case bleue, elle effectue une rotation vers la gauche. rem La fourmi inverse la couleur de la case sur laquelle elle se trouve rem (blanc devient bleu et réciproquement). rem La fourmi avance d’une case dans la direction de son orientation. rem ============================================================================ rem Les phases de la vie de la fourmi: rem La fourmi obéit à des règles très simples et pourtant, quand on la simule rem pendant quelques miliers de tours, il se passe des choses vraiment étonnantes. rem La fourmi va passer par 3 phases très différentes : rem 1) La phase "symétrique" rem 2) La phase "chaotique" rem 3) La phase "autoroute" rem ============================================================================ rem Au début de son évolution, la fourmi se balade dans une zone assez limitée rem de la grille, en dessinant des configurations régulières et symétriques. rem Mais à partir de 500 tours, tout change. Elle se met à avoir un comportement rem chaotique, en élargissant son terrain de jeu et en créant des configurations rem très irrégulières. rem Cette phase chaotique dure jusqu’à environ 10000 tours, et là le miracle se rem produit : la fourmi entame la construction d’une autoroute très régulière qui rem la conduit à l’infini. rem ============================================================================ rem L’autoroute est en fait un motif périodique de 104 pas qui se répète. rem Personne ne comprend pourquoi elle apparaît et comment elle peut émerger du rem désordre qui caractérise la phase chaotique. rem Ce qu’il y a de plus perturbant, c’est que même si on part d’une grille dont rem les cases sont coloriées aléatoirement en blanc ou en bleu, l’autoroute finit rem toujours par apparaître un jour ou l’autre. rem ============================================================================ rem A quoi sert la fourmi ? rem La fourmi de Langton est un bel exemple de ce concept un peu flou que tout rem un tas de monde appelle l’émergence. Il s’agit en gros du fait qu’un système rem au comportement élémentaire simple peut donner lieu à un comportement global rem complexe. On retrouve cette idée en informatique, en physique, en biologie rem ou en sociologie. rem ============================================================================
Init() Fourmi()
end rem ============================================================================ SUB Init() dim xc,yc,sens,cote,demi_cote,iter height 0,800 : width 0,800 : color 0,250,200,150 picture 10 : width 10,width(0)-100 : height 10,height(0) -100 top 10,50 : left 10,50 : 2d_target_is 10 : color 10,255,255,255 Alpha 20 : top 20,10 : left 20,100 : font_bold 20 : font_size 20,20 font_name 20,"arial" : font_color 20,0,0,255 caption 20,"La fourmi de Langton <ESC> pour arrêter" ' xc = width(10)/2 : yc = height(10)/2 : ' Coordonnées de départ à modifier xc = width(10) *.74 : yc = height(10)*0.25 cote = 6 : ' Côté de la case à modifier selon votre goût (2,4,6) demi_cote = cote/2 sens = 0 : ' 0,1,2,3 <--- haut, gauche, bas, droite 2d_pen_color 255,255,254 2d_rectangle xc - demi_cote,yc - demi_cote,xc + demi_cote,yc + demi_cote END_SUB rem ============================================================================ SUB Fourmi()
repeat iter = iter + 1 if iter < 500 caption 0, "Itération : " + str$(iter) + " : Phase symétrique" end_if if iter < 10000 caption 0, "Itération : " + str$(iter) + " : Phase chaotique" else caption 0, "Itération : " + str$(iter) + " : Phase autoroute" end_if
if color_pixel_red(10,xc,yc) = 255 : ' case blanche ? 2d_rectangle xc - demi_cote,yc - demi_cote,xc + demi_cote,yc + demi_cote 2d_flood xc,yc,0,0,255 : ' colorier en bleu Tourner_Droite() else 2d_rectangle xc - demi_cote,yc - demi_cote,xc + demi_cote,yc + demi_cote 2d_flood xc,yc,255,255,255 : ' colorier en blanc Tourner_Gauche() end_if until scancode = 27 fin() END_SUB rem ============================================================================ SUB Tourner_Droite()
select sens case 0 : ' vers le haut sens = 1 : ' vers la la droite xc = xc + cote case 1 : ' vers la droite sens = 2 : ' vers le bas yc = yc + cote case 2 : ' vers le bas sens = 3 : ' vers la gauche xc = xc - cote case 3 : ' vers la gauche sens = 0 : ' vers le haut yc = yc - cote end_select if xc < 0 or xc > width(10) or yc < 0 or yc > height(10) then fin()
END_SUB rem ============================================================================ SUB Tourner_Gauche()
select sens case 0 : ' vers le haut sens = 3 : ' vers la gauche xc = xc - cote case 1 : ' vers la droite sens = 0 : ' vers le haut yc = yc - cote case 2 : ' vers le bas sens = 1 : ' vers la droite xc = xc + cote case 3 : ' vers la gauche sens = 2 : ' vers le bas yc = yc + cote end_select if xc < 0 or xc > width(10) or yc < 0 or yc > height(10) then Fin()
END_SUB rem ============================================================================ SUB Fin() if scancode = 27 caption 20,"La fourmi de Langton : Programme arrêté" else if iter > 10000 then caption 20,"La fourmi de Langton : Phase autoroute" end_if end END_SUB rem ============================================================================
| |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: La fourmi de Langton Ven 7 Oct 2016 - 7:32 | |
| Bonjour Papydall ! Je n'ai pas encore testé ton programme, mais j'ai pris le temps de lire l’histoire de cette fourmi que tu as placé au début. C'est vraiment surprenant ! Quel destin exceptionnel pour cette petite fourmi ! Cela confirme une fois de plus que l'univers n'est pas né du chaos comme certains souhaiterai le faire croire... | |
| | | mimic
Nombre de messages : 103 Localisation : france Date d'inscription : 02/09/2009
| Sujet: Re: La fourmi de Langton Ven 7 Oct 2016 - 9:30 | |
| Bonjour,
j'ai testé ce sympathique programme, cependant :
1. pas le temps de voir le résultat des 500 premiers tours. 2. le programme s'arrête après 9460 tours dans la phase chaos.
| |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| | | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: La fourmi de Langton Ven 7 Oct 2016 - 11:03 | |
| Bonjour tout le monde. Minibug et Mimic, merci pour vos retours. Si le programme ne va pas jusqu’à « L’autoroute » c’est que votre écran n’est pas assez grand. Pour cela vous pouvez jouer sur la variable cote en ligne 63 : Pour les petits écrans, utiliser une valeur faible cote = 4 ou cote = 2Vous pouvez aussi utiliser tout l’écran pour le PICTURE en modifiant la ligne 56 : full_space 0 : full_space 10Voici pour différentes valeurs de cote ce que j’obtiens sur mon écran de 1600/900 - cote=10:
- cote=6:
- cote=2:
| |
| | | Harzonis
Nombre de messages : 11 Date d'inscription : 04/11/2016
| Sujet: la fourmi de Langton Mar 8 Nov 2016 - 0:43 | |
| J'ai écris un code de la fourmi de Langton sans m'occuper du tout de l'ergonomie ou de l'animation car je ne maîtrise pas du tout la syntaxe de ce langage. Il n'y a pas de phase chaotique, c'est une facilité de langage. Sinon les même conditions initiales ne donnerais pas le même résultat. Par contre la calcul est tres complexe. Il est intéressant de faire tourner cette moulinette dans des matrices courtes (3,3) ; (9;9) en passant d'un bord à l'autre quand on décrémente en dessous de zero ou au dessus de la limite de la matrice. On voit apparaître beaucoup de régularités. Sur 22 itérations pour une matrice (3,3) La régularité grandi avec une proportion logarithmique quand l'espace grandi. Ensuite il existe la création d'une condition cyclique avec une période fixe (104 si j'ai bonne mémoire) . Il y a quelque chose qui ressemble à ce que les matheux appellent "l'attracteur étrange". Mais ce n'est pas du chaos. Il y a une lois, une équations surement très complexe qui doit aboutir à la quantité de cycles nécessaires pour créer des conditions d'une périodicité régulière = 104
Votre code est excellent. Bravo
===========Voici le mien===============
' Foumie de Langton ' ========================================== ' Couleur de la case: ' variable [clr(x,y)=0] pour blanc ' variable [clr(x,y)=1] pour noir ' ==========Position BLANC tourne Droite=========== ' = Direction mouvement=x ou y NewDirection = ' = nord x+1 est = ' = sud x-1 ouest = ' = est y+1 sud = ' = ouest y-1 nord = ' ================================================= ' ' =========Position NOIR Tourne Gauche============= ' =Direction mouvement=x ou NewDirection = ' = nord x-1 ouest = ' = sud x+1 est = ' = est y-1 nord = ' = ouest y+1 sud = ' ================================================= ' L'espace de mouvement se fait dans [DIM clr (x,y)] ' La couleur de la case est dans [DIM CLR (x,y)] ' La variable direction$ prend les valeurs: ' [nord],[sud],[est],[ouest] ' ' ' ' =====DECLARATIONS=========
label mouvblanc, mouvnoir, debut label initaffiche, affiche1, affiche2
label testavant, testapres :' à virer dim ancx, ancy : ' coordonnées ancienne couleur (celle qu'on quitte) dim tx,ty: ' controle de la matrice
dim a$ :' sortir de la boucle et stopper le programme dim bcl :' Qt cycle d'iteration dim i : ' indice de cycle dim oksub :' controle de sortie des sub pour gerer END_IF
dim xmax, ymax, x,y, direction$ dim temporisation
dim somx, somy : ' somme des mouvements (convergeances)
xmax=22 :rem hauteur ymax=22 :rem largeur
dim clr(xmax, ymax):' espace max contient couleur case
rem ================================================= rem ========init de la position de départ============ rem =================================================
x=int(xmax/2) : rem position de départ milieu x y=int (ymax/2) :rem position de départ milieu y oksub=0 : ' Pour contourner la complication de la syntaxe End_if clr(x,y)=1: ' Couleur blanc (0) noir (1) aux coordonnées x,y direction$= "nord" bcl= 200000: ' quantité d'iterations temporisation =1 rem FAIRE Sub initialisation des couleurs de départ rem FAIRE sub pour disposer de choix initiaux
' ========== Mise en route==========
gosub initaffiche : ' initialise l'espace de l'écran for i=1 to bcl print_locate 10,10 gosub testavant Gosub debut gosub testapres somx=somx+x somy=somy+y print "cycle="; i; " somx=";somx;" somy="; somy print gosub affiche2 : rem ou affiche1
a$=inkey$ : ' =====control de déroulement======= rem wait temporisation if not (a$="") then stop next i ' ================================================= print print "=================" print print "voilà c'est fini" beep: beep: beep: end ' ===============FIN DE PROGRAMME===========================
' =============DEMARRAGE du PROGRAMME ====================== debut: If clr(x,y)=0 gosub mouvblanc else :' car clr(x,y) =1 gosub mouvnoir end_if oksub=0 return ' ============================si blanc========= mouvblanc: ' =================Blanc nord=======OK=========================== if direction$="nord" : ' nord + tourne droite = est clr(x,y) =1 :' Blanc devient noir oksub=1 print "je suis à BLANC Nord, Prochain : x+1 Est" if x = xmax : ' limite(x) du tableau [scene] : x repart à zero x = -1 end_if x=x+1 direction$="est" end_if if oksub=1 then return
' =================Blanc sud============OK=================== if direction$="sud" : ' sud + tourne droite = ouest clr(x,y) =1 :' Blanc devient noir oksub=1 print "je suis à BLANC sud, Prochain : x-1 ouest" if x = 0 : ' limite(x) du tableau [scene] : x repart à xmax: x= xmax+1 end_if x=x-1 direction$="ouest" end_if if oksub=1 then return ' =================Blanc est============================== if direction$="est" : ' est + tourne droite = sud clr(x,y) =1 :' Blanc devient noir oksub=1 print "je suis à BLANC est Prochain = y+1 sud" if y = ymax y= -1 : ' limite(x) du tableau [scene] : y repart à zero end_if y=y+1 direction$="sud" end_if if oksub=1 then return ' =================Blanc ouest=============================== if direction$="ouest" : ' ouest + tourne droite = nord clr(x,y) =1 :' Blanc devient noir oksub=1 print "je suis à BLANC ouest, Prochain : y+1 Nord" if y = 0 y= ymax+1 : ' limite(x) du tableau [scene] : x repart à zero end_if y=y-1 direction$="nord" end_if if oksub=1 then return ' =====================Fin Blanc============================== ' ==========si NOIR==tourne gauche======= mouvnoir: ' =================Noir nord===>====ouest========================= if direction$="nord" : ' nord + tourne gauche = ouest clr(x,y)=0: ' Noir devient blanc oksub=1 print "je suis à noir nord, Prochain : x-1 ouest" if x = 0 : ' limite(x) du tableau [scene] : x repart à zero x=xmax+1 end_if x=x-1 direction$="ouest" end_if if oksub=1 then return ' =================Noir sud===>===est========================= if direction$="sud" : ' sud + tourne gauche = est clr(x,y)=0: ' Noir devient blanc oksub=1 print "je suis à noir sud, Prochain : x+1 est" rem stop if x = xmax : ' limite(x) du tableau [scene] : x repart à xmax x= -1 end_if x=x+1 direction$="est" end_if if oksub=1 then return ' =================Noir est===>===nord======================== if direction$="est" : ' est + tourne gauche = nord clr(x,y)=0: ' Noir devient blanc oksub=1 print "je suis à noir est, Prochain : y-1 NOrd" if y = 0 y= ymax+1 : ' limite(x) du tableau [scene] : y repart à ymax end_if y=y-1 direction$="nord" end_if if oksub=1 then return ' =================Noir ouest====>=====sud=================== if direction$="ouest" : ' ouest + tourne gauche = sud clr(x,y)=0: ' Noir devient blanc oksub=1 print "je suis à noir ouest, Prochain : y+1 sud" if y = ymax y= -1 : ' limite(x) du tableau [scene] : x repart à zero end_if y=y+1 direction$="sud" end_if if oksub=1 then return
rem normalement aucun test ne doit échouer Print "ERREUR" stop ' =====================Fin noir==============================
initaffiche: rem ========================================================== rem LA FOURMIE DE LANGTON rem données d'affichage rem ========================================================== rem Espace de mouvement xmax et ymax rem le 0 de xmax est à gauche rem le 0 de ymax est en haut
rem la position courante est x,y
rem la couleur de la case courante est dans clr(x,y) rem noir => clr(x,y)=1 rem blanc => clr(x,y)=0
rem Orientation de la case est dans direction$ rem direction$ = ou (nord, sud, est, ouest)
rem écran : nord en HAUT; sud en BAS; est à DROITE; ouest à GAUCHE rem ========================================================== ' Formatage de l'espace d'affichage ' pas envie de me faire chier avec les modules exotiques de ce basic
left 0,22 : rem position depuis haut de la fenetre sur l'écran top 0,22 : rem position depuis gauche de la fenetre sur l'écran width 0, 2000 : rem largeur fenetre height 0,2000 :rem hauteur fenetre return rem ========================================================
affiche1: rem ====================================================== rem === AFFICHAGE ALPHA 1 === rem ====================================================== print " Simulation de l'automate de LANGTON" print " ===================================" for tx=0 to xmax
for ty=0 to ymax print clr (tx,ty);" "; next ty print next tx return rem ======================================================
affiche2: rem ====================================================== rem === AFFICHAGE ALPHA 2 === rem ====================================================== print " Simulation de l'automate de LANGTON" print " ===================================" for tx=0 to xmax
for ty=0 to ymax if clr (tx,ty)=0 then print " ";" "; else print clr (tx,ty);" "; end_if next ty print next tx return rem ========================================================== ' =========================CONTROL=========================== testavant: print "=====avant============" ancx=x ancy=y print "je quitte x=" ;x;" y=";y print "couleur départ clr(x,y)= "; clr(x,y); if clr(x,y)=1 then print " noir" if clr(x,y)=0 then print " blanc" print "direction$= " ; direction$ print "___________________" return
testapres: print "======apres===========" print "je viens de anc x= ";ancx; " et anc y= ";ancy print "couleur départ de ";ancx;" ";ancy;" est devenu= ";clr(ancx, ancy); if clr(ancx,ancy)=1 then print " noir" if clr(ancx,ancy)=0 then print " blanc print "------------------------" print "j'arrive à x=" ;x;" y=";y print "Jarrive sur la case clr(x,y)= "; clr(x,y); if clr(x,y)=1 then print " noir" if clr(x,y)=0 then print " blanc" print "direction$= " ; direction$
print "________________________" return
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: La fourmi de Langton Mar 8 Nov 2016 - 0:58 | |
| Juste un petit conseil: place ton code entre balises [ code] ... [ /code] (sans les espaces). Ces balises sont générées automatiquement si tu cliques sur la deuxième icône de gauche du deuxième groupe d'icônes de droite dans la barre d'outils - celle qui représente une pace blanche avec "<>". | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: La fourmi de Langton Mar 8 Nov 2016 - 4:50 | |
| Bienvenue sur le Forum Harzonis ! Pour un 1er code, c’est une réussite : BRAVO ! On voit que tu sais programmer (dans un autre langage, n’est-ce pas ?). Tu ne maîtrises sans doute pas bien Panoramic, mais tu te débrouilles plutôt bien. Bref, j’ai corrigé une petite erreur dans ton code. D’ailleurs, comme tu l’as posté, il affiche l’erreur More IF than END_IF - Code:
-
if clr (tx,ty)=0 then print " ";" "; else print clr (tx,ty);" "; end_if
Cette structure est incorrecte : Si tu utilises then , tu dois continuer sur la même ligne : else : … ou bien tu vires then et tu continues sur une nouvelle ligne. Voire la modification que j’ai faite en lignes 272 et 273. Je te remets le code indenté et entre les balises - Code:
-
' Foumie de Langton ' ========================================== ' Couleur de la case: ' variable [clr(x,y)=0] pour blanc ' variable [clr(x,y)=1] pour noir
' ==========Position BLANC tourne Droite=========== ' = Direction mouvement=x ou y NewDirection = ' = nord x+1 est = ' = sud x-1 ouest = ' = est y+1 sud = ' = ouest y-1 nord = ' ================================================= ' ' =========Position NOIR Tourne Gauche============= ' =Direction mouvement=x ou NewDirection = ' = nord x-1 ouest = ' = sud x+1 est = ' = est y-1 nord = ' = ouest y+1 sud = ' ================================================= ' L'espace de mouvement se fait dans [DIM clr (x,y)] ' La couleur de la case est dans [DIM CLR (x,y)] ' La variable direction$ prend les valeurs: ' [nord],[sud],[est],[ouest] ' ' ' ' =====DECLARATIONS=========
label mouvblanc, mouvnoir, debut label initaffiche, affiche1, affiche2
label testavant, testapres :' à virer dim ancx, ancy : ' coordonnées ancienne couleur (celle qu'on quitte) dim tx,ty: ' controle de la matrice
dim a$ :' sortir de la boucle et stopper le programme dim bcl :' Qt cycle d'iteration dim i : ' indice de cycle dim oksub :' controle de sortie des sub pour gerer END_IF
dim xmax, ymax, x,y, direction$ dim temporisation
dim somx, somy : ' somme des mouvements (convergeances)
xmax=22 :rem hauteur ymax=22 :rem largeur
dim clr(xmax, ymax):' espace max contient couleur case
rem ================================================= rem ========init de la position de départ============ rem =================================================
x=int(xmax/2) : rem position de départ milieu x y=int (ymax/2) :rem position de départ milieu y oksub=0 : ' Pour contourner la complication de la syntaxe End_if
clr(x,y)=1: ' Couleur blanc (0) noir (1) aux coordonnées x,y direction$= "nord" bcl= 200000: ' quantité d'iterations temporisation =1
rem FAIRE Sub initialisation des couleurs de départ rem FAIRE sub pour disposer de choix initiaux
' ========== Mise en route==========
gosub initaffiche : ' initialise l'espace de l'écran for i=1 to bcl print_locate 10,10 gosub testavant Gosub debut gosub testapres somx=somx+x somy=somy+y print "cycle="; i; " somx=";somx;" somy="; somy print gosub affiche2 : rem ou affiche1
a$=inkey$ : ' =====control de déroulement======= rem wait temporisation if not (a$="") then stop next i
' ================================================= print print "=================" print print "voilà c'est fini" beep: beep: beep: end ' ===============FIN DE PROGRAMME===========================
' =============DEMARRAGE du PROGRAMME ====================== debut: If clr(x,y)=0 gosub mouvblanc else :' car clr(x,y) =1 gosub mouvnoir end_if oksub=0 return
' ============================si blanc========= mouvblanc: ' =================Blanc nord=======OK=========================== if direction$="nord" : ' nord + tourne droite = est clr(x,y) =1 :' Blanc devient noir oksub=1 print "je suis à BLANC Nord, Prochain : x+1 Est" if x = xmax : ' limite(x) du tableau [scene] : x repart à zero x = -1 end_if x=x+1 direction$="est" end_if if oksub=1 then return
' =================Blanc sud============OK=================== if direction$="sud" : ' sud + tourne droite = ouest clr(x,y) =1 :' Blanc devient noir oksub=1 print "je suis à BLANC sud, Prochain : x-1 ouest" if x = 0 : ' limite(x) du tableau [scene] : x repart à xmax: x= xmax+1 end_if x=x-1 direction$="ouest" end_if if oksub=1 then return ' =================Blanc est============================== if direction$="est" : ' est + tourne droite = sud clr(x,y) =1 :' Blanc devient noir oksub=1 print "je suis à BLANC est Prochain = y+1 sud" if y = ymax y= -1 : ' limite(x) du tableau [scene] : y repart à zero end_if y=y+1 direction$="sud" end_if if oksub=1 then return ' =================Blanc ouest=============================== if direction$="ouest" : ' ouest + tourne droite = nord clr(x,y) =1 :' Blanc devient noir oksub=1 print "je suis à BLANC ouest, Prochain : y+1 Nord" if y = 0 y= ymax+1 : ' limite(x) du tableau [scene] : x repart à zero end_if y=y-1 direction$="nord" end_if if oksub=1 then return ' =====================Fin Blanc==============================
' ==========si NOIR==tourne gauche======= mouvnoir: ' =================Noir nord===>====ouest========================= if direction$="nord" : ' nord + tourne gauche = ouest clr(x,y)=0: ' Noir devient blanc oksub=1 print "je suis à noir nord, Prochain : x-1 ouest" if x = 0 : ' limite(x) du tableau [scene] : x repart à zero x=xmax+1 end_if x=x-1 direction$="ouest" end_if if oksub=1 then return ' =================Noir sud===>===est========================= if direction$="sud" : ' sud + tourne gauche = est clr(x,y)=0: ' Noir devient blanc oksub=1 print "je suis à noir sud, Prochain : x+1 est" rem stop if x = xmax : ' limite(x) du tableau [scene] : x repart à xmax x= -1 end_if x=x+1 direction$="est" end_if if oksub=1 then return ' =================Noir est===>===nord======================== if direction$="est" : ' est + tourne gauche = nord clr(x,y)=0: ' Noir devient blanc oksub=1 print "je suis à noir est, Prochain : y-1 NOrd" if y = 0 y= ymax+1 : ' limite(x) du tableau [scene] : y repart à ymax end_if y=y-1 direction$="nord" end_if if oksub=1 then return ' =================Noir ouest====>=====sud=================== if direction$="ouest" : ' ouest + tourne gauche = sud clr(x,y)=0: ' Noir devient blanc oksub=1 print "je suis à noir ouest, Prochain : y+1 sud" if y = ymax y= -1 : ' limite(x) du tableau [scene] : x repart à zero end_if y=y+1 direction$="sud" end_if if oksub=1 then return
rem normalement aucun test ne doit échouer Print "ERREUR" stop ' =====================Fin noir==============================
initaffiche: rem ========================================================== rem LA FOURMIE DE LANGTON rem données d'affichage rem ========================================================== rem Espace de mouvement xmax et ymax rem le 0 de xmax est à gauche rem le 0 de ymax est en haut
rem la position courante est x,y
rem la couleur de la case courante est dans clr(x,y) rem noir => clr(x,y)=1 rem blanc => clr(x,y)=0
rem Orientation de la case est dans direction$ rem direction$ = ou (nord, sud, est, ouest)
rem écran : nord en HAUT; sud en BAS; est à DROITE; ouest à GAUCHE rem ========================================================== ' Formatage de l'espace d'affichage ' pas envie de me faire chier avec les modules exotiques de ce basic
left 0,22 : rem position depuis haut de la fenetre sur l'écran top 0,22 : rem position depuis gauche de la fenetre sur l'écran width 0, 2000 : rem largeur fenetre height 0,2000 :rem hauteur fenetre
return rem ========================================================
affiche1: rem ====================================================== rem === AFFICHAGE ALPHA 1 === rem ====================================================== print " Simulation de l'automate de LANGTON" print " ===================================" for tx=0 to xmax for ty=0 to ymax print clr (tx,ty);" "; next ty print next tx return rem ======================================================
affiche2: rem ====================================================== rem === AFFICHAGE ALPHA 2 === rem ====================================================== print " Simulation de l'automate de LANGTON" print " ===================================" for tx=0 to xmax for ty=0 to ymax if clr (tx,ty)=0 : ' then print " ";" "; <=== Enlever cette instruction print " ";" "; : ' <==== Ajouter celle-là else print clr (tx,ty);" "; end_if next ty print next tx return rem ==========================================================
' =========================CONTROL=========================== testavant: print "=====avant============" ancx=x ancy=y print "je quitte x=" ;x;" y=";y print "couleur départ clr(x,y)= "; clr(x,y); if clr(x,y)=1 then print " noir" if clr(x,y)=0 then print " blanc" print "direction$= " ; direction$ print "___________________" return
testapres: print "======apres===========" print "je viens de anc x= ";ancx; " et anc y= ";ancy print "couleur départ de ";ancx;" ";ancy;" est devenu= ";clr(ancx, ancy); if clr(ancx,ancy)=1 then print " noir" if clr(ancx,ancy)=0 then print " blanc print "------------------------" print "j'arrive à x=" ;x;" y=";y print "Jarrive sur la case clr(x,y)= "; clr(x,y); if clr(x,y)=1 then print " noir" if clr(x,y)=0 then print " blanc" print "direction$= " ; direction$
print "________________________" return
| |
| | | Harzonis
Nombre de messages : 11 Date d'inscription : 04/11/2016
| Sujet: le code de la fourmi de langton Mar 8 Nov 2016 - 22:56 | |
| Bonjour. J’apprécie vos compliments, venant d'un spécialiste. J'ai regardé vos productions, pas tout, il y en à trop. Vous programmez avec une grande maîtrise et une parfaite analyse, Vos codes sont certes complexes mais fluides et pleins d'enseignements. Je vous félicite pour tout votre travail.
En effet j'ai déjà programmé, il y a longtemps.En particulier sous 4D (SGBD). Le langage est un excellent basic en français. ...
Merci pour vos corrections. Je me suis simplement trompé de version. Je vous donne la bonne ici, plus agréable à regarder.
Dans cette version il y a affichage alpha1 et alpha2 à la fin du code. Que me conseillez vous pour faire un affichage graphique standard dans une fenêtre qui zoom automatiquement en fonction de la position de la fourmi. Votre conseil me serait précieux pour finir ce programme. Je n'arrive pas à trouver la bonne solution (form ou je ne sais quelle fonction...)
Je le suis aussi appercçu d'un bug dans le Basic. Il arrive que la commande [inkey$] ne fonctionne pas. La clavier ne provoque aucune interruptions. Ceci se produit 'parfois' apres avoir redimensionné la fenêtre.
Au plaisir de vous lire, André ============ = CODE A JOUR = ============ ' police code : consolas
' Foumis de Langton ' ================================================= ' Couleur de la case: ' variable [clr(x,y)=0] pour blanc ' variable [clr(x,y)=1] pour noir
' ==========Position BLANC tourne Droite=========== ' = Direction mouvement=x ou y NewDirection = ' = nord x+1 est = ' = sud x-1 ouest = ' = est y+1 sud = ' = ouest y-1 nord = ' ================================================= ' ' =========Position NOIR Tourne Gauche============= ' =Direction mouvement=x ou NewDirection = ' = nord x-1 ouest = ' = sud x+1 est = ' = est y-1 nord = ' = ouest y+1 sud = ' ================================================= ' L'espace de mouvement se fait dans [DIM clr (x,y)] ' La couleur de la case est dans [DIM CLR (x,y)] ' La variable direction$ prend les valeurs: ' [nord],[sud],[est],[ouest] ' ' ' ' =====DECLARATIONS=========
label mouvblanc, mouvnoir, debut label initaffiche, affiche1, affiche2
label testavant, testapres :' à virer dim ancx, ancy : ' coordonnées ancienne couleur (celle qu'on quitte) dim tx,ty: ' controle de la matrice
dim a$ :' sortir de la boucle et stopper le programme dim bcl :' Qt cycle d'iteration dim i : ' indice de cycle dim oksub :' controle de sortie des sub pour gerer END_IF
dim xmax, ymax, x,y, direction$ dim temporisation
dim somx, somy : ' somme des mouvements (convergeances)
xmax=34 :rem hauteur ymax=34 :rem largeur
dim clr(xmax, ymax):' espace max contient couleur case
rem ================================================= rem === init de la position de départ === rem =================================================
x=int(xmax/2) : rem position de départ milieu x y=int (ymax/2) :rem position de départ milieu y oksub=0 : ' Pour contourner la complicaion de la syntaxe End_if
clr(x,y)=1: ' Couleur blanc (0) noir (1) aux coordonnées x,y direction$= "nord" bcl= 200000: ' quantité d'iteration temporisation =1
rem FAIRE Sub initialisation des couleurs de départ rem FAIRE sub pour disposer de choix initiaux
rem ================================== rem == Mise en route == rem ==================================
gosub initaffiche : ' initialise l'espace de l'écran for i=1 to bcl print_locate 10,10 print "Appuyer sur une touche pour arreter" gosub testavant Gosub debut gosub testapres somx=somx+x somy=somy+y print "cycle="; i; " somx=";somx;" somy="; somy print gosub affiche2 : rem ou affiche1
a$=inkey$ : ' =====control de déroulement======= rem wait temporisation if not (a$="") then stop next i
' ================================================= print print "=================" print print "Voilà c'est fini" beep: beep: beep: end rem ===============FIN DE PROGRAMME===========================
rem =========================================================== rem == DEMARRAGE du PROGRAMME == rem =========================================================== debut: If clr(x,y)=0 gosub mouvblanc else :' car clr(x,y) =1 gosub mouvnoir end_if oksub=0 return
rem =====================SI BLANC=======TOURNE DROITE===++======= mouvblanc: ' =================Blanc nord=======OK=========================== if direction$="nord" : ' nord + tourne droite = est clr(x,y) =1 :' Blanc devient noir oksub=1 print "je suis à BLANC Nord, Prochain : x+1 Est" if x = xmax : ' limite(x) du tableau [scene] : x repart à zero x = -1 end_if x=x+1 direction$="est" end_if if oksub=1 then return
' =================Blanc sud============OK=================== if direction$="sud" : ' sud + tourne droite = ouest clr(x,y) =1 :' Blanc devient noir oksub=1 print "je suis à BLANC sud, Prochain : x-1 ouest" if x = 0 : ' limite(x) du tableau [scene] : x repart à xmax: x= xmax+1 end_if x=x-1 direction$="ouest" end_if if oksub=1 then return ' =================Blanc est============================== if direction$="est" : ' est + tourne droite = sud clr(x,y) =1 :' Blanc devient noir oksub=1 print "je suis à BLANC est Prochain = y+1 sud" if y = ymax y= -1 : ' limite(x) du tableau [scene] : y repart à zero end_if y=y+1 direction$="sud" end_if if oksub=1 then return ' =================Blanc ouest=============================== if direction$="ouest" : ' ouest + tourne droite = nord clr(x,y) =1 :' Blanc devient noir oksub=1 print "je suis à BLANC ouest, Prochain : y+1 Nord" if y = 0 y= ymax+1 : ' limite(x) du tableau [scene] : x repart à zero end_if y=y-1 direction$="nord" end_if if oksub=1 then return REM =====================Fin Blanc==============================
REM ==========si NOIR==========tourne gauche===================== mouvnoir: ' =================Noir nord===>====ouest========================= if direction$="nord" : ' nord + tourne gauche = ouest clr(x,y)=0: ' Noir devient blanc oksub=1 print "je suis à noir nord, Prochain : x-1 ouest" if x = 0 : ' limite(x) du tableau [scene] : x repart à zero x=xmax+1 end_if x=x-1 direction$="ouest" end_if if oksub=1 then return ' =================Noir sud===>===est========================= if direction$="sud" : ' sud + tourne gauche = est clr(x,y)=0: ' Noir devient blanc oksub=1 print "je suis à noir sud, Prochain : x+1 est" rem stop if x = xmax : ' limite(x) du tableau [scene] : x repart à xmax x= -1 end_if x=x+1 direction$="est" end_if if oksub=1 then return ' =================Noir est===>===nord======================== if direction$="est" : ' est + tourne gauche = nord clr(x,y)=0: ' Noir devient blanc oksub=1 print "je suis à noir est, Prochain : y-1 NOrd" if y = 0 y= ymax+1 : ' limite(x) du tableau [scene] : y repart à ymax end_if y=y-1 direction$="nord" end_if if oksub=1 then return ' =================Noir ouest====>=====sud=================== if direction$="ouest" : ' ouest + tourne gauche = sud clr(x,y)=0: ' Noir devient blanc oksub=1 print "je suis à noir ouest, Prochain : y+1 sud" if y = ymax y= -1 : ' limite(x) du tableau [scene] : x repart à zero end_if y=y+1 direction$="sud" end_if if oksub=1 then return
rem normalement aucun test ne doit échouer Print "ERREUR" stop ' =====================Fin noir==============================
initaffiche: rem ========================================================== rem LA FOURMIE DE LANGTON rem données d'affichage rem ========================================================== rem Espace de mouvement xmax et ymax rem le 0 de xmax est à gauche rem le 0 de ymax est en haut
rem la position courante est x,y
rem la couleur de la case courante est dans clr(x,y) rem noir => clr(x,y)=1 rem blanc => clr(x,y)=0
rem Orientation de la case est dans direction$ rem direction$ = ou (nord, sud, est, ouest)
rem écran : nord en HAUT; sud en BAS; est à DROITE; ouest à GAUCHE rem ========================================================== ' Formatage de l'espace d'affichage ' pas envie de me faire chier avec les modules exotiques de ce basic
left 0,01 : rem position depuis haut de la fenetre sur l'écran top 0,01 : rem position depuis gauche de la fenetre sur l'écran width 0, 1000 : rem largeur fenetre height 0,730:rem hauteur fenetre
return rem ========================================================
affiche1: rem ====================================================== rem === AFFICHAGE ALPHA 1 === rem ====================================================== print " Simulation de l'automate de LANGTON" print " ===================================" for tx=0 to xmax
for ty=0 to ymax print clr (tx,ty);" "; next ty print next tx return rem ======================================================
affiche2: rem ====================================================== rem === AFFICHAGE ALPHA 2 === rem ====================================================== print " Simulation de l'automate de LANGTON" print " ===================================" for tx=0 to xmax
for ty=0 to ymax if clr (tx,ty)=0 then print " ";" "; if clr(tx,ty)=1 then print "O";" "; next ty print next tx return rem ========================FIN ALPHA 2========================
rem =========================================================== rem == CONTROL A VIRER == rem =========================================================== testavant: print "=====avant============" ancx=x ancy=y print "je quitte x=" ;x;" y=";y print "couleur départ clr(x,y)= "; clr(x,y); if clr(x,y)=1 then print " noir" if clr(x,y)=0 then print " blanc" print "direction$= " ; direction$ print "___________________" return rem ===========================================================
testapres: print "======apres===========" print "je viens de anc x= ";ancx; " et anc y= ";ancy print "couleur départ de ";ancx;" ";ancy;" est devenu= ";clr(ancx, ancy); if clr(ancx,ancy)=1 then print " noir" if clr(ancx,ancy)=0 then print " blanc print "------------------------" print "j'arrive à x=" ;x;" y=";y print "Jarrive sur la case clr(x,y)= "; clr(x,y); if clr(x,y)=1 then print " noir" if clr(x,y)=0 then print " blanc" print "direction$= " ; direction$
print "________________________" return | |
| | | Contenu sponsorisé
| Sujet: Re: La fourmi de Langton | |
| |
| | | | La fourmi de Langton | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |