FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Panoramic et ses curiosités
par Jean Claude Aujourd'hui à 21:48

» Synedit Parameters
par Jean Claude Aujourd'hui à 21:15

» Utilitaire de suppression de fichiers
par Jean Claude Aujourd'hui à 21:11

» Code à vérifier SVP (Oups ! résolu)
par Jean Claude Hier à 21:16

» Compilateur FBPano
par jean_debord Hier à 9:56

» Bienvenue à Virtualalan !
par UltraVox Hier à 9:18

» Concours de Morpions
par jjn4 Hier à 0:04

» ShortName$(F) [Cloturé]
par papydall Mer 21 Juin 2017 - 16:19

» Remplacer espace par tiret dans noms des dossiers / fichiers
par papydall Mer 21 Juin 2017 - 15:27

» Menu personalisé avec icones et menu contextuel
par Laurent (Minibug) Mer 21 Juin 2017 - 12:44

» La liste des choses à faire ...
par Jack Mar 20 Juin 2017 - 22:49

» Quoi de neuf à propos de Goric 3D ? (@Jack)
par UltraVox Mar 20 Juin 2017 - 21:06

» Nom court et anti fenetre dos
par silverman Mar 20 Juin 2017 - 18:31

» Ludothèque Panoramic
par jjn4 Mar 20 Juin 2017 - 18:09

» Proposition à la communauté
par Yannick Mar 20 Juin 2017 - 15:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Juin 2017
LunMarMerJeuVenSamDim
   1234
567891011
12131415161718
19202122232425
2627282930  
CalendrierCalendrier

Partagez | 
 

 La fourmi de Langton

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
papydall

avatar

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

MessageSujet: La fourmi de Langton   Ven 7 Oct 2016 - 4: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
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Laurent (Minibug)

avatar

Nombre de messages : 2344
Age : 50
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: La fourmi de Langton   Ven 7 Oct 2016 - 8: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
Voir le profil de l'utilisateur
mimic

avatar

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

MessageSujet: Re: La fourmi de Langton   Ven 7 Oct 2016 - 10: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
Voir le profil de l'utilisateur
Laurent (Minibug)

avatar

Nombre de messages : 2344
Age : 50
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: La fourmi de Langton   Ven 7 Oct 2016 - 10: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
Voir le profil de l'utilisateur
papydall

avatar

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

MessageSujet: Re: La fourmi de Langton   Ven 7 Oct 2016 - 12: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
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Harzonis



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

MessageSujet: la fourmi de Langton   Mar 8 Nov 2016 - 2: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
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: La fourmi de Langton   Mar 8 Nov 2016 - 2: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
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
papydall

avatar

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

MessageSujet: Re: La fourmi de Langton   Mar 8 Nov 2016 - 6: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
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Harzonis



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

MessageSujet: le code de la fourmi de langton   Mer 9 Nov 2016 - 0: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
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: La fourmi de Langton   

Revenir en haut Aller en bas
 
La fourmi de Langton
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» observation d'une fourmi plutot étrange
» Fourmilière: arraylist et héritage en java
» t'as l'air bien conne chanta 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 32 bits :: Vos sources, vos utilitaires à partager-
Sauter vers: