Forum Liberty Basic France

Projets open source » La fourmi de Langton Petit code sympa et amusant...
Le 08/01/2013 à 11h15

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Sur le forum Anglophone je suis tombé sur un post d'altBas qui parle de la fourmi de Langton.
Intrigué, je suis allé sur le wiki.

Je me suis dit que ce serait sympa de reproduire et partager avec vous l'animation du wiki.

La règle est simple :
La fourmi peut se déplacer à gauche, à droite, en haut ou en bas d'une case à chaque fois selon les règles suivantes :
Si la fourmi est sur une case noire, elle tourne de 90° vers la droite, change la couleur de la case en blanc et avance d'une case.
Si la fourmi est sur une case blanche, elle tourne de 90° vers la gauche, change la couleur de la case en noir et avance d'une case.


Je me suis bien amusé, en essayant une utilisation varié des fonctionnalités de JB.

- variable tableau à 2 dimensions pour gérer le contenu d'une fenêtre graphique.
- [labels] et SUB routines
- différentes utilisations de WAIT.
- Bouttons : lecture & actions
- les date$ ( accessoirement ! )
- etc...

Code VB :
 ' http://justbasic.conforums.com/index.cgi?board=code&action=display&num=1357541246
 ' http://fr.wikipedia.org/wiki/Fourmi_de_Langton

    nomainwin
 
    WindowWidth = 760
    WindowHeight = 460
    UpperLeftX = (DisplayWidth-WindowWidth) / 2
    UpperLeftY = (DisplayHeight-WindowHeight) / 4
 
    mois$ = "Jan Fév Mar Avr Mai Jun Jui Aou Sep Oct Nov Déc"
    today$ = date$("mm/dd/yyyy")
    j = date$(today$)
    jsem$ = word$("Mar Mer Jeu x Ven Sam x Dim Lun",int((j/7-int(j/7))*10)+1)
    date$ = jsem$+" "+mid$(today$,4,2)+" "+word$(mois$, val(today$))+"   "+left$(time$(),5)'right$(today$,4)

    GLOBAL nbDir
    dim dirX(8), dirY(8)
            '1 2 3
            '8 - 4    ' all possible directions
            '7 6 5
    dirX(2) = 0  : dirY(2) = -1  'up
    dirX(4) = 1  : dirY(4) = 0   'right
    dirX(8) = -1 : dirY(8) = 0   'left
    dirX(6) = 0  : dirY(6) = 1   'down
    dirX(1) = -1 : dirY(1) = -1  'up,left
    dirX(3) = 1  : dirY(3) = -1  'up,right
    dirX(7) = -1 : dirY(7) = 1   'down,left
    dirX(5) = 1  : dirY(5) = 1   'down,right
    nbDir = 2  ' = 4 directions (default), nbDir = 1 for 8 directions

    statictext #g.dir, word$("8 4",nbDir), WindowWidth-370, 8, 20, 20
    statictext #g.info, "steps : ", 10, 8, 200, 20
    button #g.2dir "4 directions", ndir, UL, WindowWidth-500, 2, 100, 25
    button #g.1dir "8 directions", ndir, UL, WindowWidth-340, 2, 100, 25
    button #g.new "New", [new], UL, WindowWidth-200, 2, 40, 25
    button #g.stop "", [stop], UL, WindowWidth-120, 2, 40, 25
    graphicbox #g.map, 5, 30, WindowWidth-16, WindowHeight-70
    open "    Langton's ant"+space$(20)+date$ for window_nf as #g
    #g "trapclose [quit]"
 
    wayColor$(0) = "black"   ' color of the background of the map
    #g.map "down ;fill ";wayColor$(0)
    #g.map "home ; posxy CenterX CenterY"   ' to keep the real size of the graphicbox
    Gwidth = CenterX * 2
    Gheight = CenterY * 2
 
    dc = 3   ' dimension of the ant (pixels square)  ( 2 minimum)

    Xmax = int(Gwidth/dc)  ' size of the array  (map)
    Ymax = int(Gheight/dc)
    DIM cell(Xmax,Ymax)    ' array of the map

    [new]
        wayColor$(1) = word$("green blue red yellow",int(rnd(0)*4)+1)   ' color of the way of the ant
        #g.map "down ; fill ";wayColor$(0)
        REDIM cell(Xmax,Ymax)  ' reset the array
        antX = int(Xmax/2)   ' start position of the ant
        antY = int(Ymax/2)
        stepp = 0
        go = 1
        #g.stop word$("Go Stop",go+1)  ' rename the button "stop"

    [go]         '  principal loop
        WHILE go
            scan
            #g.map "backcolor white ; color white"
            #g.map "place ";antX*dc;" ";antY*dc;" ; boxfilled ";antX*dc+dc;" ";antY*dc+dc ' current position of the ant
            if cell(antX,antY) = 0 then    ' change direction
                dir = dir + nbDir
                if dir > 8 then dir = nbDir
                cell(antX,antY) = 1
                #g.map "backcolor ";wayColor$(1);" ; color ";wayColor$(1)
                #g.map "place ";antX*dc;" ";antY*dc;" ; boxfilled ";antX*dc+dc;" ";antY*dc+dc
            else
                dir = dir - nbDir
                if dir < nbDir then dir = 8
                cell(antX,antY) = 0
                #g.map "backcolor ";wayColor$(0);" ; color ";wayColor$(0)
                #g.map "place ";antX*dc;" ";antY*dc;" ; boxfilled ";antX*dc+dc;" ";antY*dc+dc
            end if
            antXold = antX
            antYold = antY
            antX = antX + dirX(dir)
            antY = antY + dirY(dir)
            if antX>Xmax then antX = 0  ' stay into the map
            if antX<0 then antX = Xmax  '
            if antY>Ymax then antY = 0  '
            if antY<0 then antY = Ymax  '
            stepp = stepp + 1
            #g.info, "steps : ";stepp
        WEND
    WAIT
 
    sub ndir handle$   '  select the nb of possible directions
        nbDir = val(mid$(handle$,4,1))
        #g.dir, word$("8 4",nbDir)
    end sub
 
    [stop]      ' stop & go
        if go=1 then go=0 else go=1
        #g.map "backcolor white ; color white"
        #g.map "place ";antX*dc;" ";antY*dc;" ; boxfilled ";antX*dc+dc;" ";antY*dc+dc ' current position of the ant
        #g.map "flush ; discard"
        #g.stop word$("Go Stop",go+1)
        goto [go]
 
    [quit]
        close #g
        END
 


Pour 4 directions, un phénomène se produit vers 10000 steps...!

Bon amusement :top

@+



Edité par cassiope01 Le 09/01/2013 à 16h14
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 08/01/2013 à 13h28

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1992
C'est la sortie de l'attraction terrestre ! ! ! :lol :top

Un autre phénomène: Comme j'aime bien voir ce qui se passe, j'ai enlevé l'apostrophe de call pause pour ralentir le mouvement.
Evidemment quand j'ai fermé, cela à percé un trou dans la sub pause,
et déclenché une alerte : " viol de sub avec dépréssurisation"
Mais en meme temps, est apparu sur le bureau, et par dessus les icones, un rectangle vert d'une centaine de pixels de large, sur 50 de haut. :heink :| Que l'on est pas prés d'expliquer !
J'ai donc mis un gosub à la place du call, et mis dc à 5 ( remerciant au passage le concepteur d'avoir mis les paramètres en variables clairement identifiables.) :top
C'est pas mal du tout à voir fonctionner. Il n'y manque plus que les arrêts de la fourmi, testant le comestible de la case rencontrée.!
____________________
Roro

   
Le 08/01/2013 à 14h46

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1992
Bon, j'ai ajouté deux boutons "Ralenti" et "Accélère" et l'inévitable tetbox de controle.
Le phénomène ne se produit pas si on passe le cap: 10 000 à vitesse réduite.
Il s'agit donc bien de la vitesse de satellisation
du rapport entre le temps et les choses à faire.
Quand jb estime qu'il y a de l'abus, il éjecte la fourmi dans l'espace. Qui se heurtant aux confins de l'univers, reviens à vitesse égale , et échappant à nouveau à l'attracteur, continue vers l'autre bord de l'univers.
Et ainsi, jusqu'à la fin des temps....

Code JB :
 
 ' http://justbasic.conforums.com/index.cgi?board=code&action=display&num=1357541246
 ' http://fr.wikipedia.org/wiki/Fourmi_de_Langton
 
    nomainwin
 
    WindowWidth = 760
    WindowHeight = 460
    UpperLeftX = (DisplayWidth-WindowWidth) / 2
    UpperLeftY = (DisplayHeight-WindowHeight) / 4
 
    mois$ = "Jan Fév Mar Avr Mai Jun Jui Aou Sep Oct Nov Déc"
    today$ = date$("mm/dd/yyyy")
    j = date$(today$)
    jsem$ = word$("Mar Mer Jeu x Ven Sam x Dim Lun",int((j/7-int(j/7))*10)+1)
    date$ = jsem$+" "+mid$(today$,4,2)+" "+word$(mois$, val(today$))+"   "+left$(time$(),5)'right$(today$,4)
 
    GLOBAL nbDir
    dim dirX(8), dirY(8)
            '1 2 3
            '8 - 4    ' all possible directions
            '7 6 5
    dirX(2) = 0  : dirY(2) = -1  'up
    dirX(4) = 1  : dirY(4) = 0   'right
    dirX(8) = -1 : dirY(8) = 0   'left
    dirX(6) = 0  : dirY(6) = 1   'down
    dirX(1) = -1 : dirY(1) = -1  'up,left
    dirX(3) = 1  : dirY(3) = -1  'up,right
    dirX(7) = -1 : dirY(7) = 1   'down,left
    dirX(5) = 1  : dirY(5) = 1   'down,right
    nbDir = 2  ' = 4 directions (default), nbDir = 1 for 8 directions
 
 
    statictext #g.dir, word$("8 4",nbDir), WindowWidth-370, 8, 20, 20
    statictext #g.info, "steps 267776: ", 5, 8, 70, 20
    button #g.ral "Ralenti", [Ralenti], UL, 80, 2, 50, 25
    textbox #g.vit, 145, 2, 40, 20
    button #g.acc "Accelere", [Accelere], UL, 200, 2, 50, 25
    button #g.2dir "4 directions", ndir, UL, WindowWidth-470, 2, 80, 25
    button #g.1dir "8 directions", ndir, UL, WindowWidth-340, 2, 100, 25
    button #g.new "New", [new], UL, WindowWidth-200, 2, 40, 25
    button #g.stop "", [stop], UL, WindowWidth-120, 2, 40, 25
    graphicbox #g.map, 5, 30, WindowWidth-16, WindowHeight-70
    open "    Langton's ant"+space$(20)+date$ for window_nf as #g
    #g "trapclose [quit]"
 
    wayColor$(0) = "black"   ' color of the background of the map
    wayColor$(1) = "green"   ' color of the way of the ant
    #g.map "down ;fill ";wayColor$(0)
    #g.map "home ; posxy CenterX CenterY"   ' to keep the real size of the graphicbox
    Gwidth = CenterX * 2
    Gheight = CenterY * 2
 
    dc = 5   ' dimension of the ant (pixels square)  ( 2 minimum)
    temp= 300
 
    Xmax = int(Gwidth/dc)  ' size of the array  (map)
    Ymax = int(Gheight/dc)
    DIM cell(Xmax,Ymax)    ' array of the map
  'wait
    [new]
        #g.map "down ; fill ";wayColor$(0)
        REDIM cell(Xmax,Ymax)  ' reset the array
        antX = int(Xmax/2)   ' start position of the ant
        antY = int(Ymax/2)
        stepp = 1
        go = 1
        #g.stop word$("Go Stop",go+1)  ' rename the button "stop"
        #g.vit, str$(temp)
 
    [go]         '  principal loop
        while stepp
            scan  '-> important pour pouvoir interrompre cette boucle sans fin par clic sur un bouton...
            #g.map "backcolor red ; color red"
            #g.map "place ";antX*dc;" ";antY*dc;" ; boxfilled ";antX*dc+dc;" ";antY*dc+dc ' current position of the ant
            if go = 0 then wait
        gosub [pause]' call pause 2
            if cell(antX,antY) = 0 then    ' change direction
                dir = dir + nbDir
                if dir > 8 then dir = nbDir
                cell(antX,antY) = 1
                #g.map "backcolor ";wayColor$(1);" ; color ";wayColor$(1)
                #g.map "place ";antX*dc;" ";antY*dc;" ; boxfilled ";antX*dc+dc;" ";antY*dc+dc
            else
                dir = dir - nbDir
                if dir < nbDir then dir = 8
                cell(antX,antY) = 0
                #g.map "backcolor ";wayColor$(0);" ; color ";wayColor$(0)
                #g.map "place ";antX*dc;" ";antY*dc;" ; boxfilled ";antX*dc+dc;" ";antY*dc+dc
            end if
            antXold = antX
            antYold = antY
            antX = antX + dirX(dir)
            antY = antY + dirY(dir)
            if antX>Xmax then antX = 0  ' stay into the map
            if antX<0 then antX = Xmax  '
            if antY>Ymax then antY = 0  '
            if antY<0 then antY = Ymax  '
            stepp = stepp + 1
            #g.info, "steps : ";stepp
        wend
    WAIT
 
    sub ndir handle$   '  select the nb of possible directions
        nbDir = val(mid$(handle$,4,1))
        #g.dir, word$("8 4",nbDir)
    end sub
 
    [Ralenti]
      temp=temp+100
      #g.vit, str$(temp)
    goto [go]
    [Accelere]
      temp=temp-100
      if temp < 1 then temp=0
      #g.vit, str$(temp)
    goto [go]
 
    [stop]      ' stop & go
        if go=1 then go=0 else go=1
        #g.stop word$("Go Stop",go+1)
        goto [go]
    wait
 
    [pause]' temp   'pause en millisecondes
        timer temp, [temps]
        wait
        [temps]
        timer 0
    return
 
    'sub pause temp   'pause en millisecondes
    '    timer temp, [temps]
    '    wait
    '    [temps]
    '    timer 0
   ' end sub
 
    [quit]
        close #g
        END
 




Edité par Roland Le 08/01/2013 à 15h00
____________________
Roro

   
Le 08/01/2013 à 18h39

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Si tu as un peu lu le wiki, il semble que le phénomène soit invariable et non dépendant de la vitesse d'exécution :heink

J'ai modifié le code dans le premier post pour qu'il soit beaucoup plus logique.
En effet il semble que JB soit très susceptible quant à la gestion propre de sortie ou interruption d'une boucle !

Voici la version avec 3 fourmis :

