Boucle for dans une liste

Fermé
aharon - 11 mai 2021 à 09:41
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 - 11 mai 2021 à 12:07
Bonjour,

J'essaie actuellement de recréer un jeu de belote sur python mais je galère sur une annonce.
Concrètement, j'ai un deck de 8 cartes qui est une liste =['V de pique‘, 'D de coeur',....] et je cherche à trouver s'il y'a un 'V' (de n'importe quelle couleur) et deux 'A'. Je me suis donc dit que j'allais faire une boucle for sur les couleurs (liste couleur=['pique','coeur','trefle','carreau'] et mettre un if 'V' (if 'A') in deck

Mais ça ne marche pas et je ne sais pas comment faire une boucle sur un élement précis d'une liste (ici la couleur)...

Est-ce que vous avez une idée?

Cordialement
Aharon

3 réponses

yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 Ambassadeur 1 557
11 mai 2021 à 10:32
bonjour,
peux-tu montrer ton code?
merci de tenir compte de ceci: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

je pense que ce n'est pas une bonne idée de représenter une carte par un texte tel que "V de pique", il est préférable de la représenter via ces deux attributes, valeur et couleur.

je me demande d'où te vient l'idée de faire une boucle sur les couleurs, plutôt qu'une boucle sur les cartes du deck.
0
Bonjour. Merci de votre réponse et voici mon code:

couleurs=["carreau","coeur","trefle","pique"]
valeurs=['7',"8","9","10","V","D","R","A"]
points=[0,0,0,10,2,3,4,11]
points_atout=[0,0,14,10,20,3,4,11]
contrats=[80,90,100,110,120,130,140,150,160,170,180,"capot"]


class Carte:

def __init__(self,valeur,couleur):
self.couleur = couleur
self.valeur = valeur

def __eq__(self,other):
return self.couleur == other.couleur and self.valeur == other.valeur
def __repr__(self):
return f'{self.valeur} de {self.couleur}'




class Coinche:

def __init__(self):

self.deck = [Carte(valeur,couleur) for couleur in couleurs for valeur in valeurs]


def distribution(self):
melange=random.sample(self.deck,len(self.deck))
#print(melange)

self.deck1=sum([melange[i:i+4] for i in range(0,len(melange),16)],[])
print("Nord:",self.deck1)
self.deck2=sum([melange[i:i+4] for i in range(4,len(melange),16)],[])
#print("Est:",self.deck2)
self.deck3=sum([melange[i:i+4] for i in range(8,len(melange),16)],[])
#print("Sud:",self.deck3)
self.deck4=sum([melange[i:i+4] for i in range(12,len(melange),16)],[])
#print("Ouest:",self.deck4)
return self.deck1,self.deck2,self.deck3,self.deck4


def prem(self):
deck_nord=self.deck1
#print(deck_nord)
encheres=0
cnt=0
if 'V de pique' or 'V de trefle' or 'V de coeur' or 'V de carreau' in deck_nord:
#if Carte(valeur,couleur) in deck_nord:
#if ('V de',f'{self.couleur}') in deck_nord:
#for cartes in deck_nord
for coul in couleurs:
print(f'A de {coul}')
if f'A de {coul}' in deck_nord:
cnt+=1
if cnt>=2:
encheres+=80
print("Nord annonce:",[encheres],"de", f'{Cartes(couleur)}')
else:
print("Nord passe",encheres)

Je dois surement très mal expliquer mon problème mais j'arrive à faire une boucle sur une liste en utilisant:
for couleur in couleurs:
if f'V de {couleur} in l:

et ça semble marcher mais je sais pas si c'est optimisé
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
11 mai 2021 à 11:57
un exemple pour compter les as et les valets:
mondeck=[Carte("V","P"),Carte("V","C"),Carte("V","PK"),Carte("V","T"),
         Carte("A","P"),Carte("A","P"),Carte("A","P"),Carte("A","P")]
cntV=0
cntA=0
for carte in mondeck:
    if carte.valeur=="A":
        cntA += 1
    elif carte.valeur=="V":
        cntV += 1
print (mondeck)
print(cntA,cntV)
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557 > yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024
11 mai 2021 à 12:07
ou bien:
def cntAV(undeck):
    cntV=0
    cntA=0
    for carte in undeck:
        if carte.valeur=="A":
            cntA += 1
        elif carte.valeur=="V":
            cntV += 1
    return cntA,cntV
deckun,deckdeux,decktrois,deckquatre=Coinche().distribution()
print (deckun)
print ("nombre d'as et de valets:",cntAV(deckun))
0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
11 mai 2021 à 11:35
Bonjour,

Tu n'as pas tenu compte des balises de code:

https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Visuellement, ça doit ressembler à ceci (avec la coloration syntaxique) :

def test():
    print('test')

test()
0