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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    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
    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 confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    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 confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    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
    Membre habitué
    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
    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 confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    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
    Membre habitué
    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
    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...

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