Code VB :
 ' http://justbasic.conforums.com/index.cgi?board=code&action=display&num=1357541246
 ' http://fr.wikipedia.org/wiki/Fourmi_de_Langton

    nomainwin
 
    WindowWidth = 760
    WindowHeight = 460
    UpperLeftX = (DisplayWidth-WindowWidth) / 2
    UpperLeftY = (DisplayHeight-WindowHeight) / 4
 
    mois$ = "Jan Fév Mar Avr Mai Jun Jui Aou Sep Oct Nov Déc"
    today$ = date$("mm/dd/yyyy")
    j = date$(today$)
    jsem$ = word$("Mar Mer Jeu x Ven Sam x Dim Lun",int((j/7-int(j/7))*10)+1)
    date$ = jsem$+" "+mid$(today$,4,2)+" "+word$(mois$, val(today$))+"   "+left$(time$(),5)'right$(today$,4)

    GLOBAL nbDir
    dim dirX(8), dirY(8)
            '1 2 3
            '8 - 4    ' all possible directions
            '7 6 5
    dirX(2) = 0  : dirY(2) = -1  'up
    dirX(4) = 1  : dirY(4) = 0   'right
    dirX(8) = -1 : dirY(8) = 0   'left
    dirX(6) = 0  : dirY(6) = 1   'down
    dirX(1) = -1 : dirY(1) = -1  'up,left
    dirX(3) = 1  : dirY(3) = -1  'up,right
    dirX(7) = -1 : dirY(7) = 1   'down,left
    dirX(5) = 1  : dirY(5) = 1   'down,right
    nbDir = 2  ' = 4 directions (default), nbDir = 1 for 8 directions

    statictext #g.dir, word$("8 4",nbDir), WindowWidth-370, 8, 20, 20
    statictext #g.info, "steps : ", 10, 8, 200, 20
    button #g.2dir "4 directions", ndir, UL, WindowWidth-500, 2, 100, 25
    button #g.1dir "8 directions", ndir, UL, WindowWidth-340, 2, 100, 25
    button #g.new "New", [new], UL, WindowWidth-200, 2, 40, 25
    button #g.stop "", [stop], UL, WindowWidth-120, 2, 40, 25
    graphicbox #g.map, 5, 30, WindowWidth-16, WindowHeight-70
    open "    Langton's ant"+space$(20)+date$ for window_nf as #g
    #g "trapclose [quit]"
 
    wayColor$(0) = "black"   ' color of the background of the map
    wayColor$(1) = "green"   ' color of the way of the ant
    wayColor$(2) = "blue"    ' color of the way of the ant
    wayColor$(3) = "red"  ' color of the way of the ant
    #g.map "down ;fill ";wayColor$(0)
    #g.map "home ; posxy CenterX CenterY"   ' to keep the real size of the graphicbox
    Gwidth = CenterX * 2
    Gheight = CenterY * 2
 
    dc = 3   ' dimension of the ant (pixels square)  ( 2 minimum)

    Xmax = int(Gwidth/dc)  ' size of the array  (map)
    Ymax = int(Gheight/dc)
    DIM cell(Xmax,Ymax)    ' array of the map

    [new]
        #g.map "down ; fill ";wayColor$(0)
        REDIM cell(Xmax,Ymax)  ' reset the array
        antX(1) = int(Xmax/2)   ' start position of the ant 1
        antY(1) = int(Ymax/3)
        antX(2) = int(Xmax/4)   ' start position of the ant 2
        antY(2) = int(Ymax/3)*2
        antX(3) = int(Xmax/4)*3   ' start position of the ant 3
        antY(3) = int(Ymax/3)*2
        dir(1) = 2
        dir(2) = 4    '  different starting direction
        dir(3) = 6
        stepp = 0
        go = 1
        #g.stop word$("Go Stop",go+1)  ' rename the button "stop"

    [go]         '  principal loop
        WHILE go
            scan
            for ant = 1 to 3
                #g.map "backcolor white ; color white"
                #g.map "place ";antX(ant)*dc;" ";antY(ant)*dc;" ; boxfilled ";antX(ant)*dc+dc;" ";antY(ant)*dc+dc ' current position of the ant
                if cell(antX(ant),antY(ant)) = 0 then    ' change direction
                    dir(ant) = dir(ant) + nbDir
                    if dir(ant) > 8 then dir(ant) = nbDir
                    cell(antX(ant),antY(ant)) = 1
                    #g.map "backcolor ";wayColor$(ant);" ; color ";wayColor$(ant)
                    #g.map "place ";antX(ant)*dc;" ";antY(ant)*dc;" ; boxfilled ";antX(ant)*dc+dc;" ";antY(ant)*dc+dc
                else
                    dir(ant) = dir(ant) - nbDir
                    if dir(ant) < nbDir then dir(ant) = 8
                    cell(antX(ant),antY(ant)) = 0
                    #g.map "backcolor ";wayColor$(0);" ; color ";wayColor$(0)
                    #g.map "place ";antX(ant)*dc;" ";antY(ant)*dc;" ; boxfilled ";antX(ant)*dc+dc;" ";antY(ant)*dc+dc
                end if
                antXold(ant) = antX(ant)
                antYold(ant) = antY(ant)
                antX(ant) = antX(ant) + dirX(dir(ant))
                antY(ant) = antY(ant) + dirY(dir(ant))
                if antX(ant)>Xmax then antX(ant) = 0  ' stay into the map
                if antX(ant)<0 then antX(ant) = Xmax  '
                if antY(ant)>Ymax then antY(ant) = 0  '
                if antY(ant)<0 then antY(ant) = Ymax  '
            next
            stepp = stepp + 1
            #g.info "steps : ";stepp
        WEND
    WAIT
 
    sub ndir handle$   '  select the nb of possible directions
        nbDir = val(mid$(handle$,4,1))
        #g.dir, word$("8 4",nbDir)
    end sub
 
    [stop]      ' stop & go
        if go=1 then go=0 else go=1
        for ant=1 to 3
            #g.map "backcolor white ; color white"
            #g.map "place ";antX(ant)*dc;" ";antY(ant)*dc;" ; boxfilled ";antX(ant)*dc+dc;" ";antY(ant)*dc+dc ' current position of the ant
        next
        #g.map "flush ; discard"
        #g.stop word$("Go Stop",go+1)
        goto [go]
 
    [quit]
        close #g
        END
 




