# Replicator

from tkinter import *
from random import randrange

haut = 75  # hauteur du tableau
larg = 75  # largeur du tableau
cote = 10  # côté d'une cellule
vivant = 1
mort = 0
flag = 0

# Créer les matrices
cell = [[0 for row in range(haut)] for col in range(larg)]
etat = [[mort for row in range(haut)] for col in range(larg)]
temp = [[mort for row in range(haut)] for col in range(larg)]

# Calculer et dessiner le prochain tableau
def tableau():
    global flag
    calculer()
    dessiner()
    if flag==1:
        fenetre.after(100, tableau)
    else:
        flag=0

# Données initiales
def init():
    for y in range(haut):
        for x in range(larg):
            etat[x][y] = mort
            temp[x][y] = mort
            cell[x][y] = canvas.create_rectangle((x*cote, y*cote, (x+1)*cote, (y+1)*cote), outline="gray", fill="white")

# Appliquer la règle
def calculer():
    for y in range(haut):
        for x in range(larg):
            nb_voisins = voisins_vivants_tore(x,y)
            # Règle
            if  nb_voisins%2 == 0 :
                temp[x][y] = mort
            else:
                temp[x][y] = vivant
    for y in range(haut):
        for x in range(larg):
            etat[x][y] = temp[x][y]

# Compter les voisins vivants - tableau torique
def voisins_vivants_tore(a,b):
    nb_voisins = 0
    if etat[(a-1)%larg][(b+1)%haut] == 1:
        nb_voisins += 1
    if etat[a][(b+1)%haut] == 1:
        nb_voisins += 1
    if etat[(a+1)%larg][(b+1)%haut] == 1:
        nb_voisins += 1
    if etat[(a-1)%larg][b] == 1:
        nb_voisins += 1
    if etat[(a+1)%larg][b] == 1:
        nb_voisins += 1
    if etat[(a-1)%larg][(b-1)%haut] == 1:
        nb_voisins += 1
    if etat[a][(b-1)%haut] == 1:
        nb_voisins += 1
    if etat[(a+1)%larg][(b-1)%haut] == 1:
        nb_voisins += 1
    return nb_voisins

# Dessiner toutes les cellules
def dessiner():
    for y in range(haut):
        for x in range(larg):
            if etat[x][y]==mort:
                coul = "white"
            else:
                coul = "blue"
            canvas.itemconfig(cell[x][y], fill=coul)

# Tout effacer
def effacer():
    for y in range(haut):
        for x in range(larg):
            etat[x][y]=mort
    dessiner()

# Arrêt de l'animation
def stop():
    global flag
    flag=0

# Démarrage de l'animation
def start():
    global flag
    if flag==0: 
        flag=1
    tableau()

# Animation pas à pas
def pasapas():
    global flag
    flag=2
    tableau()

# Modifier la tableau avec la souris
def pointeur(event):
    x, y = event.x//cote, event.y//cote
    etat[x][y] = (etat[x][y]+1)%2  # on inverse l'état : mort <-> vivant
    if etat[x][y]==mort:
        coul = "white"
    else:
        coul = "blue"
    canvas.itemconfig(cell[x][y], fill=coul)

# Lancement du programme
fenetre = Tk()
fenetre.title("Replicator")
canvas = Canvas(fenetre, width=cote*larg, height=cote*haut, highlightthickness=0)
canvas.bind("<Button-1>", pointeur)
canvas.pack()
bou1 = Button(fenetre,text='Quitter', width=8, command=fenetre.destroy)
bou1.pack(side=RIGHT)
bou2 = Button(fenetre, text='Démarrer', width=8, command=start)
bou2.pack(side=LEFT)
bou3 = Button(fenetre, text='Arrêter', width=8, command=stop)
bou3.pack(side=LEFT)
bou4 = Button(fenetre, text='Pas à pas', width=8, command=pasapas)
bou4.pack(side=LEFT)
bou5 = Button(fenetre, text='Effacer', width=8, command=effacer)
bou5.pack(side=LEFT)
init()
tableau()
fenetre.mainloop()
