## Outils 

def affichage(etiquette):
    joueur,jeu=etiquette_en_jeu(etiquette)
    print('   ' + '|' + str(jeu[-2]) + '|' + str(jeu[-3]) + '|' + str(jeu[-4]) + '|' + str(jeu[-5]) + '|' + str(jeu[-6]) + '|' + str(jeu[-7]) + '|'+'   ')
    print(str(jeu[-1])+' '*(3-len(str(jeu[-1])))+'-'*13+' '*(3-len(str(jeu[6])))+str(jeu[6]))
    print('   ' + '|' + str(jeu[0]) + '|' + str(jeu[1]) + '|' + str(jeu[2]) + '|' + str(jeu[3]) + '|' + str(jeu[4]) + '|' + str(jeu[5]) + '|'+'   ')

def ajout_sous_arbre(T,t,f):
    ''' 
    A REMPLIR
    '''
    S,A,E=T
    s,a,e=t
    l=len(S)
    for k in s:
        S.append(k+l)
    for (s1,s2) in a:
        A.append([s1+l,s2+l])
    E=E+e
    A.append([f,l])
    return S,A,E
    

def predsuccesseur(S,A):
    """
    La fonction prend en paramètres :
    S: une liste d'entiers, qui correspond aux sommets d'un graphe
    A: une liste de tuples d'entiers (i,j), qui correspondent aux arêtes d'un graphe
    
    La fonction renvoie un tuple contenant 4 listes:
    suc: une liste de listes, où chaque sous-liste contient les successeurs d'un sommet de S
    nbsuc: une liste contenant le nombre de successeurs pour chaque sommet de S
    pred: une liste de listes, où chaque sous-liste contient les prédécesseurs d'un sommet de S
    nbpred: une liste contenant le nombre de prédécesseurs pour chaque sommet de S.
    En utilisant les informations fournies par S et A, cette fonction permet de construire les listes des successeurs et prédécesseurs pour chaque sommet du graphe, ainsi que le nombre de successeurs et prédécesseurs pour chaque            sommet.
    """
    suc=[[] for i in S]
    nbsuc=[0 for i in S]
    pred=[[] for i in S]
    nbpred=[0 for i in S]
    for (i,j) in A:
        suc[i].append(j)
        pred[j].append(i)
        nbpred[j]+=1
        nbsuc[i]+=1
    return suc,nbsuc,pred,nbpred
    
    
    


def minimax(S:list,A:list,S0:list,F:list,V:list)->list:
    '''
    A REMPLIR
    '''
    value=["" for i in S]
    for i in range(len(F)):
        value[F[i]]=V[i]
    suc,nbsuc,pred,nbpred=predsuccesseur(S,A)
    compt=nbsuc
    for x in F:
        value,compt=marq_et_prop(x,value,compt,suc,pred,S0,F)
    return value




def marq_et_prop(x,value,compt,suc,pred,S0,F):
    """
    A REMPLIR
    """
    if x in S0 and x not in F:
        value[x]=max([value[s] for s in suc[x]])
    elif x not in S0 and x not in F : 
        value[x]=min([value[s] for s in suc[x]]) 
    for u in pred[x]:
        compt[u]=compt[u]-1
        if compt[u]==0:
            value,compt=marq_et_prop(u,value,compt,suc,pred,S0,F)
    return value,compt
    