Edité par cassiope01 Le 09/01/2013 à 16h14
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 08/01/2013 à 22h47

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1992
Citation:
il semble que JB soit très susceptible

Je dirais même pointilleux. Les sorties de boucles sont mon calvaire. :s
Je n'ai pas lu le wiki, je n'ai pas du voir le lien.
Mais je t'assure qu'en passant aux 10 000 à un pas par seconde (à peu prés), la fourmi continue sans problème sur son terrain de jeu.

3 fourmis ! :| Tu n'a pas vu le film: "Le jour où la terre s'arreta" Faut pas rigoler avec ces bestioles!

.......................C'est assez hallucinant.



Edité par Roland Le 08/01/2013 à 22h54
____________________
Roro

   
Le 09/01/2013 à 12h27

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
10000 pas à 1 pas par seconde ça doit faire environ 2h45.
Ne me dit pas que tu es resté tout ce temps là à attendre de voir si le phénomène se produit ou pas Roland !? :heink :lol

Ce petit code est surtout là pour les ceusse qui sont intéressés par JustBasic et qui voudraient se pencher un peu dessus tout en s'amusant :top

@+
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 09/01/2013 à 13h13

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1992
Et bein naaaan, c'est pour ça que j'ai mis les boutons "Accélère" et "Ralenti"
Que j'ai mis sur la version "3 fourmis". Même que je m'en suis tiré comme un chef.
Tout marche au poil; même le "stop/go".
J'ai commencé à ralentir vers: 9 980 .
Et comme je suis fier de la modif, je la colle ici:

