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 :

menu dynamique en python.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Par défaut menu dynamique en python.
    Bonjour à tous,

    Pour un TP, j'aimerais faire un menu dynamique en fonction d’éléments se trouvant dans une liste : mon indexation sera donc variable en fonction des éléments de liste ...

    Un exemple concret => si mon soldat a dans sa liste une potion de survie et une armure, j'aimerais que mon menu lui propose :
    1. attaquer
    2. prendre potion
    3. utiliser armure

    Par contre s'il n'a qu'une armure, mon menu sera alors
    1. attaquer
    2. utiliser armure

    Après ce menu, je veux lui demander un input pour connaitre son choix mais étant donné que les numéros varient (ormis l'attaque qui sera toujours proposé et toujours en 1), je ne sais pas comment gérer son choix de façon relativement "facile" (je pourrais faire des imbrications de if mais cela deviendrait vite compliqué) sachant que, dans l'exemple précédent, utiliser armure peut être en 2 ou en 3 en fonction de sa liste.
    ci-dessous, vous aurez compris, je ne peux pas en ligne 29,34,39,44 utiliser une condition sur une valeur définie car elle est variable.

    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
            i=1
            print("Options:")
            print(f"{i} - Attaquer ?")
            if "potion" in hero.inventaire:
                i+=1
                print(f"{i} - Utiliser potion soin ?")
     
            if "arme" in hero.inventaire:
                i+=1
                print(f"{i} - Utiliser arme ?")
     
            if "armure" in hero.inventaire:
                i+=1
                print(f"{i} - Utiliser armure ?")
     
            if "casque" in hero.inventaire:
                i+=1
                print(f"{i} - Utiliser casque ?")
     
     
            choice = input("Choisissez une option: ")
     
            if choice == "1":
                print()
                hero.attack(monster_1)
                monster_1.attack(hero)
     
            if choice == "2":
                print()
                #méthode pour vider inventaire de potion et augmenter les pv
                monster_1.attack(hero)
     
            if choice == "3":
                print()
                #méthode pour vider inventaire de arme et augmenter les degat
                monster_1.attack(hero)
     
            if choice == "4":
                print()
                #méthode pour vider inventaire de armure et diminue attaque
                monster_1.attack(hero)
     
            if choice == "5":
                print()
                #méthode pour vider inventaire de casque et diminue attaque
                monster_1.attack(hero)
    Si quelqu'un a une solution à proposer, je suis preneur.

    Damien

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

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 736
    Par défaut
    Citation Envoyé par damienvialla Voir le message
    Si quelqu'un a une solution à proposer, je suis preneur.
    On part des labels A, B, C, D, ....
    On affiche 1 - A, 2 - C, 3 - E et on demande à l'utilisateur de choisir en entrant le numéro correspondant. Qu'est ce qui dans votre code réalise cette correspondance? Rien.
    Par contre, si pour chacun des labels affichés, ils étaient ajoutés à une liste, on pourrait utiliser l'entrée utilisateur comme index dans cette liste.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Par défaut
    Hey, Wiztricks ... Toujours là au rendez-vous ....
    Effectivement, rien ne permets la correspondance et le but de mon mess était de trouver une astuce.
    L'astuce des index de la liste est plutôt pas mal ... je vais essayer ça.

    Damien

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Par défaut
    Ta technique me permet effectivement d'être plus efficient dans l'affichage de mon menu en enlevant un paquet de lignes grâce à la boucle dans la liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            i=1
            print("\nOptions:")
            print(f"{i} - Attaquer ?")
            for item in hero.inventaire:
                print(f"{hero.inventaire.index(item)+2} - Utiliser {item}")
    Il n'en demeure pas moins que j'ai du mal à mettre en relation sa valeur de input du choix avec ce que je dois lancer en terme de méthode/fonction car le n°2 ne sera pas toujours le même.

    Damien

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

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 736
    Par défaut
    Salut,

    La liste des items affichés est à construire puisque c'est un sous-ensemble du tas de départ.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Par défaut
    Etant donné que je ne suis pas certains de comprendre, je pense que j'ai mal expliquer le problème et vais tâcher d'être plus précis :
    Boucler dans l'inventaire permet de me rendre mes options interactives en fonction de ce qu'il y a dans l'inventaire.

    Nom : option.png
Affichages : 185
Taille : 110,7 Ko

    Ensuite je lui fais un input pour connaitre son choix
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    choice = input("Choisissez une option: ")
    En fonction de sa réponse, je lance des méthodes.
    Exemple 1, s'il appuie sur 3, je vais augmenter ses points d'attaque
    Exemple 2, s'il appuie sur 3 (le même chiffre que exemple 1), je vais augmenter ses points de défense

    Et je n'arrive pas à aller chercher l'information qui va bien car l'option 2/3 et/ou 4 changent en fonction de la liste et donc je ne sais pas avec le "choice de input", ce que je dois lancer.
    Images attachées Images attachées  

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par damienvialla Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    i=1
    print("\nOptions:")
    print(f"{i} - Attaquer ?")
    for item in hero.inventaire:
    	print(f"{hero.inventaire.index(item)+2} - Utiliser {item}")
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    print("1 - Attaquer ?")
    for (i, item) in enumerate(hero.inventaire, 2):
    	print(f"{i} - Utiliser {item}")

    Citation Envoyé par damienvialla Voir le message
    Et je n'arrive pas à aller chercher l'information qui va bien car l'option 2/3 et/ou 4 changent en fonction de la liste et donc je ne sais pas avec le "choice de input", ce que je dois lancer.
    Normal. La position de l'item Y dépend de la présence ou pas des items X précédents. Mais c'est toi qui a voulu faire ainsi donc à toi d'assumer ta propre logique !!!
    Il te faut donc récupérer le choix demandé puis associer ce choix avec les items réellement présents (via index() comme tu l'as fait)

    Autre solution: tout afficher mais indiquer par un signe quelconque que l'item X n'est pas disponible (parce que pas présent). D'un point de vue "confort" c'est d'ailleurs préférable (j'ai remarqué que les utilisateurs n'aiment pas voir apparaitre et disparaitre des éléments, ils croient que le programme a un souci, ils préfèrent de loin voir tout apparaitre quitte à refuser ensuite les choix non disponibles)...
    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 averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Par défaut
    Quand ce n'est pas wiztricks, c'est Sve@r ... Merci beaucoup de m'aider une fois de plus, ça fait plaisir.

    Pour ce qui est d'assumer, j'essaie de faire au mieux pour avoir un ux qui me semble bon et après j'essaie de m'adapter.
    A priori, selon ton expérience, ce que j'aimerais faire n'est pas la meilleure expérience utilisateur et en plus c'est assez compliqué.
    Je vais essayer quand même avec mon menu "dynamique" pour me confronter au problème durant une petite heure et ensuite je passerai à la solution plus facile en mettant un menu statique et en indiquant à l'utilisateur si peut accéder à ce choix.

    Sympa encore d'avoir partagé ton expérience avec moi.

    Damien

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour


    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    print("1 - Attaquer ?")
    for (i, item) in enumerate(hero.inventaire, 2):
    	print(f"{i} - Utiliser {item}")


    Normal. La position de l'item Y dépend de la présence ou pas des items X précédents. Mais c'est toi qui a voulu faire ainsi donc à toi d'assumer ta propre logique !!!
    Il te faut donc récupérer le choix demandé puis associer ce choix avec les items réellement présents (via index() comme tu l'as fait)

    Autre solution: tout afficher mais indiquer par un signe quelconque que l'item X n'est pas disponible (parce que pas présent). D'un point de vue "confort" c'est d'ailleurs préférable (j'ai remarqué que les utilisateurs n'aiment pas voir apparaitre et disparaitre des éléments, ils croient que le programme a un souci, ils préfèrent de loin voir tout apparaitre quitte à refuser ensuite les choix non disponibles)...
    j'ai retransformé le choice de l'input dans la valeur str de ma liste et je teste maintenant cette valeur str pour balancer ma méthode : je ne sais pas si c'est claire mais ca fonctionne bien.
    Je mets le code pour exemple :

    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
            i=1
            print("\nOptions:")
            print(f"{i} - Attaquer ?")
            #on boucle sur l'inventaire du héro pour proposer ce qu'il a dans sa besace
            #l'utilisation d'un objet d'inventaire passe un tour d'attaque
            for item in hero.inventaire: 
                print(f"{hero.inventaire.index(item)+2} - Utiliser {item}") #index+2 car 0 n'existe pas et 1 est forcément attaque
     
            # retransforme le choix en index dans la liste pour aller tester l'objet choisi      
            print()
            choice = int(input("Choisissez une option: "))-2
     
            # attaquer n'étant pas dans la liste et se trouvant tout le temps en choix 1, étant donné qu'on enlève 2, on test la valeur -1
            if choice == -1:
                choice_final = "attaquer"
            else :
                choice_final = hero.inventaire[choice] # le choix final est donc l'objet et pas l'index i qu'on a incrémenté
     
     
            if choice_final == "attaquer":
                print()
                hero.attack(monster_1)
                monster_1.attack(hero)
            elif choice_final == "potion":
                print()
                hero.potion_soin()
                monster_1.attack(hero)
            elif choice_final == "arme":
                print()
                hero.arme()
                monster_1.attack(hero)
     
            elif choice_final == "armure":
                print()
                hero.armure(monster_1)
                monster_1.attack(hero)

Discussions similaires

  1. [Free Pascal] Intégrer des valeurs dans un menu dynamique
    Par boullery dans le forum Free Pascal
    Réponses: 16
    Dernier message: 30/03/2005, 17h04
  2. Créer un sous-menu dynamiquement
    Par PurL dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/09/2004, 10h31
  3. [JSP]menu dynamique en jsp
    Par laouedjahmed dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 22/03/2004, 10h50
  4. Menu dynamique sous Flash MX
    Par dens63 dans le forum Flash
    Réponses: 7
    Dernier message: 29/10/2003, 15h46

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