﻿from tkinter import *
from tkinter.messagebox import showinfo
from random import choice
from math import sin
from math import cos
from math import pi


    

Fenetre=Tk()	
Fenetre.title("Simon")
c=150
r=81
points=0
Testpoints=True
Test=False
SolutionS=[]
SuiteJoueur=[]
couleur=10
erreur=0
b=10



def Difficulte(Testpoints):
    global ListeSombre, ListeClaire, j
    ListeSombre=['#ff0000','#0061ff','#ffff00','#00ce7b','#ff7b00','#7b00ff','#00ffa1','#707070','#9370db']
    ListeClaire=['#db7093','#8eb9ff','#ffffe6','#a4e8cc','#ffaa00','#b200ff','#91ffd6','#b2b2b2','#e791ff']
    if points<5:
        j=5
    if points>5*(j-4) and j<9:   
        j+=1
        Testpoints=True
    if Testpoints == True:
        zone_dessin.delete(ALL)  
        Testpoints=False
        init()

    
def init():
    global zone_dessin, invite, grille
    s=r-12          
    t=j*(1+0.25*j)  
    panneau=[zone_dessin.create_oval(c*2-r+t+c*sin(pi/2-2*pi*i/j),c*2-r+t+c*sin(2*pi*i/j),c*2+r-t+c*sin(pi/2-2*pi*i/j),c*2+r-t+c*sin(2*pi*i/j),fill=ListeSombre[i],width=4,outline='black',tags='panneau') for i in range(j)]
    grille=[zone_dessin.create_oval(c*2-s+t+c*sin(pi/2-2*pi*i/j),c*2-s+t+c*sin(2*pi*i/j),c*2+s-t+c*sin(pi/2-2*pi*i/j),c*2+s-t+c*sin(2*pi*i/j),fill=ListeSombre[i],width=1,outline='black',tags='grille') for i in range(j)]
    titre =[zone_dessin.create_text(540, 40+i*35, text="SIMON"[i], font="Comic 24 ", fill="black")for i in range(5)]
    invite=zone_dessin.create_text(300, 310, text="à vous", font="Comic 15", fill="", tags="invite")
    boutonniveau.place(x=300,y=280,anchor=CENTER)

    
def fonction(evt): 
    global elt, points
    elt=zone_dessin.find_withtag(CURRENT) 
    if 'grille' in zone_dessin.gettags(elt):
        couleur=zone_dessin.itemcget(elt,"fill")  
        b=ListeSombre.index(couleur)
        print(couleur,' numero ',b,' Claire',ListeClaire[b],' Sombre',ListeSombre[b])
        duree=1
        zone_dessin.unbind("<Button-1>") 
        changecouleur(True,b,ListeClaire[b],duree*500)       
        changecouleur(True,b,ListeSombre[b],duree*200)       
        zone_dessin.bind("<Button-1>",fonction)
        SuiteJoueur.append(couleur) 
    if len(SuiteJoueur)==len(SolutionS):
        zone_dessin.itemconfigure(invite,fill="") 
        Verification(len(SuiteJoueur))

def changecouleur(Test,b,remplacecouleur, duree): 
    if Test==True:
        zone_dessin.itemconfigure(grille[b],fill=remplacecouleur) 
        zone_dessin.update()        
        Test=False                  
        Fenetre.after(duree,changecouleur(Test,b,remplacecouleur,duree))


    
def Verification(n):    
    global points
    zone_dessin.unbind("<Button-1>") 
    erreur=0
    for i in range(n):
        if SuiteJoueur[i]!=SolutionS[i]:
            erreur=erreur+1
    print(SuiteJoueur[i],"égale ou pas à", SolutionS[i])
    del(SuiteJoueur[:])
    if erreur==0:
        points+=1
        Affichescore.configure(text = 'Score : '+str(points)+' points') 
        boutonniveau.config(state="normal")
    else:
        perdu()
        boutonniveau.config(state="disable")
    


def Niveau():
    zone_dessin.unbind("<Button-1>") 
    boutonniveau.config(state="disable") 
    Difficulte(False)  
    creation_serie()
    lancement_afficheserie()

    
def lancement_afficheserie():
    duree=duree_affichage(len(SolutionS))
    for i in range(len(SolutionS)):
        b=ListeSombre.index(SolutionS[i])
        changecouleur(True,b,ListeClaire[b],duree*50)  
        changecouleur(True,b,ListeSombre[b],duree*50)
        zone_dessin.update() 
    zone_dessin.bind("<Button-1>",fonction)
    zone_dessin.itemconfigure(invite,fill='black') 



def creation_serie():   
    global SolutionS, ListeSombre
    a=choice(ListeSombre[0:j])
    SolutionS.append(a)
    print('longueur : ', len(SolutionS), "série de couleur à reproduire",SolutionS)





def duree_affichage(n): 
    
    duree=int(30/n)  
    if duree<1:
        duree=1
    return duree


def perdu():
    phrase="Perdu \n Votre score est de "+str(points)+" points."
    showinfo("Dommage",phrase) 

def rejouer():  
    global points
    points=0 
    del(SolutionS[:])
    Affichescore.configure(text = 'Score : '+str(points)+' points') 
    boutonniveau.config(state="normal")
    Difficulte(Testpoints)
    












       


lb_resultat = Label(Fenetre)
zone_dessin=Canvas(Fenetre,width=580,height=540,bg='azure',bd=8,relief="ridge")
boutonrejouer = Button(Fenetre, text="Rejouer", command=rejouer)
boutonquitter = Button(Fenetre, text="Quitter", command=Fenetre.destroy)
boutonniveau = Button(Fenetre, text="Niveau suivant", command=Niveau)
Affichescore=Label(Fenetre, text="Score :")


zone_dessin.pack()
boutonquitter.pack(side=RIGHT)
boutonrejouer.pack(side=RIGHT)
Affichescore.pack(side=LEFT)




   

    

if __name__ == "__main__":
    Difficulte(True)
    showinfo("Règle du Simon","Répétez la série de couleurs affichée par l'ordinateur") #Fenêtre des règles
    Fenetre.mainloop()