Code JB :
 
 
 ' http://justbasic.conforums.com/index.cgi?board=code&action=display&num=1357541246
 ' http://fr.wikipedia.org/wiki/Fourmi_de_Langton
 
    nomainwin
 
    WindowWidth = 760
    WindowHeight = 460
    UpperLeftX = (DisplayWidth-WindowWidth) / 2
    UpperLeftY = (DisplayHeight-WindowHeight) / 4
 
    mois$ = "Jan Fév Mar Avr Mai Jun Jui Aou Sep Oct Nov Déc"
    today$ = date$("mm/dd/yyyy")
    j = date$(today$)
    jsem$ = word$("Mar Mer Jeu x Ven Sam x Dim Lun",int((j/7-int(j/7))*10)+1)
    date$ = jsem$+" "+mid$(today$,4,2)+" "+word$(mois$, val(today$))+"   "+left$(time$(),5)'right$(today$,4)
 
    GLOBAL nbDir
    dim dirX(8), dirY(8)
            '1 2 3
            '8 - 4    ' all possible directions
            '7 6 5
    dirX(2) = 0  : dirY(2) = -1  'up
    dirX(4) = 1  : dirY(4) = 0   'right
    dirX(8) = -1 : dirY(8) = 0   'left
    dirX(6) = 0  : dirY(6) = 1   'down
    dirX(1) = -1 : dirY(1) = -1  'up,left
    dirX(3) = 1  : dirY(3) = -1  'up,right
    dirX(7) = -1 : dirY(7) = 1   'down,left
    dirX(5) = 1  : dirY(5) = 1   'down,right
    nbDir = 2  ' = 4 directions (default), nbDir = 1 for 8 directions
 
    statictext #g.dir, word$("8 4",nbDir), WindowWidth-370, 8, 20, 20
    statictext #g.info, "steps 267776: ", 5, 8, 70, 20
    button #g.ral "Ralenti", [Ralenti], UL, 80, 2, 50, 25
    textbox #g.vit, 145, 2, 40, 20
    button #g.acc "Accelere", [Accelere], UL, 200, 2, 50, 25
    button #g.2dir "4 directions", ndir, UL, WindowWidth-470, 2, 80, 25
    button #g.1dir "8 directions", ndir, UL, WindowWidth-340, 2, 100, 25
    button #g.new "New", [new], UL, WindowWidth-200, 2, 40, 25
    button #g.stop "", [stop], UL, WindowWidth-120, 2, 40, 25
    graphicbox #g.map, 5, 30, WindowWidth-16, WindowHeight-70
    open "    Langton's ant"+space$(20)+date$ for window_nf as #g
    #g "trapclose [quit]"
 
    wayColor$(0) = "black"   ' color of the background of the map
    wayColor$(1) = "green"   ' color of the way of the ant
    wayColor$(2) = "blue"    ' color of the way of the ant
    wayColor$(3) = "red"  ' color of the way of the ant
    #g.map "down ;fill ";wayColor$(0)
    #g.map "home ; posxy CenterX CenterY"   ' to keep the real size of the graphicbox
    Gwidth = CenterX * 2
    Gheight = CenterY * 2
 
    dc = 5   ' dimension of the ant (pixels square)  ( 2 minimum)
    temp= 300
 
    Xmax = int(Gwidth/dc)  ' size of the array  (map)
    Ymax = int(Gheight/dc)
    DIM cell(Xmax,Ymax)    ' array of the map
 
    [new]
        #g.map "down ; fill ";wayColor$(0)
        REDIM cell(Xmax,Ymax)  ' reset the array
        antX(1) = int(Xmax/2)   ' start position of the ant 1
        antY(1) = int(Ymax/3)
        antX(2) = int(Xmax/4)   ' start position of the ant 2
        antY(2) = int(Ymax/3)*2
        antX(3) = int(Xmax/4)*3   ' start position of the ant 3
        antY(3) = int(Ymax/3)*2
        dir(1) = 2
        dir(2) = 4    '  different starting direction
        dir(3) = 6
        stepp = 1
        go = 1
        #g.stop word$("Go Stop",go+1)  ' rename the button "stop"
        #g.vit, str$(temp)
 
    [go]         '  principal loop
        WHILE go
            scan
            gosub [pause]
            for ant = 1 to 3
            if sto=1 then timer 0: exit for
                #g.map "backcolor white ; color white"
                #g.map "place ";antX(ant)*dc;" ";antY(ant)*dc;" ; boxfilled ";antX(ant)*dc+dc;" ";antY(ant)*dc+dc ' current position of the ant
                if cell(antX(ant),antY(ant)) = 0 then    ' change direction
                    dir(ant) = dir(ant) + nbDir
                    if dir(ant) > 8 then dir(ant) = nbDir
                    cell(antX(ant),antY(ant)) = 1
                    #g.map "backcolor ";wayColor$(ant);" ; color ";wayColor$(ant)
                    #g.map "place ";antX(ant)*dc;" ";antY(ant)*dc;" ; boxfilled ";antX(ant)*dc+dc;" ";antY(ant)*dc+dc
                else
                    dir(ant) = dir(ant) - nbDir
                    if dir(ant) < nbDir then dir(ant) = 8
                    cell(antX(ant),antY(ant)) = 0
                    #g.map "backcolor ";wayColor$(0);" ; color ";wayColor$(0)
                    #g.map "place ";antX(ant)*dc;" ";antY(ant)*dc;" ; boxfilled ";antX(ant)*dc+dc;" ";antY(ant)*dc+dc
                end if
                antXold(ant) = antX(ant)
                antYold(ant) = antY(ant)
                antX(ant) = antX(ant) + dirX(dir(ant))
                antY(ant) = antY(ant) + dirY(dir(ant))
                if antX(ant)>Xmax then antX(ant) = 0  ' stay into the map
                if antX(ant)<0 then antX(ant) = Xmax  '
                if antY(ant)>Ymax then antY(ant) = 0  '
                if antY(ant)<0 then antY(ant) = Ymax  '
            next
            if sto=1 then wait
            stepp = stepp + 1
            #g.info "steps : ";stepp
        WEND
    WAIT
 
    sub ndir handle$   '  select the nb of possible directions
        nbDir = val(mid$(handle$,4,1))
        #g.dir, word$("8 4",nbDir)
    end sub
 
    [Ralenti]
      temp=temp+100
      #g.vit, str$(temp)
    goto [go]
    [Accelere]
      temp=temp-100
      if temp < 1 then temp=0
      #g.vit, str$(temp)
    goto [go]
 
    [pause]' temp   'pause en millisecondes
        timer temp, [temps]
        wait
        [temps]
        timer 0
    return
 
    [stop]      ' stop & go
    sto=1
        if go=1 then go=0:sto=1 else go=1:sto=0
        #g.stop word$("Go Stop",go+1)
        goto [go]
    wait
 
    [quit]
        close #g
        END
 
 
____________________
Roro

   
Le 09/01/2013 à 16h05

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Bravo Roland, d'autant que c'était pas si évident car l'interruption du programme avec le bouton "Stop" peut tomber dans la routine de Timer !!!

Désolé mais même à faible vitesse le phénomène se produit toujours à un peu plus de 10000 pas...

Par contre je ne comprend pas pourquoi tu utilises une nouvelle variable 'sto' puisque tu la fais correspondre exactement à l'inverse de la variable 'go' ! autant utiliser 'go' !!!!

La ligne if sto=1 then timer 0: exit for ne sert à rien.

Je ne comprend pas la fonction de la ligne if sto=1 then wait mais elle par contre il faut la laisser pour que tout fonctionne bien !?!

Version sans la variable 'sto' :

