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 :

TP du Zcasino


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Par défaut TP du Zcasino
    Bonsoir à tous,

    alors je continue à bosser! ( Quelle énorme satisfaction pour moi ) et je me suis attaqué ce soir au Tp du Zcasino, suite au lien fournis par Stalacta ( je te remercie encore d'ailleurs ). Je suis arrivé au bout de ce premier TP sans réelles embuches, la partie m'ayant posée le plus de soucis fut la boucle me permettant de continuer ou pas la partie. Je suis donc très satisfait et voilà qui ne fera que consolider un peu plus ma détermination afin d'approfondir davantage mon apprentissage de la programmation.

    Trève de bavardage, je voulais partager avec vous ce TP d'abord parce que je suis content d'être arrivé au bout puis surtout parce que je souhaitais avoir vos avis sur ce qui pourrait être perfectible à travers ces quelques lignes de codes :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    ## TP-1 Zcasino ##
    ### Le joueur mise un numéro entre 0 et 49 ###
    #### Il dépose la mise souhaitée ####
    ##### Les numéros pairs sont noirs, les impairs rouges #####
    ###### Le croupier fait tourner la roulette et la bille s'arrête sur ######
    ###### le numéro gagnant. ######
    ####### Si le numéro est le même que celui du joueur alors : #######
    # Le joueur remporte sa mise + 3 fois sa mise #
    ## Si la couleur est la même alors : ##
    ### Le joueur remporte sa mise + 50% de sa mise. ###
    #### Si le numéro et la couleur diffèrent alors : ####
    ##### Le joueur perd sa mise. #####
    import random
     
    cash = 100
    print ("Votre montant de départ est de", cash, '$')
     
    continuer_partie = True
    while continuer_partie:
    # Le joueur choisi le numéro sur lequel il effectuera une mise #
     
        numero = input('Choisissez un numéro situé entre 0 et 49:')
        while int(numero) <= 0 or int(numero) >= 50:
            numero = input('Choisissez un numéro situé entre 0 et 49:')
        if int(numero) % 2 == 0:
            print ('Vous misez sur le', numero, 'noir')
        else:
            print ('Vous misez sur le', numero, 'rouge')
     
     
    # Le joueur détermine maintenant sa mise #
     
        mise_joueur = input ('Quelle sommes souhaitez-vous miser ?')
        while int(mise_joueur) > int(cash):
            print('Fond non disponible')
            mise_joueur = input('Quelle sommes souhaitez-vous miser ?')
        else :
            print('mise de', mise_joueur, '$')
     
    # Les jeux sont faits, rien ne va plus #
     
        print('Les jeux sont faits, rien ne va plus!')
     
    # Le croupier fait tourner la roulette et le résultat est annoncé #
     
        num_gagnant = random.randint(1,49)
        if num_gagnant % 2 == 0:
            print('Le numéro gagnant est', num_gagnant, 'noir')
        else:
            print('Le numéro gagnant est', num_gagnant, 'rouge')
     
    # Le croupier compare maintenant le numéro gagnant avec celui du joueur #
     
    # Les numéros sont identiques #
     
        if int(numero) == int(num_gagnant):
            cash = cash + (3 * int(mise_joueur))
            print('Bravo! Vous remportez 3 fois votre mise')
            print ('Votre capital est maintenant de', cash, '$')
     
    # Les numéros sont de couleurs noirs #
     
        elif int(numero) % 2 == 0 and int(num_gagnant) % 2 == 0:
            cash = int(cash) + (0.5 * int(mise_joueur))
            print('Pas mal! Vous remportez 50% de votre mise')
            print('Votre capital est maintenant de', cash, '$')
     
    # Les numéros sont de couleurs rouges #
     
        elif int(numero) % 2 != 0 and int(num_gagnant) % 2 != 0:
            cash = int(cash) + (0.5 * int(mise_joueur))
            print('Pas mal! Vous remportez 50% de votre mise')
            print('Votre capital est maintenant de', cash, '$')
     
    # Les numéros sont tout à fait différents #
     
        else:
            cash = int(cash) - int(mise_joueur)
            print('Vous venez de perdre votre mise')
            print('Votre capital est maintenant de', cash, '$')
     
    # Le joueur n'a plus d'argent #
     
        if cash <= 0:
            print( 'Vous voilà sans un sous, prière de quitter la table SVP')
            continuer_partie = False
     
    # Le joueur désire-t-il continuer la partie #
     
        quitter = input('Souhaitez-vous quitter la table de jeu? (O/N)')
        if quitter == 'O' or quitter == 'o':
            print('À bientot!')
            continuer = False
            break
    Merci encore pour votre aide!

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur en formation
    Inscrit en
    Juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 300
    Par défaut
    De rien pour le tuto .C'est très bien, juste un tout petit truc sans importance sur le coup du arrêter de jouer : on peut s'affranchir de la variable continuer_partie grâce au mot clef break. On met une boucle infinie ("while True") et sur la fin avec le "if quitter == 'O' or quitter == 'o':", on met simplement break. C'est un tout petit détail de rien du tout.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Par défaut
    J'en prends bonne note! Merci encore stalacta. Pour la suite j'attaque le second TP, il s'agit cette fois-ci d'un pendu. Pour avoir commencé à réfléchir sur le sujet celui la me semble tout de même plus complexe que le précédent mais on va y arriver!

    À la moindre question je viendrais cogner par ici

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Par défaut
    Bonsoir à tous,

    comme je le pensais, un nouveau TP me donne pas mal de fil à retordre :

    Un point en particulier me fait défaut dans les consignes de jeu :
    Si la lettre figure dans le mot, l'ordinateur affiche le mot avec les lettres déjà trouvées.
    Avec un peu de recule je me dis que j'ai peut être pris la mauvaise direction avec mon code et j'aurais besoin de certains éclaircissement le concernant. Pour le moment voilà ou j'en suis :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    import random
     
    # Fonctions Hide #
     
    def hide_word(mot):
        for i in range(len(mot)):
            print('*'),
     
     
    # Variables #
     
    tentatives = 0
     
     
    # Définition de la liste des mots #
     
    liste_mot = ['insecte', 'phare', 'jambon', 'hiboux', 'drapeaux', 'vapeur', 'zoo', 'clavier', 'ecole', 'souris', 'code']
     
    # Définition de listes dans lesquelles sera stocké le nom du joueur et son score #
     
    joueurs = []
    score = []
     
    # L'ordinateur invite le joueur à entrer son nom #
     
    nom_joueur = input('Entrez votre nom:')
    print('Bienvenue', nom_joueur)
    print ('---------------------')
    nom_joueur.append(joueurs)
     
     
    continuer_partie = True
    while continuer_partie:
     
    # L'ordinateur sélectionne un mot au hasard dans la liste #
     
        mot_mystere = random.choice(liste_mot)
        print ('Le mot à découvrir:')
        print ('---------------------')
     
    # Appel de la fonction hide_word #
     
        mot_mystere = hide_word(mot_mystere)
        print('----------------------')
     
    # L'ordinateur invite maintenant le joueur à tenter sa chance en proposant une lettre #
        while tentatives <= 8:
            prop_joueur = input('Quelle lettre devrais-je tester ?:')
            tentatives = tentatives + 1
            if prop_joueur > 1:
                print('Une lettre à la fois S.V.P')
                prop_joueur = input('Quelle lettre devrais-je tester ?:')
     
     
    # Si la proposition du joueur se trouve dans le mot #
     
     
     
     
     
     
     
     
     
     
    # Le joueur désire-t-il quitter la partie ? #
     
        quitter = input('Souhaitez-vous quitter la partie ?(O/N)')
        if quitter == 'O' or quitter == 'o':
            print ('A bientot')
            continuer = False
            break
    ps : Actuellement j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Traceback (most recent call last):
      File "/Users/patricemaillot/Desktop/python/pendu.py", line 52, in <module>
        if prop_joueur > 1:
    TypeError: unorderable types: str() > int()
    le fait est que je comprends l'erreur mais ne voit tout simplement pas comment y remédier :S mettre tout ceci de côté pour ce soir ne me fera sans doute pas de mal.

    Merci encore pour votre aide!

    edit 1: J'ai compris mon erreur du coup en remplaçant :

    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if len(prop_joueur) > 1
    les choses semblent fonctionner à ce niveau. Il suffisait d'aller prendre un peu l'air histoire de se recentrer un peu Bon cette fois-ci, pas de farce, je vais me coucher!

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Ca tombe bien, j'ai justement aidé récemment qqun à programmer un pendu et j'ai retrouvé le code dans ma corbeille.

    Citation Envoyé par suppadrakn Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def hide_word(mot):
        for i in range(len(mot)):
            print('*'),
    Pas super tiptop. C'est bien de penser aux fonctions (surtout que c'est la seule) mais n'oublie pas que le jeu doit afficher les lettres déjà découvertes. Donc déjà peut-être que tu devrais penser à mémoriser les essais..

    Citation Envoyé par suppadrakn Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # L'ordinateur invite maintenant le joueur à tenter sa chance en proposant une lettre #
        while tentatives <= 8:
            prop_joueur = input('Quelle lettre devrais-je tester ?:')
            tentatives = tentatives + 1
            if prop_joueur > 1:
                print('Une lettre à la fois S.V.P')
                prop_joueur = input('Quelle lettre devrais-je tester ?:')
    Ok, donc là tu tentes un contrôle de la saisie. Et si le joueur, au second essai, rentre encore une fois plusieurs lettres ???
    Faire un contrôle se traduit généralement par une boucle infinie. Tant que le joueur rentre un truc erroné, on reste dans la boucle et on en sort quand le truc est correct...

    Citation Envoyé par suppadrakn Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    # Si la proposition du joueur se trouve dans le mot #
    Tu devrais penser à "if lettre in mot"...

    Mon impression est que tu est parti bille en tête à programmer sans penser suffisemment à ton algo.

    Je te donne les commentaires de mon code en espérant qu'ils t'aideront à trouver ton alog...
    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
    16
    17
    18
    19
    def pendu(mot, hard=False):		# Comme tu vois, j'ai posé le jeu dans une fonction. Le paramètre "hard" quand il est à False refuse les lettres déjà proposées. Quand il est à True, il les autorise
    	# Boucle de jeu
    	while ...:
    		# Affichage des lettres déjà trouvées du mot
    		...
     
    		# Si le mot est trouvé
    		...
     
    		# Choix du joueur
    		...
     
    		# La lettre choisie est mémorisée si elle ne l'a pas déjà été
    		...
     
    		# Calcul chances restantes
    		...
    	# while
    # pendu()
    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]

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Par défaut
    Intéressant...Par contre à première vue je ne vois pas comment faire pour 'Mémoriser' une lettre comme tu dis.

    Stocker la lettre dans une liste vide au préalable? Puis vérifier à chaque nouvelle proposition si cette lettre est présente dans la liste?

    Puis juste histoire de pas être trop mélangé, ce que tu fournis la n'est qu'une partie du jeu n'est-ce pas?


    Mon impression est que tu est parti bille en tête à programmer sans penser suffisemment à ton algo.


    Je te donne les commentaires de mon code en espérant qu'ils t'aideront à trouver ton alog...
    Mhhh oui et non à mon sens mais si tu as cette impression c'est que je devrais certainement reprendre cette étape Merci à toi!

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par suppadrakn Voir le message
    Intéressant...Par contre à première vue je ne vois pas comment faire pour 'Mémoriser' une lettre comme tu dis.

    Stocker la lettre dans une liste vide au préalable? Puis vérifier à chaque nouvelle proposition si cette lettre est présente dans la liste?
    On peut faire ça effectivement...
    puis
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    if lettre not in mem: mem.append(lettre)

    Ou plus simplement utiliser une chaine au lieu d'une liste car, gros avantage du tout objet, la chaine possède le même outil de recherche "in" que la liste...
    puis
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    if lettre not in mem: mem+=lettre

    Citation Envoyé par suppadrakn Voir le message
    Puis juste histoire de pas être trop mélangé, ce que tu fournis la n'est qu'une partie du jeu n'est-ce pas?
    C'est le jeu complet. Quand la boucle principale se termine, soit le joueur a trouvé le mot et a gagné, soit il n'a pas trouvé et a perdu...
    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. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Par défaut
    Ça progresse tranquillement et il me semble même apercevoir une lueur au loin il y à cependant une question qui reste en suspend. Comment faire en sorte que l'ordinateur place la lettre au bon endroit de façon à ce que je découvre mon mot.

    Je m'explique, j'ai crée une liste ( oui je sais pas pourquoi mais j'aime ça les listes ) que j'ai nommé prop_ok. A chaque fois qu'une proposition est correcte de la part du joueur, donc a chaque fois que prop_joueur in mot_mystere je stocke prop_joueur dans ma liste prop_ok puis je print cette liste.

    Bien évidement lorsque je print ma liste je n'obtient pas l'ordre adéqua, mais bien une liste avec laquelle je pourrais éventuellement composer afin de trouver mon mot mystere. Alors comment remédier à cela.


    Suis-je en train de m'embourber? Devrais-je reprendre mon code dans son intégralité? Ou tous les chemins mènent au bonhomme pendu?

    edit : Après avoir effectué quelques tests je suis effectivement en train de m'embourber dans une méthode peu orthodoxe qui ne m'apporte qu'une couche de problème supplémentaire au fur et à mesure de mon avance. Je vais donc reprendre les choses de zéro et revenir tranquillement mais surement à mon pendu.

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par suppadrakn Voir le message
    Bien évidement lorsque je print ma liste je n'obtient pas l'ordre adéqua, mais bien une liste avec laquelle je pourrais éventuellement composer afin de trouver mon mot mystere. Alors comment remédier à cela.
    Tu boucles sur chaque lettre du mot. Si la lettre est dans prop_ok alors tu l'affiches sinon tu affiches autre chose. C'est ce que je fais dans "# Affichage des lettres déjà trouvées du mot"
    Accessoirement comme tu dois vérifier que la lettre proposée par le joueur ne l'a pas déjà été (enfin ça c'est pas obligatoire mais c'est souvent le cas), la liste "prop_ok" ne doit pas contenir que les propositions "ok" mais toutes les propositions.

    Et une liste ça marche mais c'est comme ouvrir une noix avec une presse hydraulique => c'est surdosé.

    Citation Envoyé par suppadrakn Voir le message
    Après avoir effectué quelques tests je suis effectivement en train de m'embourber dans une méthode peu orthodoxe qui ne m'apporte qu'une couche de problème supplémentaire au fur et à mesure de mon avance. Je vais donc reprendre les choses de zéro et revenir tranquillement mais surement à mon pendu.
    No soucy. Tu verras qu'au final tu retomberas sur mon code...
    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]

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Par défaut
    Vous savez sans doute ce que cela veut dire. Comme prévu j'ai repris mon code de zéro en repassant par l'étape du papier crayon (fort bénéfique en effet) mais le déclic c'est surtout fait en jouant quelques partie de pendu sur la toile. Mon jeu fonctionne, il me reste la notion de score que je souhaite pouvoir intégrer par le biais des listes toujours. En créant une liste score = [] à laquelle j'ajoute, lorsque le mot est trouvé les points obtenus coups.append(score) puis en affichant sum(score). Ça ne fonctionne pas pour le moment mais je n'en suis pas loin, j'en suis sur!

    Comme toujours j'aimerais avoir vos avis sur mon code, moins bien commenté que le précédent pour l'occasion mais il reste claire je pense! Merci encore!

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    import random
     
    # Message de bienvenue #
    print('Bienvenue au jeu du pendu!')
     
    # Qui es-tu ? #
     
    joueur = input('Qui allons nous pendre par les pieds ?')
     
    continuer_partie = True
    while continuer_partie == True:
     
    # Variables #
     
        mots = ['zombie']
        mot_cache = ""
        prop = ""
        coups = 10
        score = [0]
     
        mot_mystere = random.choice(mots) # Tirage aléatoire dans la liste de mots #
     
        print ('Votre score est de', sum(score),'pts')
     
        print('Nous cherchons un mot de',len(mot_mystere), 'lettres') # nbrs de lettres à trouver #
        for i in range(len(mot_mystere)):
            print('*'), # Afficher le mot en mode caché #
     
        while (mot_cache != mot_mystere):
            prop += input("Proposer une lettre:") # Le joueur propose une lettre tant que le mot n'est pas trouvé #
            coups = coups - 1
     
            mot_cache = ""
            for i in mot_mystere: # on prend le problème dans l'autre sens #
                if (i in prop): # Si i dans prop #
                    mot_cache += i # alors on ajoute ce caractére à mot_cache #
                else:
                    mot_cache += '*' # Dans le cas contraire on affiche un * #
     
     
            print(mot_cache)
     
            if mot_cache == mot_mystere: 
                print ('Bravo vous vous en tirez pour cette fois-ci')
                print ('vous marquez',coups,'point(s)')
     
     
            if coups == 0:
                print('Stop on arrete, vous avez le visage tout rouge')
                print('meilleur chance la prochaine fois!')
                break 
     
        quitter = input('Voulez-vous quitter la partie ? (O/N)')
        if quitter == 'O' or quitter == 'o':
            print('A bientot')
            continuer = False
            break

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    Billets dans le blog
    1
    Par défaut
    Ok, ça fonctionne. En fait, il y a très peu de commentaires. Juste que tu peux éviter l'affichage initial si tu fais l'affichage du mot caché directement au début de la boucle. Et si le mot est trouvé, alors un petit break afin d'éviter de demander une nouvelle lettre. Ensuite peut-être afficher les chances restantes. Et peut-être aussi refuser les lettres déjà proposées. Bref que du détail quoi.

    A titre d'info, voici le mien

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    # Jeu de pendu
    def pendu(mot, hard=False):
    	chance=5
    	mem=""
    	while True:
    		# Affichage du mot
    		affich="".join(l if l in mem else "*" for l in mot)
    		print(affich)
     
    		# Si le mot est trouvé
    		if affich == mot:
    			print("Vous avez gagné")
    			break
    		# if
     
    		# Choix du joueur
    		while True:
    			l=raw_input("Entrez une lettre (%d chances restantes): " % chance)[0]
    			if l not in mem or hard: break
    			print("Lettre déjà saisie - Une autre")
    		# while
     
    		# La lettre choisie est mémorisée
    		if l not in mem: mem+=l
     
    		# Calcul chances restantes
    		if l not in mot:
    			chance-=1
    			if chance == 0:
    				print("Perdu, le mot était %s" % mot)
    				break
    			# if
    		# if
    	# while
    # pendu()

    Ensuite suffit d'appeler la fonction en lui passnt le mot à trouver. Tu devrais essayer de penser aussi aux fonctions car ça rend un code plus modulable/évolutif...
    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]

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ensuite peut-être afficher les chances restantes. Et peut-être aussi refuser les lettres déjà proposées. Bref que du détail quoi.



    Ensuite suffit d'appeler la fonction en lui passant le mot à trouver. Tu devrais essayer de penser aussi aux fonctions car ça rend un code plus modulable/évolutif...

    Oui tout à fait! Je penserais également à peaufiner mon code et rajouter les éléments cités plus haut. Pour ce qui est des fonctions, la encore je comprends parfaitement et je tâcherais d'y attacher une attention particulière pour la suite de mon apprentissage! Merci à toi Sve@r!

    ps : Je lisais ce matin, le guide du débutant pygame (David Clark) qui préconise avant de se lancer dans l'aventure pygame de travailler sur plusieurs programmes non graphique tel qu'un analyseur de fichier texte. Au risque de passer pour un inculte qu'est-ce qu'exactement un analyseur de fichier texte?

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par suppadrakn Voir le message
    Au risque de passer pour un inculte qu'est-ce qu'exactement un analyseur de fichier texte?
    Bah, ça peut être beaucoup de choses.
    A la base c'est un truc qui lit un texte et qui en extrait des informations. Le type d'informations demandées rend le programme plus ou moins difficile.
    Par exemple on peut demander combien de voyelles ou de consonnes (très facile). Combien de mots (un poil plus dur). On peut même demander de vérifier la grammaire. Là c'est le top du top. Faut choper les noms, les verbes, les adjectifs, avoir une grammaire interne déjà programmée... bref un truc de haut niveau.

    J'ai fait un stage Python une fois. C'était un stage de débutant et j'avais déjà 2 ans de Python donc j'étais à l'aise. Un des TP a été de prendre un texte et d'en extraire les paragraphes, le nombre de mots, de lignes.
    Moi j'avais tout fait en objet. J'avais un objet texte dans lequel j'avais mis une méthode "ligne()" donnant le nb de lignes, une méthode "mots()" donnant le nb de mots, et une méthode "paragaphe()" donnant un paragraphe sous forme d'objet texte lui-aussi. Ca veut dire qu'un paragraphe héritait des méthodes "mots()" et "lignes()". Ainsi, si je voulais le nb de mots du premier paragraphe, je demandais texte.paragraphe(1).mots(). Le prof était content et moi aussi
    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]

  14. #14
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Par défaut Nouveau projet
    Bah, ça peut être beaucoup de choses.
    A la base c'est un truc qui lit un texte et qui en extrait des informations. Le type d'informations demandées rend le programme plus ou moins difficile.
    Par exemple on peut demander combien de voyelles ou de consonnes (très facile). Combien de mots (un poil plus dur). On peut même demander de vérifier la grammaire. Là c'est le top du top. Faut choper les noms, les verbes, les adjectifs, avoir une grammaire interne déjà programmée... bref un truc de haut niveau.
    Voilà qui répond tout à fait à ma question....Pas très excitant par contre comme projet

    Je faisais la lecture à mon fils aujourd'hui après lui avoir acheté un nouveau livre avec un petit concept fort sympathique pour l'enfant. Au début du livre se trouve sur la page de gauche, une liste : Souris, bébé souris, landeau, chaise, table, télévision, carpette, lampe. Sur la page de droite une illustration représentant ces objets. Lorsqu'on tourne la page, un objet à disparu de la liste et l'enfant doit donc retrouver de quoi il s'agit.

    Je dois avouer que j'ai moi même trouvé cela amusant (ben quoi?) du coup je me suis dis, voila qui serait fort intéressant à pythonner (^^) ce soir.

    les objectifs à travers ce petit projet :

    • la manipulation des listes ( toujours )
    • travailler avec les fonctions ( tu me disais plus tôt Sve@r que cela me permettrait d'obtenir un code de meilleur qualité, je tâcherais donc de m'y atteler ).


    Un petit problème se pose néanmoins : Comment afficher une liste pour une durée t + x(s),puis ensuite effacer cet affichage après le temps impartit? J'ai essayé time.sleep avec l'import de time mais je n'arrive néanmoins pas au résultat escompté. Un petit coup de pouce?

  15. #15
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par suppadrakn Voir le message
    Un petit problème se pose néanmoins : Comment afficher une liste pour une durée t + x(s),puis ensuite effacer cet affichage après le temps impartit? J'ai essayé time.sleep avec l'import de time mais je n'arrive néanmoins pas au résultat escompté. Un petit coup de pouce?
    Là on entre dans le domaine de l'IHM. On peut le faire avec des IHM graphiques (les fenêtres, les menus, les boites de dialogues, etc). Il y en a une excellente qui est "Qt" (et PyQt pour son homologue Python) mais nécessite une installation et un apprentissage de sa façon de fonctionner. C'est laborieux mais le résultat vaut le coup.
    Sinon il y en a une autre en natif dans Python (rien à installer) qui est tkinter. De moins bonne qualité mais permet de faire des trucs basiques.
    Un exemple sur le site que j'ai donné (attention, je ne sais pas si c'est parce que je suis sous Python 2 et que l'exemple est pour Python 3 mais l'exemple mentionne "from tkinter import *" mais moi pour qu'il fonctionne j'ai dû écrire "from Tkinter import *")
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #!/usr/bin/env python 
    # -*- coding: utf-8 -*-
     
    # script de.py
    #(C) Fabrice Sincère
     
    from Tkinter import *
    import random
     
    def NouveauLance():
        nb = random.randint(1,6)
        Texte.set('Résultat -> ' + str(nb))
     
    # Création de la fenêtre principale (main window)
    Mafenetre = Tk()
     
    Mafenetre.title('Dé à 6 faces')
    Mafenetre.geometry('300x100+400+400')
     
    # Création d'un widget Button (bouton Lancer)
    BoutonLancer = Button(Mafenetre, text ='Lancer', command = NouveauLance)
    # Positionnement du widget avec la méthode pack()
    BoutonLancer.pack(side = LEFT, padx = 5, pady = 5)
     
    # Création d'un widget Button (bouton Quitter)
    BoutonQuitter = Button(Mafenetre, text ='Quitter', command = Mafenetre.destroy)
    BoutonQuitter.pack(side = LEFT, padx = 5, pady = 5)
     
    Texte = StringVar()
    NouveauLance()
     
    # Création d'un widget Label (texte 'Résultat -> x')
    LabelResultat = Label(Mafenetre, textvariable = Texte, fg ='red', bg ='white')
    LabelResultat.pack(side = LEFT, padx = 5, pady = 5)
     
    Mafenetre.mainloop()

    Sinon j'ai fait ce truc de base
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import time
     
    str="Hello"
    print str
    time.sleep(5)
    print "%s" % "".join(" " for x in str)
    Ce caractère "[A" (Esc-A) se trouve être le code de la flêche vers le haut sous Linux. Donc quand le curseur remonte d'une ligne, il va ensuite récrire son texte par dessus le "Hello" précédent qui se trouve donc effacé. Et ce texte se trouve être autant d'espaces qu'il y a de lettres dans "Hello".
    Malheureusement c'est très batard parce que ça dépend de l'OS utilisé. Et je n'ai pas réussi à reproduire cet exemple sous zindow (oui j'ai plusieurs OS dispos grâce à VirtualBox)
    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]

  16. #16
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Par défaut
    Tu ferais un bon professeur Sve@r alors suite à ton message je suis aller creuser un peu du côté de Tkinter et je pense avoir trouvé ce qu'il me faut pour mettre sur pied ce petit projet. Rendez-vous bientôt pour la suite de l'aventure donc et encore merci pour ton intérêt et pour ton aide, qui m'est sans aucun doute possible, d'une très grande utilité!

  17. #17
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Par défaut
    En lisant le tuto du SDZ concernant Tkinter je suis tombé sur ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def __init__(self, fenetre, **kwargs):
    Donc on crée ou initialise notre fenêtre mais et je m'excuse encore si la réponse à la question pourrait être évidente mais que signifie **kwargs?

    J'essaie dans un premier temps de construire ma fenêtre en explorant quelques peu les widgets et au vu de mon projet le label, entry et certainement le button seront de la partie. Voilà qui demande beaucoup plus de travail que prévu au boulot!

    Nom : rough.png
