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

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

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

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Points : 8
    Points
    8
    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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    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
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Points : 8
    Points
    8
    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
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Points : 8
    Points
    8
    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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    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
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Points : 8
    Points
    8
    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 : 135
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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    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
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Points : 8
    Points
    8
    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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Peut-être, au lieu de mettre des numéros, mettre des lettres correspondant aux items ("P" pour "Potion", "C" pour "Casque", etc).
    Cela nécessite évidemment de tout faire commencer par des lettres différentes mais en retour ça simplifie la gestion. Et tu n'as même pas besoin de créer la lettre, elle est directement récupérable via la première lettre de l'item mis en majuscule
    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    inventaire=("potion", "casque")
    print("X - Attaquer")
    for x in inventaire:
    	print("{} - {}".format(x[0].upper(), x))
    choix=input("Votre choix :")
    item=tuple(filter(lambda x: choix == x[0].upper(), inventaire))
    item=item[0] if item else "Attaquer"
    print(item)
    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
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Avril 2023
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Points : 8
    Points
    8
    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)

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par damienvialla Voir le message
    Je mets le code pour exemple
    Tu n'as pas voulu de enumerate(). Ok chacun est libre

    Autre suggestion: utiliser match pour éviter ces "if" à suivre. Et si le monstre répond à chaque fois, alors autant sortir la réponse pour éviter les répétitions...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    print()
    match choice_final:
    	case "attaquer": hero.attaq(monster_1)
    	case "armure": hero.armure()
    # match
    monster_1.attack(hero)

    Si en plus les appels étaient similaires (un argument à chaque fois), alors on pourrait carrément placer la fonction associée à la réponse dans un dict...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    print()
    {
    	"attaquer" : cHero.attaq,
    	"armure" : cHero.armure,
    	"potion" : cHero.potion,
    }[choice_final](hero, monster_1)
    monster_1.attack(hero)
    J'utilise pour cette syntaxe le fait que la méthode d'un objet soit un raccourci syntaxique de la méthode généraliste de l'objet appliquée à l'instance de l'objet. Typiquement l'écriture hero.attaq(monster_1) peut s'écrire aussi cHero.attaq(hero, monster_1) (cHero étant dans mon exemple le nom de la classe).
    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
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Si on veut limiter les choix possibles, on modifie légèrement le dernier code pour ajouter la liste "dynamique" dont je parles depuis le début:

    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
            #l'utilisation d'un objet d'inventaire passe un tour d'attaque
            options = 'potion', 'arme', 'armure' # <---
            choix = []
            for item in options:
                if item in hero.inventaire:
                   print(len(choix)+2, '-', item)
                   choix.append(item)
     
            #     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 = choix[choice]    # <---
                # choice_final = hero.inventaire[choice] # le choix final est donc l'objet et pas l'index i qu'on a incrémenté
            ...
    Avec "choix", je récupère bien le label en fonction de l'index entré par l'utilisateur.

    Après on peut "simplifier" en s'appuyant sur les régularités (et du python à découvrir) comme remplacer hero.arme|armure|potion?() par getattr(hero, choice_final)(). Ce qui permettrait de simplifier la séquence:
    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
            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)
    en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            print()
             if choice_final == "attaquer":
                 hero.attack(monster_1)
             else:
                 getattr(hero, choice_final)()
             monster_1.attack(hero)
    Citation Envoyé par damienvialla Voir le message
    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é.
    Ce que vous voulez faire n'est pas si compliqué, juste qu'en connaissant mieux Python on n'écrirait pas cela ainsi mais vous êtes coincé à devoir faire avec le python que vous maîtrisez vous (et non celui que je maîtrise moi).

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

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

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

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Tu n'as pas voulu de enumerate(). Ok chacun est libre

    Autre suggestion: utiliser match pour éviter ces "if" à suivre. Et si le monstre répond à chaque fois, alors autant sortir la réponse pour éviter les répétitions...
    .....
    Si en plus les appels étaient similaires (un argument à chaque fois), alors on pourrait carrément placer la fonction associée à la réponse dans un dict....
    Salut,

    Enumerate(), inconnu au bataillon, je vais essayer de regarder cela.
    Pour le match, c'est plus "joli" mais mon cerveau est trop formaté if elif
    Pour la dernière partie de ton mess, j'avoue que c'est

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

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

    Informations forums :
    Inscription : Avril 2023
    Messages : 33
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    .....
    Après on peut "simplifier" en s'appuyant sur les régularités (et du python à découvrir) comme remplacer hero.arme|armure|potion?() par getattr(hero, choice_final)(). Ce qui permettrait de simplifier la séquence:
    Salut et merci d'avoir pris le temps de m'avoir parlé de "ton" getattr => je vais regarder cela.

    Damien

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par damienvialla Voir le message
    Pour la dernière partie de ton mess, j'avoue que c'est
    Teste ceci...

    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
    class cCercle:
    	def __init__(self, r): self.r=r
    	def surface(self): return 3.14 * self.r**2
    	def perimetre(self): return 3.14 * self.r*2
    	def __str__(self): return "cercle de rayon %d" % self.r
     
     
    # Instanciation
    c=cCercle(5)
     
    # Méthode de l'instance
    print("surface 1:", c.surface())
     
    # Méthode de l'objet appliquée à l'instance
    print("surface 2:", cCercle.surface(c))
     
    # Puisqu'une fonction est un objet, je peux la récupérer...
    fct=cCercle.surface
     
    # ... et la réutiliser...
    print("surface 3:", fct(c))
     
    # ... et donc affecter une méthode à un choix
    while True:
    	r=int(input("Rayon ?"))
    	c=cCercle(r)
    	print("Cercle créé =>", c)
     
    	choix=input("(P)erimetre ou (S)urface ou (Q)uitter: ").upper()
    	if choix in "PS":
    		fct={
    			"P" : cCercle.perimetre,
    			"S" : cCercle.surface,
    		}[choix]
    		print("résultat: ", fct(c))
    	elif choix == "Q": break
    	else: print("Choix incorrect")
    # while
    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
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 105
    Points : 4 455
    Points
    4 455
    Par défaut
    bonjour
    Citation Envoyé par damienvialla Voir le message
    Pour la dernière partie de ton mess, j'avoue que c'est
    Il faut déjà avec quelques bases en python : En python, il est classique de remplacer une cascade de "if" par un appel à un dictionnaire de fonctions. Un exemple très basique que tout codeur python devrait maitriser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def a_manger(x=''): print(f"je me retaure {x}")
    def a_dormir(x=''): print(f"je me repose {x}")
     
    actions = {
        "manger": a_manger,
        "dormir": a_dormir,
        }
     
    actions["dormir"]("avant de sauver la princesse !")
    actions["manger"]()
    actions["dormir"]("...")
     
    # action = input("Que faire ?").lower()
    # actions[action]()
    Si cette structure très classique en python te donne des migraines, alors le code de Sve@r est en effet hors de ta portée, sinon il ne devrait pas avoir de problèmes.

    --------------------------------
    Message #1
    Si quelqu'un a une solution à proposer, je suis preneur.
    Il faudrait déjà être sûr de ton besoin, sinon c'est une perte de temps.

    — Puisque tu utilises des objets pour tes joueurs, il me semble logique d'utiliser aussi des objets pour tes menus ?
    — Ton exemple est assez générique pour tous tes menus de ton jeux ??? Ton exemple n'est pas que pour l'attaque ? on ne risque pas d'avoir : * utiliser arme et * ramasser arme dans le même menu ?
    $moi= ( !== ) ? : ;

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