Code VB :
 ' http://justbasic.conforums.com/index.cgi?board=code&action=display&num=1357541246
 ' http://fr.wikipedia.org/wiki/Fourmi_de_Langton

    nomainwin
 
    WindowWidth = 760
    WindowHeight = 460
    UpperLeftX = (DisplayWidth-WindowWidth) / 2
    UpperLeftY = (DisplayHeight-WindowHeight) / 4
 
    mois$ = "Jan Fév Mar Avr Mai Jun Jui Aou Sep Oct Nov Déc"
    today$ = date$("mm/dd/yyyy")
    j = date$(today$)
    jsem$ = word$("Mar Mer Jeu x Ven Sam x Dim Lun",int((j/7-int(j/7))*10)+1)
    date$ = jsem$+" "+mid$(today$,4,2)+" "+word$(mois$, val(today$))+"   "+left$(time$(),5)'right$(today$,4)

    GLOBAL nbDir
    dim dirX(8), dirY(8)
            '1 2 3
            '8 - 4    ' all possible directions
            '7 6 5
    dirX(2) = 0  : dirY(2) = -1  'up
    dirX(4) = 1  : dirY(4) = 0   'right
    dirX(8) = -1 : dirY(8) = 0   'left
    dirX(6) = 0  : dirY(6) = 1   'down
    dirX(1) = -1 : dirY(1) = -1  'up,left
    dirX(3) = 1  : dirY(3) = -1  'up,right
    dirX(7) = -1 : dirY(7) = 1   'down,left
    dirX(5) = 1  : dirY(5) = 1   'down,right
    nbDir = 2  ' = 4 directions (default), nbDir = 1 for 8 directions

    statictext #g.dir, word$("8 4",nbDir), WindowWidth-370, 8, 20, 20
    statictext #g.info, "steps 267776: ", 5, 8, 70, 20
    button #g.ral "Ralenti", [Ralenti], UL, 80, 2, 50, 25
    textbox #g.vit, 145, 2, 40, 20
    button #g.acc "Accelere", [Accelere], UL, 200, 2, 50, 25
    button #g.2dir "4 directions", ndir, UL, WindowWidth-470, 2, 80, 25
    button #g.1dir "8 directions", ndir, UL, WindowWidth-340, 2, 100, 25
    button #g.new "New", [new], UL, WindowWidth-200, 2, 40, 25
    button #g.stop "", [stop], UL, WindowWidth-120, 2, 40, 25
    graphicbox #g.map, 5, 30, WindowWidth-16, WindowHeight-70
    open "    Langton's ant"+space$(20)+date$ for window_nf as #g
    #g "trapclose [quit]"
 
    wayColor$(0) = "black"   ' color of the background of the map
    wayColor$(1) = "green"   ' color of the way of the ant
    wayColor$(2) = "blue"    ' color of the way of the ant
    wayColor$(3) = "red"  ' color of the way of the ant
    #g.map "down ;fill ";wayColor$(0)
    #g.map "home ; posxy CenterX CenterY"   ' to keep the real size of the graphicbox
    Gwidth = CenterX * 2
    Gheight = CenterY * 2
 
    dc = 5   ' dimension of the ant (pixels square)  ( 2 minimum)
    temp= 0
 
    Xmax = int(Gwidth/dc)  ' size of the array  (map)
    Ymax = int(Gheight/dc)
    DIM cell(Xmax,Ymax)    ' array of the map

    [new]
        #g.map "down ; fill ";wayColor$(0)
        REDIM cell(Xmax,Ymax)  ' reset the array
        antX(1) = int(Xmax/2)   ' start position of the ant 1
        antY(1) = int(Ymax/3)
        antX(2) = int(Xmax/4)   ' start position of the ant 2
        antY(2) = int(Ymax/3)*2
        antX(3) = int(Xmax/4)*3   ' start position of the ant 3
        antY(3) = int(Ymax/3)*2
        dir(1) = 2
        dir(2) = 4    '  different starting direction
        dir(3) = 6
        stepp = 0
        go = 1
        #g.stop word$("Go Stop",go+1)  ' rename the button "stop"
        #g.vit, str$(temp)
 
    [go]         '  principal loop
        WHILE go
            scan
            gosub [pause]
            if go=0 then wait
            for ant = 1 to 3
                #g.map "backcolor white ; color white"
                #g.map "place ";antX(ant)*dc;" ";antY(ant)*dc;" ; boxfilled ";antX(ant)*dc+dc;" ";antY(ant)*dc+dc ' current position of the ant
                if cell(antX(ant),antY(ant)) = 0 then    ' change direction
                    dir(ant) = dir(ant) + nbDir
                    if dir(ant) > 8 then dir(ant) = nbDir
                    cell(antX(ant),antY(ant)) = 1
                    #g.map "backcolor ";wayColor$(ant);" ; color ";wayColor$(ant)
                    #g.map "place ";antX(ant)*dc;" ";antY(ant)*dc;" ; boxfilled ";antX(ant)*dc+dc;" ";antY(ant)*dc+dc
                else
                    dir(ant) = dir(ant) - nbDir
                    if dir(ant) < nbDir then dir(ant) = 8
                    cell(antX(ant),antY(ant)) = 0
                    #g.map "backcolor ";wayColor$(0);" ; color ";wayColor$(0)
                    #g.map "place ";antX(ant)*dc;" ";antY(ant)*dc;" ; boxfilled ";antX(ant)*dc+dc;" ";antY(ant)*dc+dc
                end if
                antXold(ant) = antX(ant)
                antYold(ant) = antY(ant)
                antX(ant) = antX(ant) + dirX(dir(ant))
                antY(ant) = antY(ant) + dirY(dir(ant))
                if antX(ant)>Xmax then antX(ant) = 0  ' stay into the map
                if antX(ant)<0 then antX(ant) = Xmax  '
                if antY(ant)>Ymax then antY(ant) = 0  '
                if antY(ant)<0 then antY(ant) = Ymax  '
            next
            stepp = stepp + 1
            #g.info "steps : ";stepp
        WEND
    WAIT
 
    sub ndir handle$   '  select the nb of possible directions
        nbDir = val(mid$(handle$,4,1))
        #g.dir, word$("8 4",nbDir)
    end sub
 
    [Ralenti]
      temp=temp+100
      #g.vit, str$(temp)
        goto [go]
 
    [Accelere]
      temp=temp-100
      if temp < 1 then temp=0
      #g.vit, str$(temp)
        goto [go]
 
    [pause]' temp   'pause en millisecondes
        timer temp, [temps]
        wait
        [temps]
        timer 0
    return
 
    [stop]      ' stop & go
        if go=1 then go=0 else go=1
        for ant=1 to 3
            #g.map "backcolor white ; color white"
            #g.map "place ";antX(ant)*dc;" ";antY(ant)*dc;" ; boxfilled ";antX(ant)*dc+dc;" ";antY(ant)*dc+dc ' current position of the ant
        next
        #g.map "flush ; discard"
        #g.stop word$("Go Stop",go+1)
        goto [go]
 
    [quit]
        close #g
        END
 


