FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Bataille terrestre
La fourmi de Langton Emptypar jjn4 Aujourd'hui à 15:01

» Gestion d'un système client-serveur.
La fourmi de Langton Emptypar Pedro Aujourd'hui à 8:06

» item_index
La fourmi de Langton Emptypar Marc Hier à 16:13

» SineCube
La fourmi de Langton Emptypar Marc Sam 11 Mai 2024 - 12:38

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
La fourmi de Langton Emptypar Marc Sam 11 Mai 2024 - 12:22

» Philharmusique
La fourmi de Langton Emptypar jjn4 Ven 10 Mai 2024 - 13:58

» PANORAMIC V 1
La fourmi de Langton Emptypar papydall Jeu 9 Mai 2024 - 3:22

» select intégrés [résolu]
La fourmi de Langton Emptypar jjn4 Mer 8 Mai 2024 - 17:00

» number_mouse_up
La fourmi de Langton Emptypar jjn4 Mer 8 Mai 2024 - 11:59

» Aide de PANORAMIC
La fourmi de Langton Emptypar jjn4 Mer 8 Mai 2024 - 11:16

» trop de fichiers en cours
La fourmi de Langton Emptypar lepetitmarocain Mer 8 Mai 2024 - 10:43

» Je teste PANORAMIC V 1 beta 1
La fourmi de Langton Emptypar papydall Mer 8 Mai 2024 - 4:17

» bouton dans autre form que 0
La fourmi de Langton Emptypar leclode Lun 6 Mai 2024 - 13:59

» KGF_dll - nouvelles versions
La fourmi de Langton Emptypar Klaus Lun 6 Mai 2024 - 11:41

» @Jack
La fourmi de Langton Emptypar Jack Mar 30 Avr 2024 - 20:40

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
Le Deal du moment : -39%
Ordinateur portable ASUS Chromebook Vibe CX34 Flip
Voir le deal
399 €

 

 La fourmi de Langton

Aller en bas 
5 participants
AuteurMessage
papydall

papydall


Nombre de messages : 7009
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

La fourmi de Langton Empty
MessageSujet: La fourmi de Langton   La fourmi de Langton EmptyVen 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 ============================================================================
        

Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

La fourmi de Langton Empty
MessageSujet: Re: La fourmi de Langton   La fourmi de Langton EmptyVen 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 ! Laughing  
Cela confirme une fois de plus que l'univers n'est pas né du chaos comme certains souhaiterai le faire croire... Wink
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
mimic

mimic


Nombre de messages : 103
Localisation : france
Date d'inscription : 02/09/2009

La fourmi de Langton Empty
MessageSujet: Re: La fourmi de Langton   La fourmi de Langton EmptyVen 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.


Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

La fourmi de Langton Empty
MessageSujet: Re: La fourmi de Langton   La fourmi de Langton EmptyVen 7 Oct 2016 - 9:34

Je l'ai testé... et je suis bien sur 'l'autoroute'...
Malheureusement mon écran n'est pas assez grand pour la suivre vers l'infini !!!
Laughing Laughing Laughing
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
papydall

papydall


Nombre de messages : 7009
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

La fourmi de Langton Empty
MessageSujet: Re: La fourmi de Langton   La fourmi de Langton EmptyVen 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 = 2
Vous pouvez aussi utiliser tout l’écran pour le PICTURE en  modifiant la ligne 56 : full_space 0 : full_space 10

Voici pour différentes valeurs de cote ce que j’obtiens sur mon écran de 1600/900

cote=10:

cote=6:


cote=2:
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Harzonis




Nombre de messages : 11
Date d'inscription : 04/11/2016

La fourmi de Langton Empty
MessageSujet: la fourmi de Langton   La fourmi de Langton EmptyMar 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

Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12295
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

La fourmi de Langton Empty
MessageSujet: Re: La fourmi de Langton   La fourmi de Langton EmptyMar 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 "<>".
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
papydall

papydall


Nombre de messages : 7009
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

La fourmi de Langton Empty
MessageSujet: Re: La fourmi de Langton   La fourmi de Langton EmptyMar 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
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Harzonis




Nombre de messages : 11
Date d'inscription : 04/11/2016

La fourmi de Langton Empty
MessageSujet: le code de la fourmi de langton   La fourmi de Langton EmptyMar 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
Revenir en haut Aller en bas
Contenu sponsorisé





La fourmi de Langton Empty
MessageSujet: Re: La fourmi de Langton   La fourmi de Langton Empty

Revenir en haut Aller en bas
 
La fourmi de Langton
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Compilateur FBPano
»  La Cigale et la Fourmi

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: