Problème condition liste

Résolu/Fermé
Antoine - 15 mars 2018 à 16:43
 Antoine - 17 mars 2018 à 17:53
Bonjour, je m'appelle Antoine, dans le cadre de mon projet ISN en terminale S, je dois réaliser un projet python. J'ai choisi de programmer un jeu de carte, le UNO, voici programme pour l'instant,

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from random import shuffle  
  
  
def initialisation(): 
    cartes=["+4","+4","invV","invV","+2V","+2V","9V","8V","8V","7V","7V","6V","4V","4V","3V","3V","2V","2V","4c","4c","invJ","invJ","+2J","+2J","9J","8J","8J","7J","7J","6J","4J","4J","3J","3J","2J","2J","stopV","stopV","9V","+4","+4","invB","6V","5V","5V","9B","8B","8B","1V","1V","0V","4B","4B","3B","stopJ","stopJ","9J","4c","4c","invR","6J","5J","5J","1J","1J","0J","9R","8R","8R","4R","4R","3R","invB","+2B","+2B","stopB","stopB","9B","7B","7B","6B","6B","5B","5B","3B","2B","2B","1B","1B","0B","invR","+2R","+2","stopR","stopR","9R","7R","7R","6R","6R","5R","5R","3R","2R","2R","1R","1R","0R"]   
    shuffle(cartes)  
    carte_joueur_1=[]  
    carte_joueur_2=[]  
    for i in range (7):   
        carte_joueur_1.append(cartes.pop())   
        carte_joueur_2.append(cartes.pop())    
    talon=[cartes.pop()]  
    return cartes,carte_joueur_1,carte_joueur_2,talon 
  
def carte_posable ():
    if carte_joueur_1[:][1]==talon[-1][1] or carte_joueur_1[:][0]==talon[-1][0]:
        carte_jouee = input("Que jouez-vous ?")
        coup_possible (carte_jouee)
        
    else:
        print("Pioche") 
        carte_joueur_1.append (cartes [-1] )
        cartes.remove(cartes [-1] )


def coup_possible (carte_jouee): 
    if carte_jouee[1]==talon[-1][1] or carte_jouee[0]==talon[-1][0]: 
        talon.append(carte_jouee) 
        carte_joueur_1.remove(carte_jouee)
       
         
        print("tu peux jouer cette carte") 
    else: 
        print("Joue une autre carte")  


     
# Distribution des cartes 
cartes,carte_joueur_1,carte_joueur_2,talon = initialisation() 
print(talon) 
print(carte_joueur_1) 

carte_posable ()


La fonction initialisation distribue les cartes aux 2 joueurs et choisit la première carte du jeu (talon) sur lequel va "s'empiler" les autres cartes.
La fonction carte_posable cherche a vérifier avant que le joueur ne joue si il va pouvoir jouer une carte (si oui, la fonction coup_possible se lance, si non, le joueur n'a pas d'autre choix que de piocher). Cependant quand je teste ce programme la condition if de carte_posable n'est jamais vérifié et le joueur pioche systématiquement une carte, je ne vois pas mon erreur sur le if. Pourriez vous m'aider ? Merci



1 réponse

Bonjour,

Il suffit de faire un print de
carte_joueur_1[:][0]
dans ta fonction pour comprendre que tes comparaisons sont incorrectes, en effet tu compares ce que vaut la 1ère carte en totalité avec ce que vaut le dernier caractère du talon, évidemment cette condition ne sera jamais vérifiée.

De plus pourquoi faire des copies de liste
carte_joueur_1[:]
pour uniquement faire une comparaison ?

Pourquoi ne comparer que la 1ère carte et non toutes les cartes du joueur avec la valeur du talon ?
0
Je pensais que [:] permettait de sélectionner toutes les valeurs de carte_joueur_1 et le [0] permettait de comparer le premier caractère de chaque valeur des cartes du joueur avec la carte du talon. Comment dois je faire ? Merci pour le temps que vous m'accordez !
0
D'accord, c'est une simple erreur de compréhension sur ce que faisait [:], en fait c'est un raccourci qui fait la même chose que
list.copy()
.

Faire des comparaisons c'est facile, sauf que tes cartes ont des formats différents, ce qui donne des cas de figures où les comparaisons vont être difficiles à faire.

Par exemple que faire si le talon vaut +4, invB ou encore +2V ?
On doit comparer quoi au juste ? Y a t-il des cartes à ne pas comparer ?
0
Hmm, d'accord, il faudrait donc pourquoi pas créer une liste de carte avec les cartes dites "normale" et une liste avec les jokers. Le talon piocherait au hasard dans la liste de cartes normales, donc pas de joker. Pour la distribution des cartes des joueurs, il faudrait réunir ses 2 listes en unes et piochait dans celle la? C'est réalisable?
0
A vrai dire, je n'ai du jouer au uno qu'une ou deux fois dans ma vie, et ça remonte à loin, je ne me rappelle plus du tout des règles, et même en regardant sur wikipédia, ça me semble pas très clair au vu du nombre de variantes existant de ce jeu.

Les jokers, ce sont les +quelque choses ?
Déjà, il y a une erreur dans tes cartes, il y a un +2 sans le R.

Ensuite, si le joueur à un joker, il peut, je suppose si c'est un +2(RVBJ) le jouer sur toutes les cartes de la même couleur ?
Si c'est un +4, il peut le jouer sur n'importe quelle couleur ou valeur de cartes ?

En revanche si le talon est un joker, comment cela se passe dans le jeu ?

Voici un prémice de ce que pourrait donner sans la gestion des jokers.

def carte_posable ():
    cartes_jouables = []
    if talon[0] == '+':
        if talon[-1] == "4": #+2, +4
            # Voir ce qu'il faut faire
            pass
        else: # +2(JVBR)
            # Voir ce qu'il faut faire
            pass
    else:
        valeur, couleur = talon[-1][0:-1], talon[-1][-1]
        # Voir ce qu'il faut faire pour les jokers des cartes joueurs
        
        # Cartes standards
        for carte in carte_joueur_1:
            if carte[0:-1] == valeur or carte[-1] == couleur:
                cartes_jouables.append(carte)
    print("Cartes jouables :", cartes_jouables)
0
Merci beaucoup cependant je ne comprends pas cette ligne de code
 valeur, couleur = talon[-1][0:-1], talon[-1][-1]
0