from random import shuffle

def tire_n_cartes(jeu: list, N: int)->list:
    '''
    Tire au hasard N cartes dans un jeu de cartes.
    Entrées :
        jeu = le tableau complet des cartes d'un jeu
        N = le nombre de cartes à tirer
    Sortie :
        le tableaux des N cartes tirées au hasard
    '''

    shuffle(jeu)  # mélange aléatoirement les éléments du tableau du jeu

    return [jeu[i] for i in range(N)] # renvoi d'un tableau des N premiers éléments du tableau du jeu

def affiche_cartes(cartes, depuis: int, jusqu_a: int):
    '''
    Affiche la liste des cartes encore en jeu.
    Entrées :
        cartes = le tableau COMPLET des cartes en jeu
        depuis = indice de début d'affichage
        jusqu_a = indice de fin d'affichage
    Sortie :
        une chaîne de caractères représentant les cartes à afficher
    '''

    affichage = ''
    for i in range(depuis, jusqu_a + 1):
        affichage += str(cartes[i]) + ' ' # attention, cartes[i] est un tuple, il faut le transtyper en str
    return affichage

def calcule_valeur(carte: tuple)->int:
    '''
    Renvoie la valeur associée à la figure d'une carte
    Entrée:
        carte = le tuple représentant la carte
    Sortie :
        la valeur associée à la figure de la carte
    '''

    figures = ['7','8','9','10','V','D','R','A'] # tableau des figures possibles
    valeurs = [7, 8, 9, 10, 11, 12, 13, 14] # valeurs entières correspondantes, DANS LE MÊME ORDRE : une figure et sa valeur ont donc LE MÊME INDICE dans les deux tableaux

    fig = carte[0] # figure de la carte passée en argument ( = 1er élément du tuple )
    indice = figures.index(fig) # détermination de l'indice de cette figure dans le tableau des figures

    return valeurs[indice] # renvoi de la valeur de l'élément AU MÊME INDICE dans le tableau des valeurs

# PROGRAMME PRINCIPAL DU JEU
jeu_cartes = [('7','Carreau'), ('8','Carreau'),('9','Carreau'), ('10','Carreau'),('V','Carreau'),('D','Carreau'),('R','Carreau'),('A','Carreau'),('7','Coeur'),('8','Coeur'),('9','Coeur'), ('10','Coeur'),('V','Coeur'),('D','Coeur'),('R','Coeur'),('A','Coeur'),('7','Pique'),('8','Pique'),('9','Pique'), ('10','Pique'),('V','Pique'),('D','Pique'),('R','Pique'),('A','Pique'),('7','Trèfle'),('8','Trèfle'),('9','Trèfle'), ('10','Trèfle'),('V','Trèfle'),('D','Trèfle'),('R','Trèfle'),('A','Trèfle')]

n_cartes = 10   # nombre de cartes en jeu
cartes = tire_n_cartes(jeu_cartes, n_cartes)    # cartes en jeu

joueur1 = input('Nom du joueur1 : ')
joueur2 = input('Nom du joueur2 : ')

joueur = joueur1 # le joueur1 commence

score_1 = 0 # score de chaque joueur
score_2 = 0

gauche = 0 # indice dans le tableau 'cartes', du début des cartes encore en jeu ( = indice du premier élement du tableau en début de jeu )
droite = n_cartes - 1 # indice dans le tableau 'cartes', de la fin des cartes encore en jeu( = indice du derner élément du tableau en début de jeu )

# Début du jeu
for i in range(n_cartes): # ou while gauche <= droite:
    print("C'est à " + joueur + " de jouer :")
    print(affiche_cartes(cartes, gauche, droite))
    choix = ""
    while choix !='g' and choix !='d': # permet de restreindre les entrées utilisateurs aux seuls caractères 'g' et 'd': tant que l'utilisateur n'a pas entré un caractère valide,...
        choix = input('Prenez-vous la carte de Gauche ou de Droite ? ') # ...on lui redemande ce caractère !!
    if choix == 'g': # une fois sorti de la boucle 'while' précédente, 'choix' ne peut donc avoir que deux valeurs possibles.
        carte_jouee = cartes[gauche] # récupération du tuple représentant la carte choisie ( à gauche )
        gauche += 1 # on incrémente le début de la liste des cartes encore en jeu
    elif choix == 'd':
        carte_jouee = cartes[droite] # récupération du tuple représentant la carte choisie ( à droite )
        droite -= 1 # on décrémente la fin de la liste des cartes encore en jeu

    if joueur == joueur1: # si c'est le joueur1 qui vient de jouer,
        score_1 += calcule_valeur(carte_jouee) # on ajoute au score du joueur 1 la valeur de la carte qu'il a choisie
        joueur = joueur2  # et on change de joueur
    else: # sinon ( c'est à dire si c'est le joueur2 qui vient de jouer ),
        score_2 += calcule_valeur(carte_jouee) # même chose.
        joueur = joueur1

    print() # saut d'une ligne pour améliorer l'affichage

print(joueur1 + ": " + str(score_1))
print(joueur2 + ": " + str(score_2))

if score_1 > score_2:
    print(joueur1 + " gagne !")
elif score_1 < score_2:
    print(joueur2 + " gagne !")
else:
    print("Egalité !")


