################################################################################
################################################################################
#   MORPION ALEA
################################################################################
################################################################################

import  numpy.random as rd

################################################################################
#   FONCTIONS DU JEU
################################################################################

def aff(tab):
    """aff(tab:list)->None
    Affichage de la grille de jeu décrite par tab"""
    dico={None:'   ', 0:' O ', 1:' X '}
    print()
    print("   | 0 | 1 | 2 ")
    print("-"*15)
    for i in range(3):
        ligne=" "+str(i) +" |"
        for j in range(3):
            ligne+=dico[tab[i][j]]
            if j<2:
                ligne+="|"
        print(ligne)
        if i<2:
            print("-"*15)
    print()


def alignement(tab,motif):
    """alignement(tab:list,motif:int)->bool
    Résultat du test de recherche d'alignement horizontal, vertical ou diagonal
    de trois apparitions du motif"""
    res=False
    for i in range(3):
        if tab[i]==[motif]*3:
            res=True
    for j in range(3):
        if tab[0][j]==motif and tab[1][j]==motif and tab[2][j]==motif:
            res=True
    if tab[0][0]==motif and tab[1][1]==motif and tab[2][2]==motif:
        res=True
    if tab[0][2]==motif and tab[1][1]==motif and tab[2][0]==motif:
        res=True
    return res


def adversaire(x):
    """adversaire(x:int)->int
    Renvoie l'adversaire du joueur x"""
    return 1-x

def coup_valide(tab,i,j):
    """coup_valide(tab:list,i:int,j:int)->bool
    Résultat du test de validité du placement d'un motif en position (i,j)"""
    L_coord=[0,1,2]
    return  i in L_coord and j in L_coord and tab[i][j]==None


################################################################################
#   PARTIE
################################################################################


def morpion_alea():
    """Partie de morpion contre la machine
    J_0 : joueur
    J_1 : machine"""
    tab=[[None]*3 for k in range(3)]
    libres=[(i,j) for i in range(3) for j in range(3)]
    nb,fini,J_i=0,False,1
    # J_0 commence (bascule de joueur en début de boucle)
    while not fini:
        J_i=adversaire(J_i)
        print('\nCoup=',nb)
        nb+=1
        aff(tab)
        # su Joueur J_0, alors saisie du coup
        if J_i==0:
            valide=False
            while not valide:
                saisie=input("J_"+str(J_i)+" : x,y =")
                coords=saisie.split(",")
                i,j=int(coords[0]),int(coords[1])
                valide=coup_valide(tab,i,j)
                if not valide:
                    print("Coup invalide")
        # sion, la machine joue (mal)
        else:
            ind=rd.randint(len(libres))
            i,j=libres[ind]
        tab[i][j]=J_i
        libres.remove((i,j))
        align_o=alignement(tab,0)
        align_x=alignement(tab,1)
        fini=align_o or align_x or nb==9
        #print()
    print()
    if align_o or align_x:
        print("J_"+str(J_i)+" gagne")
    else:
        print("Match nul")
    aff(tab)
        
    
