'I don't know why my Python code isn't working

Here's my code: I don't know why but I cant find my errors. It's a game that aims to remove pairs from your deck and have no more pairs. The name of the game is called mistrigry or lousy.

import random

def attend_le_joueur():
    '''()->None
    Pause le programme jusqu'au l'usager appui Enter
    '''
    try:
         input("Appuyez Enter pour continuer. ")
    except SyntaxError:
         pass


def prepare_paquet():
    '''()->list of str
        Retourne une liste des chaines de caractères qui représente tous les cartes,
        sauf le valet noir.
    '''
    paquet=[]
    couleurs = ['\u2660', '\u2661', '\u2662', '\u2663']
    valeurs = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
    for val in valeurs:
        for couleur in couleurs:
            paquet.append(val+couleur)
    paquet.remove('J\u2663') # élimine le valet noir (le valet de trèfle)
    return paquet

def melange_paquet(p):
    '''(list of str)->None
       Melange la liste des chaines des caractères qui représente le paquet des cartes    
    '''
    random.shuffle(p)

def donne_cartes(p):
     '''(list of str)-> tuple of (list of str,list of str)

     Retournes deux listes qui représentent les deux mains des cartes.  
     Le donneur donne une carte à l'autre joueur, une à lui-même,
     et ça continue jusqu'à la fin du paquet p.
     '''
     
     donneur=[]
     autre=[]

     var = 1
     for i in range(len(p)):
         if var == 0:
             donneur.append(p[i])
             var = 1
         elif var == 1:
             autre.append(p[i])
             var = 0
     return(donneur,autre)


def elimine_paires(l):
    '''
     (list of str)->list of str

     Retourne une copy de la liste l avec tous les paires éliminées 
     et mélange les éléments qui restent.

     Test:
     (Notez que l’ordre des éléments dans le résultat pourrait être différent)
     
     >>> elimine_paires(['9♠', '5♠', 'K♢', 'A♣', 'K♣', 'K♡', '2♠', 'Q♠', 'K♠', 'Q♢', 'J♠', 'A♡', '4♣', '5♣', '7♡', 'A♠', '10♣', 'Q♡', '8♡', '9♢', '10♢', 'J♡', '10♡', 'J♣', '3♡'])
     ['10♣', '2♠', '3♡', '4♣', '7♡', '8♡', 'A♣', 'J♣', 'Q♢']
     >>> elimine_paires(['10♣', '2♣', '5♢', '6♣', '9♣', 'A♢', '10♢'])
     ['2♣', '5♢', '6♣', '9♣', 'A♢']
    '''

    resultat=[]

    if len(l) < 2:
        return 1
    l.sort()
    l.append([''])
    a = 1
    while a < len(l):
        if l[a-1][:-1] != l[a][:-1]:
            resultat.append(l[a-1])
            a = a + 1
        else:
            a = a + 2
    

    random.shuffle(resultat)
    return resultat


def affiche_cartes(p):
    '''
    (list)-None
    Affiche les éléments de la liste p séparées par d'espaces
    '''
    for i in p:
        print(p[i], end = ' ')
    

def entrez_position_valide(n):
     '''
     (int)->int
     Retourne un entier du clavier, de 1 à n (1 et n inclus).
     Continue à demander si l'usager entre un entier qui n'est pas dans l'intervalle [1,n]
     
     Précondition: n>=1
     '''

     v = str(n)
     s = int(input("S'il vous plait, veuillez entrer un entier de 1 à "+ v +":"))
     while s > n or n < 1:
         s = int(input("S'il vous plait, veuillez entrer un entier de 1 à "+ v +":"))
         return (s)

def joue():

     '''()->None
     Cette fonction joue le jeu'''
    
     p=prepare_paquet()
     melange_paquet(p)
     tmp=donne_cartes(p)
     donneur=tmp[0]
     humain=tmp[1]

     donneur=elimine_paires(donneur)
     humain=elimine_paires(humain)
     print("Bonjour. Je m'appelle Robot et je distribue les cartes.")
     print("Votre main est:")
     affiche_cartes(humain)
     print("Ne vous inquiétez pas, je ne peux pas voir vos cartes ni leur ordre.")
     print("Maintenant défaussez toutes les paires de votre main. Je vais le faire moi aussi.")
     attend_le_joueur()
    
     tour = 0
     while (tour <= 1 and tour >= 0):
         if len(humain) == 0:
             print("J'ai fini avec toutes mes cartes")
             print("L'humain, vous avez gagné")
             break
         elif len(donneur) == 0:
             print("J'ai fini avec toutes mes cartes")
             print("Le robot à gagné")
             break
         else:
             if tour == 0:
                 print("C'est à votre tour")
                 print("Vos cartes sont:")
                 affiche_cartes(humain)
                 v = len(donneur)
                 print("J'ai", n, "carte(s). Si 1 est ma première carte" + str(v), "la position de ma dernière carte, quelle carte voudriez-vous dans votre paquet?")
                 alt = entrez_position_valide(v)
                 if alt == 1:
                     print("voici la première carte que vous avez demandé")
                 else:
                     print("vous m'avez demandé cette n-ième carte:"+str(alt)+".")
                 print("voila" +donneur[int(alt)-1])
                 print(donneur[int(alt)-1], "votre nouvelle main est:")
                 humain.append(donneur[int(alt)-1])
                 donneur.remove(donneur[int(alt)-1])
                 affiche_cartes(humain)
                 print("Après avoir enlever les paires, votre main est:")
                 humain = elimine_paires(humain)
                 affiche_cartes(humain)
                 tour = 1
                 attend_le_joueur()
                 if tour == 1:
                     print("mon tour")
                     c = len(humain)
                     alt = random. randit(1, c)
                     if alt == 1:
                         print('Jai pris la première carte')
                     else:
                         print('Jai pris votre' + str(alt) + 'carte')
                         donneur.append(humain[int(alt) - 1])
                         humain.remove(humain[int(alt) - 1])
                         donneur = elimine_paires(donneur)
                         tour = 0
                         attend_le_joueur()
joue()


Solution 1:[1]

You have to change this

def affiche_cartes(p):
    '''
    (list)-None
    Affiche les éléments de la liste p séparées par d'espaces
    '''

    for i in p:
        print(p[i], end = ' ')

To

def affiche_cartes(p):
    '''
    (list)-None
    Affiche les éléments de la liste p séparées par d'espaces
    '''

    for i in p:
        print(i, end = ' ')

Your p Variable is a list of strings and you used a for each loop, which means i is an element of p and not an index.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Alx-net