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 :

Programme type mastemind.


Sujet :

Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Points : 2
    Points
    2
    Par défaut Programme type mastemind.
    Bonjour, tout d'abord merci de m'avoir aidée sur mon précédent post, j'ai réussi à faire fonctionner mon programme. J'ai un autre devoir un peu plus compliqué pour moi dont voici l'énoncé :

    Ecrivez un programme qui permette à un humain de découvrir un nombre de 4 chiffres choisis entre 1 et 8.


    L'ordinateur choisit d'abord un nombre composé de chiffres entre 1 et 8 (p. ex. 3265). L'utilisateur entrera ensuite des nombres (p. ex. 3822) et l'ordinateur donnera le nombre de chiffres bien et mal placés. Dans notre exemple l'ordinateur répondra 1 bien placé(s) 1 mal placé(s) (le chiffre 3 est bien placé et le chiffre 2 est mal placé).

    J'ai mis mon travail en pièce jointe, je pense que la structure gobale du programme est terminée cependant il ne fonctionne pas, je sais que le code est trop lourd et il manque quelques petits détails et c'est pour cela que j'ai besoin de votre aide. Merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Pour ce travail, il serait bien que tu utilises des fonctions. Je dirais même indispensable.

    Tout d'abord ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    import random
     
    C1=random.randint(1,9) 
    C2=random.randint(1,9) 
    C3=random.randint(1,9) 
    C4=random.randint(1,9)
    while C1==C2 or C1==C3 or C1==C4 or C2==C3 or C2==C4 or C3==C4:
        import random
    Si les quatre chiffres ne sont pas tous différent, tu réimportes random et puis ...plus rien.

    Pour faire ceci, il existe les sets qui sont comme des listes mais qui n'admettent pas de doublons.
    Dans une fonction, nous pourrions avoir ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import random
    def set_code(n):
        """Retourne une liste de n nombres différent."""
        if n > 9:
            # Un nombre supérieur à 9 entrainerait une boucle infinie
            return []
     
        s = set([])
        while len(s) < n:
            # Tant que le nombre de chiffre est inférieur au nombre demandé.
            s.add(random.randint(1,9))
     
        return list(s)
    On utilise cette fonction en l'appelant. Simplement comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    secret = set_code(5)
    print(secret)
    Ensuite les entrées utilisateur que l'on peut simplifier de la même manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    X=0 
     
    C5=input("Veuillez entrer votre premier chiffre :") 
    C6=input("Veuillez entrer votre second chiffre :")  
    C7=input("Veuillez entrer votre troisième chiffre :")
    C8=input("Veuillez entrer votre quatrième chiffre :")
    while C1!=C5 or C2!=C6 or C3!=C7 or C4!=C8:
        X=X+1
    pourrait faire appel à une fonction de ce genre:
    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
     
    def get_values(n):
        """Retourne une liste de n nombres entrés par l'utilisateur."""
        # On utilise plus un set parce qu'ils ne respectent pas l'ordre
        l = []
        while len(l) < n:
            while 1:
                c = input('Entrez un chiffre de 1 à 8: ')
                try:
                    # On convertit le caractère en nombre
                    c = int(c)
                    # On vérifie qu'il est bien entre 1 et 8
                    if 0 < c and c < 9 and c not in l:
                        # OK on casse la boucle while 1
                        break
                except ValueError:
                    # Ceci arrive lorsque le caractère n'est pas un nombre
                    # On ignore et on reste dans la boucle while 1
                    pass
     
            l.append(c)
     
        return l
    Maintenant tu possèdes deux listes, la première contenant les quatre chiffres secret.
    Pour comparer ces deux listes, tu peux, par exemple itérer sur l'une d'entre elles et comme tu devras aussi comparer la position des chiffres, tu as enumerate() pour cela.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for index, chiffre in enumerate(secret):
        print('index:', index, 'chiffre:', chiffre)
    À toi de trouver le parti à tirer de cette fonction pour comparer chiffres et positions en deux lignes de code. De préférence dans une fonction.

    Organise ton code de cette manière:

    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
     
    import foo
     
    def fonction_1()
        ...
     
    def fonction_2()
        ...
     
    def fonction_x()
        ...
     
    appel de la première fonction
    appel de la deuxième fonction
    appel de la xième fonction
    calcul des résultats
    affichage des résultats
    Quelques conseils trouvés dans la hotte du père Noël:

    - Place ton commentaire avant la ligne qui le commente pas à la suite de.
    - Il y a toujours moyen de limiter une ligne de code à un nombre de caractères raisonables.
    On ne fait pas ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        if C5!=1 and C5!=2 and C5!=3 and C5!=4 and C5!=5 and C5!=6 and C5!=7 and C5!=8 and C5!=9 or C6!=1 and C6!=2 and C6!=3and C6!=4 and C6!=5 and C6!=6 and C6!=7 and C6!=8 and C6!=9 or C7!=1 and C7!=2 and C7!=3 and C7!=4 and C7!=5 and C7!=6 and C7!=7 and C7!=8 and C7!=9 or C8!=1 and C8!=2 and C8!=3 and C8!=4 and C8!=5 and C8!=6 and C8!=7 and C8!=8 and C8!=9:  ##La comannde "if" permer de vérifier si les chiffres entrés par l'utilisateur sont bien compris entre 1 et 9.
    Voilà de quoi finir l'année de façon brillante.

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    En vérifiant que je ne disais pas trop de bêtises dans mon post précédent, je me suis rendu compte que random.randint(0, 9) retourne parfois 9.

    Effectivement, contrairement à d'autres range randint(begin, end) inclus end dans les valeurs. [1]

    Tu devras donc, dans ton cas, utiliser soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    random.randint(0, 8)
    Soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    random.randrange(0, 9)


    [1] http://docs.python.org/3/library/ran...random.randint

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Merci pour tous ces conseils, je pense pouvoir m'en sortir avec les fonctions mais j'ai encore quelques incompréhensions. Je ne sais pas à quoi se un "set" et je ne vois pas à quel moment le programme admet que le nombre cachée ou celui entré par l'utilisateur doit être composé de 4 chiffre.

    Dans la seconde fonction, je ne comprends pas pourquoi "on convertit le caractère en nombre", de plus, mon prof ne m'autorise pas à utiliser des breaks.

    Et pour comparer les deux liste, il me manque des outils, je ne vois pas ce que signifie "itérer sur l'une d'entre elles" .

    Merci pour tout, tout ça est un peu vague pour moi mais je vais essayer de persévérer...

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Citation Envoyé par Temari8 Voir le message
    Merci pour tous ces conseils, je pense pouvoir m'en sortir avec les fonctions mais j'ai encore quelques incompréhensions. Je ne sais pas à quoi se un "set" et je ne vois pas à quel moment le programme admet que le nombre cachée ou celui entré par l'utilisateur doit être composé de 4 chiffre.
    Le nombre de chiffres dont se compose le code est l'argument n de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def set_code(n):
    ...
    def get_values(n):
    donc set_code(4) te retournera une liste de 4 chiffres

    Dans la seconde fonction, je ne comprends pas pourquoi "on convertit le caractère en nombre"
    Il s'agit là d'un oubli (et donc d'un bug) dans ton code, random.randint() retourne un entier or input() retourne une chaîne de caractères(s) et si tu fais if '5' == 5: le retour est False.

    , de plus mon prof ne m'autorise pas à utiliser des breaks.
    Alors là, pourquoi diable ? tu es sur qu'il parlait de cela et non pas de breaks durant les heures de cours ?
    Et pour comparer les deux liste, il me manque des outils, je ne vois pas ce que signifie "itérer sur l'une d'entre elles" .
    Je t'ai montré un exemple, teste-le et regarde le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    secret = [2, 5, 4, 8, 9, 7]
    for index, chiffre in enumerate(secret):
        print('index:', index, 'chiffre:', chiffre)

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Merci, j'ai un peu avancé, cependant je n'arrive pas a faire fonctionner ma deuxième fonction, elle me demande d'entrer des chiffres à l'infini...
    Il me semble qu'il faut préciser que n=4 lorsqu'on appelle la fonction, mais cela ne marche pas. Et mon prof ne veut vraiment par qu'on utilise de breaks, il nous dit que ça lui convient pas pour notre niveau, je dois donc trouver un moyen de killer ma boucle sans break...

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Il serait plus simple que tu montres ton code parce que là, je peux difficilement comprendre pourquoi ta fonction est en boucle infinie.

    Pour supprimer le break tu peux simplifier comme ceci:
    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
     
    def get_values(n):
        l = []
        while len(l) < n:
            c = input('Entrez un chiffre de 1 à 8: ')
            try:
                # On convertit le caractère en nombre
                c = int(c)
                # On vérifie qu'il est bien entre 1 et 8
                if 0 < c and c < 9 and c not in l:
                    l.append(c)
            except ValueError:
                # Ceci arrive lorsque le caractère n'est pas un nombre
                # On ignore et on reste dans la boucle while
                pass
     
        return l

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Coucou,

    Merci beaucoup, j'ai résolu mon problème de boucle infinie, donc mes deux premières fonctions marchent !
    J'ai testé ton exemple, je pense avoir compris le principe mais je ne vois vraiment pas comment comparer les indexs au sein d'une fonction.

    Merci pour votre considération sur le forum.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Je m'en suis sortie pour comparer les fonctions, j'ai utilisé une boucle for car je ne m'en sortais pas avec une fonction. Il me reste un dernier problème, il faut que mon programme permettent à l'utilisateur de proposer une autre combinaison jusqu'a ce qu'il trouve la combinaison secrète. Je pensais utiliser un booleen mais je ne sais pas vraiment utiliser cet outil. (J'ai fait un test visible dans le code source.) Merci de votre aide.
    Fichiers attachés Fichiers attachés

  10. #10
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    C'est normal, dans ton code tu appelles la fonction propose mais tu ne fais plus rien après.

    ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def proposition(n):
        ...
        return liste2
     
    secret = secret(4)
    propose = proposition(4)
    print(propose)
     
    for i in range(0,4):        #
        for j in range(0,4):    # Ces lignes de code ne se ré-exécuteront pas !
        ...
    Et puis à la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    test=True
    while test:
        question=input("Voulez vous entrer un autre nom?")
        if question=="oui":
            proposition(4)
        else:
            test=False
    C'est n'est pas parce que la vérification du résultat est écrite dans le code après la fonction propose() que ces lignes de code vont s'exécuter une nouvelle fois. voir mon commentaire dans ton code.

    Remplace tout ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    secret = secret(4)
     
    propose = proposition(4)
    print(propose)
     
    test=True      ##Bouleen qui permet de proposer à l'utilisateur d'entrer un autre nom/numéro
    while test:
        question=input("Voulez vous entrer un autre nom?")
        if question=="oui":
            proposition(4)
        else:
            test=False
    par ceci, à la fin de ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    secret = secret(4)
    while 1:
        play = input("Tapez Enter pour jouer ou Q pour quitter ")
        if play in ("q", "Q"):
            break
     
        propose = proposition(4)
        check_values(secret, propose)    # Nouvelle fonction à créer
    et place ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for i in range(0,4):
        for j in range(0,4):
            if secret[i]==propose[j]:
                if i!=j:
                    print("Votre chiffre n° ",j+1," est dans la combinaison mais il est mal placé")
                if i==j:
                    print("Votre chiffre n°",j+1," est correctement placé")
    dans une nouvelle fonction

  11. #11
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 051
    Points : 1 382
    Points
    1 382
    Par défaut
    comme je m'ennuyais ...
    Pour python3.

    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
    from random import randint
     
     
    code = oct(randint(4096,8191))[3:]
    print(code)
     
    for coup in range(10):
     
        while True:
            try:
                propos = input('votre proposition: ')
                (int(propos,8)<=4095) / (len(propos)==4)
                break
            except:
                print("format non valide")
     
        x = [1 for a,b in zip(propos,code) if a==b]
     
        codecopy = list(code)
        y = [codecopy.remove(i)for i in propos if i in codecopy]
        if len(y)+len(x) == 8:
            print('bien vu, le code etait bien ',code)
            break
        print(len(y)," bon(s) ",len(x)," bien place(s)")
    else:
        print("desole, cest perdu")

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup ! ça y est j'ai terminé, et je pense avoir appris pas mal de trucs. Il me reste tout de même une question, pas très intéressante je l'avoue, je ne sais pas ou placer l'instruction :
    if secret==propose:
    print("Vous avez gagné !")
    Dans la fonction "comparaison" sans que ça n'affiche que les chiffres sont correctement placés.
    Merci encore pour votre aide.
    Fichiers attachés Fichiers attachés

  13. #13
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Il faut le placer au début de la fonction bien sur et tu peux supprimer aussi une deuxième comparaison.

    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
     
    def comparaison(secret, propose):
        if secret==propose:
            print("Vous avez gagné !")
            # Pas besoin d'aller plus loin
            return
     
        for i in range(0,4):
            for j in range(0,4):
                if secret[i]==propose[j]:
                    if i!=j:
                        print("Votre chiffre n° ",j+1," est dans la combinaison mais il est mal placé")
     
                    else:
                        # Plus besoin d'une deuxième comparaison
                        print("Votre chiffre n°",j+1," est correctement placé")

    Commentaire: Le prof n'aurait pas accepté le code de josmiley ?

Discussions similaires

  1. Programmation "type entreprise"
    Par anthony78340 dans le forum Débuter
    Réponses: 11
    Dernier message: 10/04/2013, 16h22
  2. [Débutant] Problème avec mon programme ( Type de valeur )
    Par Jcvag44800 dans le forum VB.NET
    Réponses: 10
    Dernier message: 21/12/2011, 21h02
  3. programme type serveur
    Par corentin59 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 13/11/2007, 16h16
  4. Associer programme à type de fichier (registry)
    Par Belegkarnil dans le forum Windows XP
    Réponses: 2
    Dernier message: 31/08/2006, 08h49

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