Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

[Python] Fourmi de Langton




  1. #1
    henryallen

    [Python] Fourmi de Langton

    Bonjour à tous

    J'essaye actuellement de réaliser un programme pour reproduire le mouvement de la fourmi de Langton.

    Pour ceux qui ne connaissent pas: on a une grille dont chaque case est soit blanche soit noire (pour ma part toutes les cases sont de la même couleur au début, mais peu importe). Sur une de ces cases, on place une fourmi. Elle avance d'une case, et la case qu'elle vient de quitter change alors de couleur. Si elle est sur une case blanche, elle tourne à droite puis avance, si elle est sur une noire, elle tourne à gauche et avance.

    J'ai donc essayé de réaliser ce programme, mais je bloque au niveau de l'affichage. Je ne suis pas très doué en tkinter, mais j'ai réussi sans souci à créer ma grille. Le problème est que j'aimerai voir l'avancement, c'est-à-dire voir les cases changer de couleur au fil du temps. Mais avec mon code, je suis obligé de fermer la fenêtre tkinter pour que ça continue ... J'ai essayé de plusieurs manières, j'ai également cherché sur Internet, mais je n'ai pas trouvé ...

    Code:
    # -*-coding:Latin-1-*
     
    from tkinter import *
    class Fourmi:
            def __init__(self):
                    self.grille={}
                    for a in range(100):
                        for b in range(100):
                            self.grille[a, b]="O"
                    self.sens="h"
                    self.i=0
                    self.fourmi=[50, 50]
                    while self.i<20000:
                            self.fenetre=Tk()
                            if self.grille[self.fourmi[0], self.fourmi[1]]==".":
                                self.grille[self.fourmi[0], self.fourmi[1]]="O"
                                if self.sens=="h":
                                    self.fourmi[0]+=1
                                    self.sens="d"
                                elif self.sens=="b":
                                    self.fourmi[0]-=1
                                    self.sens="g"
                                elif self.sens=="d":
                                    self.fourmi[1]-=1
                                    self.sens="b"
                                else:
                                    self.fourmi[1]+=1
                                    self.sens="h"
                            else:
                                self.grille[self.fourmi[0], self.fourmi[1]]="."
                                if self.sens=="h":
                                    self.fourmi[0]-=1
                                    self.sens="g"
                                elif self.sens=="b":
                                    self.fourmi[0]+=1
                                    self.sens="d"
                                elif self.sens=="d":
                                    self.fourmi[1]+=1
                                    self.sens="h"
                                else:
                                    self.fourmi[1]-=1
                                    self.sens="b"
                            self.i+=1
                            self.canvas=Canvas(self.fenetre, width=792, height=792)
                            for i in range(100):
                                    for n in range(100):
                                            if self.grille[i, n]=="O":
                                                    self.canvas.create_rectangle(8*n, 8*i, 8*n+8, 8*i+8, fill="white")
                                            else:
                                                    self.canvas.create_rectangle(8*n, 8*i, 8*n+8, 8*i+8, fill="black")
                            self.canvas.pack()
                            self.fenetre.mainloop()
    Fourmi()
    Je sais que mon code n'est pas très optimisé, notamment pour les changements de direction, mais ce n'est pas trop mon problème pour le moment: dès que j'aurai réussi à faire ce que je n'arrive pas à faire, j'essayerai de l'améliorer.

    Donc si quelqu'un pouvait m'éclairer sur la manière de modifier automatiquement l'affichage ...

    Merci d'avance

    Bonne soirée

    -----


  2. #2
    henryallen

    Re : [Python] Fourmi de Langton

    Bonjour

    J'ai modifié la manière de changer le sens, parce que mon problème n'est toujours pas résolu. Maintenant, 0 correspond au haut, 1 à la gauche, 2 au bas et 3 à la droite.

    Code:
    # -*-coding:Latin-1-*
    from tkinter import *
    class Fourmi:
            def __init__(self):
                    self.grille={}
                    self.i=0
                    for a in range(100):
                        for b in range(100):
                            self.grille[a, b]="O"
                    self.sens=0
                    self.fourmi=[49, 49]
                    self.ancien_fourmi=[self.fourmi[0], self.fourmi[1], "bl"]
                    
                    self.fenetre=Tk()
                    if self.i==0:
                            self.canvas=Canvas(self.fenetre, height=800, width=800)
                            self.canvas.pack()
                            for i in range(100):
                                for n in range(100):
                                    if self.grille[i, n]=="O":
                                            self.canvas.create_rectangle(8*n, 8*i, 8*n+8, 8*i+8, fill="white")
                                    else:
                                            self.canvas.create_rectangle(8*n, 8*i, 8*n+8, 8*i+8, fill="black")
                                    self.canvas.pack()
                            self.i=1
                    self.avance()
                    self.fenetre.mainloop()
            def avance(self):
                    if self.grille[self.fourmi[0], self.fourmi[1]]==".":
                                self.grille[self.fourmi[0], self.fourmi[1]]="O"
                                if self.sens%4==0:
                                    self.fourmi[0]+=1
                                elif self.sens%4==2:
                                    self.fourmi[0]-=1
                                elif self.sens%4==3:
                                    self.fourmi[1]-=1
                                else:
                                    self.fourmi[1]+=1
                                self.sens-=1
                    else:
                                self.grille[self.fourmi[0], self.fourmi[1]]="."
                                if self.sens%4==0:
                                    self.fourmi[0]-=1
                                elif self.sens%4==2:
                                    self.fourmi[0]+=1
                                elif self.sens%4==3:
                                    self.fourmi[1]+=1
                                else:
                                    self.fourmi[1]-=1
                                self.sens+=1
                    self.change()
            def change(self):
                    if self.ancien_fourmi[2]=="bl":
                                    self.ancien_fourmi[2]="n"
                                    self.canvas.create_rectangle(8*self.fourmi[0], 8*self.fourmi[1], 8*(self.fourmi[0]+1), 8*(self.fourmi[1]+1), fill="black")
                                    self.ancien_fourmi[0]=self.fourmi[0]
                                    self.ancien_fourmi[1]=self.fourmi[1]
                    else:
                                    self.ancien_fourmi[2]="bl"
                                    self.canvas.create_rectangle(8*self.fourmi[0], 8*self.fourmi[1], 8*(self.fourmi[0]+1), 8*(self.fourmi[1]+1), fill="white")
                                    self.ancien_fourmi[0]=self.fourmi[0]
                                    self.ancien_fourmi[1]=self.fourmi[1]
                    self.canvas.pack()                      
    Fourmi()
    J'appelle la fonction avance, qui change les coordonnées de la fourmi, qui appelle elle-même change, qui modifie l'affichage. Je comprends que quand j'arrive à self.fenetre.mainloop(), il n'y a aucune raison pour que le programme continue autre chose. Mais je ne vois toujours pas comment résoudre mon problème.

    Si vous pouviez m'aider ...
    Merci d'avance

    Bonne journée

Discussions similaires

  1. fourmis de Langton
    Par umoteck dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 30/12/2015, 21h31
  2. La fourmi de Langton (python)
    Par Azghar dans le forum Programmation et langages, Algorithmique
    Réponses: 12
    Dernier message: 14/12/2015, 12h51
  3. en python le multi tache n'est pas possible alors pourquoi les threads existent sur python?
    Par docEmmettBrown dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 10/06/2015, 15h47
  4. Prédation d'une fourmi par une fourmi...
    Par richardunord dans le forum Identification des espèces animales ou végétales
    Réponses: 3
    Dernier message: 23/05/2015, 10h03
  5. Définition - Boucle de Langton
    Par RSSBot dans le forum Commentez les actus, dossiers et définitions
    Réponses: 0
    Dernier message: 03/03/2012, 23h00