Affichages : 1658
Taille : 14,4 Ko

  18. #18
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par suppadrakn Voir le message
    Donc on crée ou initialise notre fenêtre mais et je m'excuse encore si la réponse à la question pourrait être évidente mais que signifie **kwargs?
    **kwargs, et son homologue *args, sont le nec plus ultra des paramètres de fonctions Python. Ca permet de créer une fonction avec paramètres variables.

    Exemple
    def fct(*args, **kwargs)

    Si on appelle fct(1, 2, 3), alors args sera un tuple contenant (1, 2, 3) => args[0]=1, args[1]=2 et args[2]=3. Idem si on appelle fct("toto", "titi", range(5)) => args=("toto", "titi", (0, 1, 2, 3, 4))

    Maintenant si on appelle fct(nom="toto", prenom="titi", age=18) alors kwargs sera un dictionnaire contenant {"nom" : "toto", "prenom" : "titi", "age" : 18}

    C'est super tiptop pour créer des fonctions avec une floppée de paramètres optionnels
    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
    def fct(*args, **kwargs):
        if "nom" in kwargs.keys():
            # Mémoriser kwargs["nom"]
     
        if "prenom" in kwargs.keys():
            # Mémoriser kwargs["prenom"]
     
        # Traitement des éléments et du nom et prénom éventuels
        ....
    # fct()
     
    fct(nom="toto")
    fct(prenom="titi")
    fct(nom="toto", prenom="titi")

    Rend un code plus facilement évolutif (rajout d'un paramètre de façon souple et aisée sans toucher au reste du code)
    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
    16
    17
    18
    def fct(*args, **kwargs):
        if "nom" in kwargs.keys():
            # Mémoriser kwargs["nom"]
     
        if "prenom" in kwargs.keys():
            # Mémoriser kwargs["prenom"]
     
        if "age" in kwargs.keys():
            # Mémoriser kwargs["age"]
     
        # Traitement des éléments et du nom et prénom et age éventuels
        ....
    # fct()
     
    fct(nom="toto")
    fct(prenom="titi")
    fct(nom="toto", prenom="titi")
    fct(nom="toto", prenom="titi", age=18)


    C'est l'étoile et le double étoile qui définissent le mécanisme de la chose (tuple/dico). Mais ce qui est extraordinaire, c'est que ce mécanisme peut très bien être inversé (écriture des fonctions avec paramètres classiques mais utilisaton de l'étoile et/ou de la double étoile lors de l'appel)
    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
    16
    17
    18
    19
    20
    21
    # Fonction classique, avec 2 paramètres
    def fct(nom, prenom):
        blablabla nom blablabla prenom
    # fct()
     
    # Appel de façon classique
    fct("toto", "titi")
     
    # Appel avec paramètres nommés (tend à devenir obligatoire en Python 3) - Permet de mettre les arguments dans le sens que l'on veut (et si ça devient obligatoire, obligera alors à un formalisme pas forcément négatif)
    fct(nom="toto", prenom="titi")
    fct(prenom="titi", nom="toto")
     
    # Jusque là, c'est toujours du classique. Maintenant, on entre dans le magique
     
    # Appel en utilisant un tuple
    tpl=("toto", "titi")
    fct(*tpl)
     
    # Appel en utilisant un dico
    dico={ "nom" : "toto", "prenom" : "titi" }
    fct(**dico)
    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]

  19. #19
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2011
    Messages : 65
    Par défaut
    Une nouvelle fois merci Sve@r pour les explications toujours aussi claires! Ce week-end peu de progression malheureusement et j'avoue me mélanger pas mal les pinceaux avec Tkinter.

    Avant de me lancer sur Tkinter voilà ou j'en étais :

    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
    chance = 3
    dec = 0
    liste_1 = ['cochon', 'lapin', 'cheval', 'poule', 'mouton', 'souris']
    liste_2 = []
     
     
    print(liste_1)
    time.sleep(1)
     
    select_obj = random.choice(liste_1)
    liste_2.append(select_obj)
    liste_1.remove(select_obj)
    print(liste_1)
    prop_joueur = input('Quel est l\'objet manquant?')
    if prop_joueur == select_obj:
        print('bravo!')
    else:
     
        while chance > 0:
            input('essaye encore:')
            chance = chance - 1
        if chance == 0:
            print ('Va falloir travailler ça!')
    grossièrement, je touchais grandement à mon but. Avec mes différentes lectures de tuto autour de Tkinter, j'ai fait quelques tests malheureusement peu concluant. Je n'arrive pas a intégrer mes listes, faire tourner mon random etc...En fait je suis un peu perdu ce soir.

    Je suis partis avec ce "frame" trouvé sur le SDZ, que j'ai voulu bidouiller pour atteindre mon résultat :

    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
    from tkinter import *
     
    class Interface(Frame):
     
        """Notre fenêtre principale.
        Tous les widgets sont stockés comme attributs de cette fenêtre."""
     
        def __init__(self, fenetre, **kwargs):
            Frame.__init__(self, fenetre, width=768, height=576, **kwargs)
            self.pack(fill=BOTH)
            self.nb_clic = 0
     
            # Création de nos widgets
            self.message = Label(self, text="Vous n'avez pas cliqué sur le bouton.")
            self.message.pack()
     
            self.bouton_quitter = Button(self, text="Quitter", command=self.quit)
            self.bouton_quitter.pack(side="left")
     
            self.bouton_cliquer = Button(self, text="Cliquez ici", fg="red",
                    command=self.cliquer)
            self.bouton_cliquer.pack(side="right")
     
        def cliquer(self):
            """Il y a eu un clic sur le bouton.
            
            On change la valeur du label message."""
     
            self.nb_clic += 1
            self.message["text"] = "Vous avez cliqué {} fois.".format(self.nb_clic)
    Quenéni, rien ne va plus! Peut-on insérer des évènements?(boucle while etc..) dans un label ou plus globalement dans un widget? J'imagine que oui, et surtout avec le label Entry et la fonction .get() mais je ne suis sur de rien. Il fait nuit noir, et j'avance dans le brouillard.

    edit : Je suis tombé sur ce lien fort intéressant ce soir :ici. Je terminerais la lecture demain, mais voilà qui devrait répondre à pas mal de questions et je le conseil bien sur à tout ceux qui comme moi débute avec la GUI Tkinter

  20. #20
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par suppadrakn Voir le message
    Quenéni, rien ne va plus! Peut-on insérer des évènements?(boucle while etc..) dans un label ou plus globalement dans un widget? J'imagine que oui, et surtout avec le label Entry et la fonction .get() mais je ne suis sur de rien. Il fait nuit noir, et j'avance dans le brouillard.
    Grosso-modo, la programmation GUI c'est
    une boucle principale (le Mafenetre.mainloop() de mon exemple précédent) dans laquelle les objets graphiques sont activés.
    Ensuite, certains objets graphiques produisent une action (les boutons, les menus) et d'autres servent à l'affichage. Et faut associer l'action à l'affichage. C'est ce qui se passe dans mon exemple précédent avec la fonction NouveauLance() qui va remplir l'objet Texte lequel est associé à un Label pour qu'il soit affiché ; et le bouton "BoutonLancer" qui associe son action à l'appel de la fonction "NouveauLance()".

    Tiens, un petit exemple basé sur mon premier
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #!/usr/bin/env python 
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
    import random
     
    class cJeu(Tk):
    	# Variables statiques
    	__liste=["cochon", "renard", "abeille", "poule"]
     
    	# Constructeur
    	def __init__(self):
    		# Création de la fenêtre principale (main window)
    		Tk.__init__(self)
     
    		self.title('Petit jeu')
    		self.geometry('500x100+400+400')
     
    		# Création d'un widget Button (bouton Effacer)
    		BoutonEffacer = Button(
    			self,
    			text ='Jouer',
    			command = self.__jeu,
    		)
     
    		# Positionnement du widget avec la méthode pack()
    		BoutonEffacer.pack(side = LEFT, padx = 5, pady = 5)
     
    		# Création d'un widget Button (bouton Quitter)
    		BoutonQuitter = Button(
    			self,
    			text ='Quitter',
    			command = self.destroy,
    		)
    		BoutonQuitter.pack(side = LEFT, padx = 5, pady = 5)
     
     		# Un champ texte
    		self.__texte = StringVar()
     
    		# Création d'un widget Label (texte 'Résultat -> x')
    		LabelResultat = Label(
    			self,
    			textvariable = self.__texte,
    			fg ='red',
    			bg ='white',
    		)
    		LabelResultat.pack(side = LEFT, padx = 5, pady = 5)
     
    		# Affichage de la liste
    		self.__affiche()
    	# __init__()
     
    	# Fonction d'affichage initial 
    	def __affiche(self):
       		self.__texte.set('Liste -> ' + ", ".join(x for x in cJeu.__liste))
    	# __affiche()
     
    	# Fonction d'affichage de la liste modifiée
    	def __jeu(self):
    		self.__select_obj = random.choice(cJeu.__liste)
    		self.__texte.set(
    			'Liste -> ' + ", ".join(x for x in cJeu.__liste if x != self.__select_obj)
    		)
    	# __jeu()
    # class cJeu
     
    cJeu().mainloop()

    Comme tu vois, je pense immédiatement à mettre le truc en objet d'une part pour éviter les variables globales (elles deviennent des variables associées à l'objet grâce à self) et d'autre part penser au futur (évolutivité). Ensuite faudrait rajouter un champ de saisie pour pouvoir saisir l'objet effacé afin de le comparer avec self.__select_obj mais je ne connais pas assez Tk pour faire ça et en plus j'ai pas super trop le temps. Mais à mon avis ça doit pas être vraiment compliqué (un champ de saisie, un second affichage pour afficher gagné/perdu et une fonction pour lier le tout...)

    [EDIT]
    Bon, j'avais un peu le temps alors je m'y suis mis.
    Tout d'abord, après avoir un peu parcouru la doc de Tkinter, j'ai remarqué que chaque widget d'affichage ou de saisie était toujours associée à un texte dédié. On remplit le texte et il s'affiche dans la widget, ou bien pour récupérer la saisie faut récupérer le texte.
    Je me suis donc dit qu'il fallait absolument créer une classe dédiée qui embarquera à la fois la widget et son texte associé. Déjà ça évite la démultiplication de variables (sans classe chaque élément de saisi ou d'affichage nécessitait une variable texte) et cela donne de bonnes fondations permettant éventuellement plus tard de faire évoluer facilement le programme si besoin. J'ai tenté à un moment de créer un objet un peu universel (pouvant être un affichage ou une saisie au choix de l'appelant) mais j'ai rapidement renoncé car cela m'obligeait à réécrire les méthodes de l'un et de l'autre (pas incontournable mais un peu chiant) donc j'ai créé 2 objets presque similaires.
    Une fois mes objets pensés, j'ai réfléchi au principe
    1) on affiche une liste
    2) on clique pour effacer un élément
    3) on fait saisir
    4) on affiche gagné/perdu

    Et une fois tout ça réfléchi, je l'ai fait
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    #!/usr/bin/env python 
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
    import random
     
    class cJeu(Tk):
    	# Variables statiques
    	__liste=["cochon", "renard", "abeille", "poule"]
     
    	# Constructeur
    	def __init__(self):
    		# Création de la fenêtre principale (main window)
    		Tk.__init__(self)
     
    		# Initialisation variables de jeu
    		self.__hiddenObj=None				# Objet caché
     
    		# Mise en forme
    		self.title('Petit jeu')
    		self.geometry('500x100+400+400')
     
    		# Création du bouton "jouer"
    		Button(
    			self,
    			text='Jouer',
    			command=self.__cacheElem,
    		).pack(side=LEFT, padx=5, pady=5)
     
    		# Création du bouton "quitter"
    		Button(
    			self,
    			text='Quitter',
    			command=self.destroy,
    		).pack(side=LEFT, padx=5, pady=5)
     
    		# Création d'un widget d'affichage liste
    		self.__listLabel=cJeu.cLabel(
    			self,
    			text="Liste: %s" % ", ".join(x for x in cJeu.__liste),
    			fg='red',
    			bg='white',
    		)
    		self.__listLabel.pack(side=LEFT, padx=5, pady=5)
     
    		# Création d'un widget de saisie
    		self.__listSaisie=cJeu.cEntry(
    			self,
    			fg='blue',
    			bg='white',
    		)
    		self.__listSaisie.pack(side=BOTTOM, padx=15, pady=15)
     
    		# Création d'un widget d'affichage résultat
    		self.__listResult=cJeu.cLabel(
    			self,
    			fg='blue',
    			bg='white',
    		)
    		self.__listResult.pack(side=BOTTOM, padx=15, pady=15)
    	# __init__()
     
    	# Suppression d'un élément
    	def __cacheElem(self):
    		self.__hiddenObj=random.choice(cJeu.__liste)
       		self.__listLabel.set_text(
    			"Liste: %s" %\
    				", ".join(x for x in cJeu.__liste if x != self.__hiddenObj)
    		)
    	# __cacheElem()
     
    	# Vérification saisie
    	def Verif(self, event):
    		# S'il n'y a pas d'élément caché, on ne joue pas
    		if self.__hiddenObj is None: return
     
    		# Affichage gagné/perdu selon l'élément saisi
    		self.__listResult.set_text(
    			"Gagné"\
    				if self.__listSaisie.get_text() == self.__hiddenObj\
    				else "Perdu"
    		)
    	# Verif()
     
    	# Une classe pour gérer un label avec son texte
    	class cLabel(Label):
    		# Constructeur
    		def __init__(self, parent, *args, **kwargs):
    			# Mémorisation widget parente
    			self.__parent=parent
     
    			# Le texte
    			self.__texte=StringVar()
     
    			# Création de l'objet
    			Label.__init__(
    				self, 
    				textvariable=self.__texte,
    				*args,
    				**kwargs
    			)
     
    			# S'il y a un texte à afficher
    			if "text" in kwargs.keys() and kwargs["text"] is not None: self.set_text(kwargs["text"])
    		# __init__()
     
    		# Positionnement texte
    		def set_text(self, texte): self.__texte.set(texte)
    	# class cLabel
     
    	# Une classe pour gérer une saisie avec son texte
    	class cEntry(Entry):
    		# Constructeur
    		def __init__(self, parent, *args, **kwargs):
    			# Mémorisation widget parente
    			self.__parent=parent
     
    			# Le texte
    			self.__texte=StringVar()
     
    			# Création de l'objet
    			Entry.__init__(
    				self, 
    				textvariable=self.__texte,
    				*args,
    				**kwargs
    			)
     
    			# L'appui sur return déclenchera la vérification
    			self.bind('<Key-Return>', self.__parent.Verif)
    		# __init__()
     
    		# Récupération saisie
    		def get_text(self): return self.__texte.get()
    	# class cEntry
    # class cJeu
     
    cJeu().mainloop()

    Bon bien entendu je ne l'ai pas fait en un coup. A chaque étape 1, 2, 3, 4 de faite, je testais si cela fonctionnait. A certais essais je faisais afficher à l'écran le texte saisi pour contrôler ma façon de faire. Les commentaires et les noms des variables m'ont aidé à garder le cheminement de ma pensée. Certaines méthodes sont apparues puis plus tard je les ai enlevées car l'avancement les avait rendues inutiles. Mes objets se sont enrichis au fur et à mesure des besoins (notemment l'ajout de la mémorisation du parent car un des objets enfant avait besoin d'y accéder ou bien le texte à afficher lors de la création du label). J'ai eu un peu besoin d'aller voir dans la doc pour certains trucs (surtout pour récupérer la saisie). En plus comme je ne connais pas les spécificités Tk, j'ai eu du mal avec mes placements (j'aurais aimé afficher gagné/perdu juste à coté de la saisie mais j'y suis pas arrivé). Mais dans l'ensemble cela correspond au besoin et donc comme tu vois, c'est pas super difficile d'y arriver.
    J'ai mis à peu près 1h pour ça.

    Amuse-toi bien
    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]

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