IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Exercice les class (POO)


Sujet :

Python

  1. #21
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 759
    Par défaut
    moins de lignes, moins de bugs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def battre(self):
         random.shuffle(self.cartes)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  2. #22
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par malabar93 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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']
    		color = ['Coeur','Carreau','Trefle','¨Pique']
    		print('{} de {}'.format(number[x],color[y]))
    Je ne sais pas si tu as appris les variables statiques de classes... mais ce serait pas mal utile ici...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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]))
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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) )
    Qu'on peut d'ailleurs écrire en plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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))]
    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 statique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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]))
    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...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #23
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 140
    Par défaut Bugs !
    Salut, voici ton code modifié, avec quelques commentaires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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()
    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 !

  4. #24
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par utopman Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    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]))
    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)

    Citation Envoyé par utopman Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        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
    Mmmoui. Mais ta méthode ne mélange pas le jeu initial. Elle ne fait que renvoyer un autre jeu...

    Citation Envoyé par utopman Voir le message
    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 !
    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 python : Sélectionner tout - Visualiser dans une fenêtre à part
    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>]
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #25
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 759
    Par défaut
    Citation Envoyé par Sve@r
    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 ???
    L'énoncé disant:

    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).
    Si on veut que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            @staticmethod
    	def nom_carte(x,y):
    		print('{} de {}'.format(JeuDeCarte.__number[x],JeuDeCarte.__color[y]))
    fonctionne, il pourra suffire de définir __number comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	__number=(None, None,
    		"deux", "trois", "quatre", "cinq", "six", "sept",
    		"huit", "neuf", "dix", "valet", "dame", "roi", "as",
    	)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #26
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 759
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    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
    Remarque intéressante mais le prof a pris la précaution de représenter les cartes sous forme de tuple. Sans doute pour parler de tout cela plus tard.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #27
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    L'énoncé disant:
    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).
    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é.

    Citation Envoyé par wiztricks Voir le message
    Si on veut que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            @staticmethod
    	def nom_carte(x,y):
    		print('{} de {}'.format(JeuDeCarte.__number[x],JeuDeCarte.__color[y]))
    fonctionne, il pourra suffire de définir __number comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	__number=(None, None,
    		"deux", "trois", "quatre", "cinq", "six", "sept",
    		"huit", "neuf", "dix", "valet", "dame", "roi", "as",
    	)
    Mouais. Ca marche. Ou alors on peut demander number[x-2]. Mais ça me met quand-même mal à l'aise...

    Citation Envoyé par wiztricks Voir le message
    Remarque intéressante mais le prof a pris la précaution de représenter les cartes sous forme de tuple. Sans doute pour parler de tout cela plus tard.
    - W
    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...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #28
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 759
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    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é.
    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.

    Mouais. Ca marche. Ou alors on peut demander number[x-2]. Mais ça me met quand-même mal à l'aise...
    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.

    Mais je prête à "l'enseignant" des intentions qu'il n'a peut être pas.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Exercice sur les classes et POO
    Par Lvmzoo1 dans le forum C++
    Réponses: 2
    Dernier message: 14/11/2014, 01h18
  2. [POO] Besoin de tutorat sur les classes
    Par misterniark dans le forum Langage
    Réponses: 11
    Dernier message: 20/04/2006, 13h48
  3. [POO] Pourquoi utiliser les classes ?
    Par GregPeck dans le forum Langage
    Réponses: 7
    Dernier message: 16/12/2005, 15h18
  4. [POO] projet ->soutirer les classes objets
    Par .:dev:. dans le forum C++
    Réponses: 10
    Dernier message: 14/06/2005, 23h05
  5. Réponses: 3
    Dernier message: 23/08/2004, 17h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo