import matplotlib.pyplot as plt
import numpy as np

n=4
p=3
L=["Carlos","Jad"]
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)}

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="purple",markersize=30)
    plt.plot([0],[0],"rx",markersize=30)
    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+" = idiot ! Entrez un couple valide: "))
    return c

def SAleatoire(tab,joueur):
    """Joue au hasard sauf le carré empoisonné si possible"""
    if len(tab)==1:
        return (0,0)
    L=list(tab-{(0,0)})
    return L[np.random.randint(len(L))]

def Partie(n,p,S1,S2,afficher=False):
    """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 1>=0:#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

def Bilan(S1,S2,Nb):
    """Renvoie 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"""
    DB={L[0]:0,L[1]:0}
    for i in range(Nb):
        a=Partie(n,p,S1,S2)#Résultat de la partie
        DB[a]=DB[a]+1
    return {k:DB[k]*100/Nb for k in DB}

print(Partie(n,p, JoueurHumain,JoueurHumain,True),"a gagné")#ne fonctionne que sous Spyder
S=[SAleatoire]#Liste des stratégies
for S1 in S:
    for S2 in S:
        B=Bilan(S1,S2,10**2)
        print(L[0],"gagne",B[L[0]],"avec",str(S1)[10:19],"vs",L[1],"gagne",B[L[1]],"avec",str(S2)[10:19])