# Evolution des opinions politiques sur la planète Torus

from tkinter import *
from random import randrange

haut = 16  # hauteur du tableau
larg = 16  # largeur du tableau
cote = 15  # côté d'une cellule
rouge = 0
jaune = 1
nb_rouges = haut*larg
nb_jaunes = 0

# Créer les matrices
cell = [[0 for row in range(haut)] for col in range(larg)]
parti = [[rouge for row in range(haut)] for col in range(larg)]

# Dessiner toutes les cellules
def dessiner():
    for y in range(haut):
        for x in range(larg):
            if parti[x][y]==rouge:
                coul = "red"
            else:
                coul = "yellow"
            canvas.itemconfig(cell[x][y], fill=coul)

# Données initiales
def init():
    global nb_rouges, nb_jaunes
    nb_rouges, nb_jaunes = 0, 0
    nb_echanges = 0
    for y in range(haut):
        for x in range(larg):
            if nb_rouges < haut*larg/2:
                parti[x][y] = rouge
                nb_rouges += 1
            else:
                parti[x][y] = jaune
                nb_jaunes += 1
            cell[x][y] = canvas.create_rectangle((x*cote, y*cote, (x+1)*cote, (y+1)*cote), outline="gray", fill="red")
    # placer au hasard 50% d'opinions jaunes
    while nb_echanges < haut*larg:
        x1 = randrange(larg)
        y1 = randrange(haut)
        x2 = randrange(larg)
        y2 = randrange(haut)
        parti[x1][y1], parti[x2][y2] = parti[x2][y2], parti[x1][y1]
        nb_echanges += 1
    dessiner()

# Choisir l'opinion d'un des 8 voisins de la cellule (a,b) - tableau torique
def opinion_voisin(a,b):
    voisin = randrange(8)
    if voisin==1:
        opinion = parti[(a-1)%larg][(b+1)%haut]
    elif voisin==2:
        opinion = parti[a][(b+1)%haut]
    elif voisin==3:
        opinion = parti[(a+1)%larg][(b+1)%haut]
    elif voisin==4:
        opinion = parti[(a-1)%larg][b]
    elif voisin==5:
        opinion = parti[(a+1)%larg][b]
    elif voisin==6:
        opinion = parti[(a-1)%larg][(b-1)%haut]
    elif voisin==7:
        opinion = parti[a][(b-1)%haut]
    else:
        opinion = parti[(a+1)%larg][(b-1)%haut]
    return opinion

# Appliquer la règle
def calculer():
    global nb_rouges, nb_jaunes
    x = randrange(larg)
    y = randrange(haut)
    nouvelle_opinion = opinion_voisin(x,y)
    if parti[x][y] != nouvelle_opinion:
        if nouvelle_opinion == rouge:
            nb_rouges += 1
            nb_jaunes -= 1
        else :
            nb_rouges -= 1
            nb_jaunes += 1
        parti[x][y] = nouvelle_opinion
        if parti[x][y] == rouge:
            coul = "red"
        else:
            coul = "yellow"
        canvas.itemconfig(cell[x][y], fill=coul)

# Calculer et dessiner le prochain tableau
def tableau():
    calculer()
    fenetre.after(1, tableau)

# Lancement du programme
fenetre = Tk()
fenetre.title("Torus")
canvas = Canvas(fenetre, width=cote*larg, height=cote*haut, highlightthickness=0)
canvas.pack()
init()
tableau()
fenetre.mainloop()
