moins de lignes, moins de bugs.
- WCode:
1
2
3 def battre(self): random.shuffle(self.cartes)
Version imprimable
moins de lignes, moins de bugs.
- WCode:
1
2
3 def battre(self): random.shuffle(self.cartes)
Je ne sais pas si tu as appris les variables statiques de classes... mais ce serait pas mal utile ici...
Ce qui te permet en plus de créer un constructeur plus souple (accessoirement je ne comprends pas pourquoi tu veux absolument faire commencer la plus petite valeur à 2...)Code:
1
2
3
4
5
6
7
8
9
10
11 class JeuDeCartes : # Variables statiques __number=( "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "valet", "dame", "roi", "as", ) __color=( "trèfle", "carreau", "coeur", "pique", ) def nom_carte(self,x,y): print('{} de {}'.format(JeuDeCarte.__number[x],JeuDeCarte.__color[y]))
Qu'on peut d'ailleurs écrire en plus simpleCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 class JeuDeCartes : # Variables statiques __number=( "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "valet", "dame", "roi", "as", ) __color=( "trèfle", "carreau", "coeur", "pique", ) # Constructeur def __init__(self): self.cartes = [] for y in range(len(JeuDeCarte.__color)): for x in range(len(JeuDeCarte.__number)): self.cartes.append( (x, y) )
Et enfin tu remarqueras que la méthode "nom_carte" n'appartient pas à une instance de joueur en particulier (self n'y est pas utilisé). Donc tu peux la transformer en méthode statiqueCode:
1
2
3 # Constructeur def __init__(self): self.cartes=[(x, y) for x in range(len(JeuDeCarte.__number)) for y in range(len(JeuDeCarte.__color))]
Pour l'utiliser, te suffira de l'appeler de cette façon: JeuDeCarte.nom_carte(...). Attention toutefois, le sujet précise que la fonction qui affiche le nom de la carte doit recevoir une carte (un tuple) et non 2 valeurs séparées...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 class JeuDeCartes : # Variables statiques __number=( "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "valet", "dame", "roi", "as", ) __color=( "trèfle", "carreau", "coeur", "pique", ) @staticmethod def nom_carte(x,y): print('{} de {}'.format(JeuDeCarte.__number[x],JeuDeCarte.__color[y]))
Salut, voici ton code modifié, avec quelques commentaires.
PS : entre le temps ou j'ai commencé a éditer le sujet et ou j'ai posté , j'ai vu un random.shuffle() que je ne connaissais pas. merci !Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 #on importe le module random import random class JeuDeCartes : # Constructeur def __init__(self): self.cartes = [] for y in range(4): for x in range(2, 15): self.cartes.append( (x, y) ) def nom_carte(self,x,y): number = ['Un','Deux','Trois','Quatre','Cinq','Six','Sept','Huit','Neuf','Dix','Valet','Dame','Roi'] #il y avait un caractere bizarre devant Pique color = ['Coeur','Carreau','Trefle','Pique'] print('{} de {}'.format(number[x],color[y])) def battre(self): used = [] cartesmel = [] #on cree une botte qui est une copie du jeu botte = self.cartes[:] #on tire les cartes tant qu'il en reste dans la botte en evitant de faire des tours pour rien while len(botte) > 0: #on fait un choix au hasard dans la nouvelle liste carte = random.choice(botte) botte.remove(carte) #pourqoi deux listes identiques? cartesmel.append(carte) used.append(carte) #on retourne une liste nouvellement initialisee return cartesmel #Programme Principal jdc1 = JeuDeCartes() print jdc1.battre()
Salut
As-tu remarqué qu'avec des valeurs de cartes qui vont de 2 à 14... et un tableau de noms dont les noms sont en position de 0 à 12 ça risque de ne pas coller ??? C'est quand-même pas pour rien que j'ai demandé 2 fois à malabar pourquoi il tenait absolument à faire commencer son tableau à 2 (accessoirement, au jeu de la bataille, l'as est la plus forte carte comme le montre l'exemple qui donne à l'as la valeur 14)
Mmmoui. Mais ta méthode ne mélange pas le jeu initial. Elle ne fait que renvoyer un autre jeu...
Et connais-tu copy.copy et copy.deepcopy ? Pratique pour créer des copies d'objets. Parce que ta méthode botte = self.cartes[:] ne fait qu'une copie superficielle. c.a.d. que si ton tableau contient des objets complexes, botte ne contiendra que l'adresse de ces objets. Donc toute modification dans carte se répercutera dans botte
Exemple
Code:
1
2
3
4
5
6
7
8
9
10 >>> class toto: pass >>> >>> a=[toto(), toto()] >>> b=a[:] >>> a [<__main__.toto instance at 0x01214F80>, <__main__.toto instance at 0x01214F58>] >>> b [<__main__.toto instance at 0x01214F80>, <__main__.toto instance at 0x01214F58>]
L'énoncé disant:Citation:
Envoyé par Sve@r
Si on veut que:Citation:
Pour chacune d'elles, il faut
en effet mémoriser séparément un nombre entier indiquant la valeur
(2, 3, 4, ..., 11, 12, 13, 14, les 4 dernières valeurs étant celles des
valet, dame, roi et as), et un autre nombre entier pour indiquer la
couleur de la carte (c'est-à-dire 3, 2, 1, 0 pour Coeur, Carreau, Trèfle,
Pique).
fonctionne, il pourra suffire de définir __number comme:Code:
1
2
3 @staticmethod def nom_carte(x,y): print('{} de {}'.format(JeuDeCarte.__number[x],JeuDeCarte.__color[y]))
- WCode:
1
2
3
4 __number=(None, None, "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "valet", "dame", "roi", "as", )
J'avais noté. Mais j'ai considéré qu'il ne s'agissait que d'un modèle explicatif et non à suivre au pied de la lettre et opté pour la simplicité.
Mouais. Ca marche. Ou alors on peut demander number[x-2]. Mais ça me met quand-même mal à l'aise...
C'est vrai que quand j'ai créé l'exemple, j'avais d'abord essayé avec des tuples ce qui ne démontrait rien et ai dû créer un objet pour avoir une démo visuelle.
Mais c'était surtout pour montrer à utopman qui peut-être ne connait pas cet outil pratique et non à malabar. De toute façon dans la solution de l'exercice, il n'est pas besoin de copier le tableau...
En fait, "l'enseignant" peut ici jouer un peu le rôle "d'architecte".
Les exercices peuvent être le support d'un cours et être aussi conçus pour réaliser un petit projet "par petits bouts". Les élèves ne sont peut être pas encore assez calés pour qu'on leur raconte cela mais ils seront peut être ravis de découvrir la construction au fil des cours.
Une des raisons pour ranger ainsi est que çà pourrait simplifier la récupération du "poids" de chaque cartes dans un jeu de bataille contre l'ordi.Citation:
Mouais. Ca marche. Ou alors on peut demander number[x-2]. Mais ça me met quand-même mal à l'aise...
Mais je prête à "l'enseignant" des intentions qu'il n'a peut être pas.
- W