import matplotlib.pyplot as plt
import numpy as np

# Questions 2,3,4 & 5

n=4
p=3
L=["Morgan","Malo"]
Opp={L[0]:L[1],L[1]:L[0]} 

def Milka(n,p):
    """Fabrique une tablette de chocolat avec n lignes et p colonnes,
        et la marmotte, elle met le chocolat dans le papier d'alu"""
    return {(i,j) for i in range(n) for j in range(p)}

tab=Milka(n,p)

def Montrer(tab):
    """Affiche la tablette de chocolat"""
    plt.figure()
    plt.xlim(-1,n)# 
    plt.ylim(-1,p)#
    plt.plot([e[0] for e in tab-{(0,0)}],[e[1] for e in tab-{(0,0)}],"s",color="brown",markersize=50)
    plt.plot([0],[0],"rx",markersize=50)
    plt.show()
    
def Mange(tab,i,j):
    """Mange le carré i,j et tout ce qui est en haut à droite de ce carré"""
    return {(a,b) for (a,b) in tab if a<i or b<j}
    
def JoueurHumain(tab,joueur):
    """Demande à l'humain de jouer"""
    c=eval(input(joueur+" Entrez un couple valide parmi "+str(tab)+" : "))
    while c not in tab:
        c=eval(input(joueur+" n'a rien compris! Carré déjà mangé! Entrez un couple valide!"))
    return c      
    
def Partie(n,p,S1,S2,afficher):    
    """Joue une partie avec n lignes et p colonnes,
    le joueur 1 joue avec la stratégie S1
    le joueur 2 avec la stratégie S2
    """
    tab=Milka(n,p) # on crée la tablette
    DS={L[0]:S1,L[1]:S2} # le joueur 1 joue avec S1, 2 avec S2
    joueur=L[0] # le joueur 1 commence
    while True: # boucle faussement infinie, car le return arrête la fonction
        if afficher:
            Montrer(tab)
        (i,j)=DS[joueur](tab,joueur)
        tab=Mange(tab,i,j)
        joueur=Opp[joueur] # on change de joueur
        if len(tab)==0: # partie finie
            return joueur # on renvoie le vainqueur, arrête le while/la fonction

#print(Partie(n,p, JoueurHumain,JoueurHumain,True),"a gagné") # ne fonctionne que sous Spyder

#%%

# Question 6

def ListeVoisins(s):
    tab=s[0]
    joueur=s[1]
    return [(Mange(tab,i,j),Opp[joueur]) 
            for (i,j) in tab-{(0,0)}]

# Question 7

def GrapheTab(tab,joueur):
    for (tabb,o) in ListeVoisins((tab,joueur)):
        if (tabb,o) not in G:
            G.append((tabb,o))
            GrapheTab(tabb,o)
n=4
p=3
L=["Morgan","Malo"]
Opp={L[0]:L[1],L[1]:L[0]} 
tab=Milka(n,p)

G=[(tab,L[0])] # Initialisation de la liste des sommets du graphe
GrapheTab(tab,L[0]) # Création du graphe où le joueur L[0] commence

print("Le graphe G a pour ordre",len(G),".")

#%%

# Question 9 et 10

def StrategieAleatoire(tab,joueur):
    "Joue au hasard sauf le carré empoisonné si possible"
    # A COMPLETER
    return 

#%%

# Question 11

""" La fonction Bilan envoie le pourcentage de parties gagnées par L[0] avec la stratégie S1, 
    de parties gagnées par L[1] avec la stratégie S2, ces pourcentages sont
    approximés en effectuant N parties"""

"""

def Bilan(S1,S2,Nb):
    DB={L[0]:0,L[1]:0}
    for i in range(Nb):
        a=Partie(n,p,S1,S2,False) # Résultat de la partie
        DB[a]=DB[a]+1
    return {k:DB[k]*100/Nb for k in DB}

G=[(tab,L[0])]#Liste des sommets du graphe
GrapheTab(tab,L[0])#Création du graphe
A={L[0]:Attracteur(L[0]),L[1]:Attracteur(L[1])}

S=[StrategieAleatoire,StrategieGagnante]
for S1 in S:
    for S2 in S:
        B=Bilan(S1,S2,10**3)
        print(L[0],"gagne",B[L[0]],"avec",str(S1)[10:28],"vs",L[1],"gagne",B[L[1]],"avec",str(S2)[10:28])

"""