Tu pourrais écrire ta version avec une seule fourmi, ça serait plus rapide d'arriver à 10000 !


Il te faut choisir le paramètre [code=vb] [/...] pour insérer du code Roland, ça permet d'avoir la colorisation syntaxique, plus facile à lire. :top

@+



Edité par cassiope01 Le 09/01/2013 à 16h22
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 09/01/2013 à 18h46

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1992
Tes galipettes du genre: if go ( sous entendu si go existe), moi, j'ose pas y toucher. :heink
Et là c'est le go+1 de: #g.stop word$("Go Stop",go+1) Qui m'a fait reculer.
Alors j'ai cousu mon "sto" avec ton "go", en me disant que personne ne s'apercevrait de rien.

La: if sto=1 then wait ?
Quand tu fait: exit for, il sort.... mais il faut l'attendre à la sortie pour lui donner un bon coup sur la tête.
Et là tu est tranquille. :lol

Aaaah, Ok pour la subtilité jb--->vb . Merci.



Edité par Roland Le 09/01/2013 à 18h57
____________________
Roro

   
Le 10/01/2013 à 09h22

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Roland:
Tes galipettes du genre: if go ( sous entendu si go existe), moi, j'ose pas y toucher. :heink
Et là c'est le go+1 de: #g.stop word$("Go Stop",go+1) Qui m'a fait reculer.


if go veut dire si go<>0. Je devrais l'écrire comme ça d'ailleurs !

Du coup dans la lecture de word$("Go Stop",go+1) , si go = 0 ce sera le premier mot et si go = 1 ce sera le deuxième ! c'est tout simple !

Pas de sous-entendu dans du code : c'est toujours très pragmatique et logique :top

@+



Edité par cassiope01 Le 10/01/2013 à 09h23
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 10/01/2013 à 09h51

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1992
Ah ça alors! je charge ton dernier code, je le lance..
Et je me prend ça: Complie halted sub ndir is already defined :heink
Sur la première ligne. Qui a un e apostrophe en tête de ligne.
Je mets deux apostrophes...Pareil ! :heink
Citation:
Du coup dans la lecture de word$("Go Stop",go+1) , si go = 0 ce sera le premier mot et si go = 1 ce sera le deuxième !

J'avais raison de me méfier :s

.........Je viens de vérifier: la version précédente qui a exactement la même première ligne se lance normalement
Voila un mystère bien mystérieux.
Plusieurs essais...Rien à faire, il en veut pas. Je vais redémarrer pour voir. .....à+.



Edité par Roland Le 10/01/2013 à 10h00
____________________
Roro

   
Le 10/01/2013 à 10h14

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1992
Saperlipopette !
J'ai redémarré... Viré les deux premières lignes... Remonté "nomainwin" en haut... Enregistré le fichier sous un autre nom...Fermé l'éditeur...Réouvert. :p
Pa-reil !!!!!! la même error sur "nomainwin" ! :heink
Et pendant ce temps l'autre version se lance tranquillement :s
Ma parole tu la ensorcelé ce code. :love



Edité par Roland Le 10/01/2013 à 10h15
____________________
Roro

   
Le 13/01/2013 à 08h09

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1992
Hey ! AltBas, il confonds les fourmis et les sauterelles. :s

..............Il ne manquerait plus que Cassiope nous y mette une IA...Pour voir remonter le chiffre d'affaire des fabricants de boutons gauche de souris.



Edité par Roland Le 14/01/2013 à 16h21
____________________
Roro

   
Projets open source » La fourmi de Langton Petit code sympa et amusant...  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie