Partage
  • Partager sur Facebook
  • Partager sur Twitter

Supprimer éléments d'une liste dans une fonction

Supprimer éléments d'une liste dans une fonction rappelée chaque tour

    18 janvier 2023 à 11:43:07

    Bonjour,

    Je débute en python et souhaite créer un jeu comme le jeu du 'Picolo' (pour ceux qui connaissent) avec une interface graphique afin de m'entrainer avec la programmation.

    Au début je demande d'entrer le nom des joueurs, puis de choisir le mode de jeu. Jusqu'ici j'ai réussi à faire ce que je souhaitais mais c'est ensuite que ça se complique.

    Chaque mode de jeu dispose de son propre code dans un fonction portant son nom. Le mode de jeu choisi est composé de 3 sortes de questions : les classiques, les jeu et les virus. J'ai inséré les différentes questions dans trois listes distinctes en fonction de leur type. Certaines questions nécessitent de faire apparaitre le nom d'un ou de deux des joueurs tiré au hasard dans la liste des participants. 

    Voilà mon problème : je souhaite que chaque question ne soit posée qu'une seule fois. Dans mon code la fonction entière se répète a chaque fois que le joueur appuie sur le bouton pour passer à la question suivante (espace). Mais dans ce cas mes listes sont également réinitialisées comme elles sont indentées dans la fonction. Si je sors l'indentation des listes de la fonction, je n'arrive plus à tirer des noms différents à chaque tour.

    Je précise que je souhaite également qu'il y ait un nouveau tirage aléatoire des noms des joueurs à chaque nouvelle question.

    Comme j'ai des variables qui doivent changer à chaque tour dans mes listes je ne peux pas les déclarer en amont hors de la fonction. 

    Je ne sais pas si j'ai été assez clair. Je met une partie de mon code ci-dessous ce sera peut être plus parlant.

    Merci pour votre aide !

    #fonction permettant de nettoyer la fenêtre principale dans la détruire et la reconstruire
    def entrer(event = None):
                for w in root.winfo_children():
                        w.destroy()
    #fonction déclarant le premier mode de jeu
    def jeu_before(event = None):
        
        entrer()
        #définition des noms aléatoires
        nom = choice(joueur)
        joueur.remove(nom)
        nom2 = choice(joueur)
        joueur.append(nom)
    
        #création des listes avec les différentes questions     
        virus = [nom+" le perroquet! Tu dois répéter tout ce que dis "+nom2,
                    nom+ ", interdiction de boire dans ton verre. Tu devras choisir celui d'une autre personne",
                    nom+", bon toutou! Quand on te donne un ordre habituellement donné à un chien, exécute-le ou prends 2 gorgées. On ne peut te donner qu'un ordre toute les 30 secondes",
                     "Jusqu'à nouvel ordre, dès que "+nom+" parle, "+nom2+" prend une gorgée, et inversement",
                     nom+" tu as le freezer. A chaque fois que tu t'arrêtes de bouger (discrètement) le dernier joueur à faire de même prends 2 gorgées",
                     nom+" le clapeur fou! A chaque fois que tu claques des mains tout le monde prend une gorgées (même toi)!"]
            
        game = ["Désignez tous ensemble la personne la plus belle qui devra prendre 5 gorgées",
                    "Dites une lettre à tour de rôle, le but est de former un mot valide. Le joueur qui termine le mot, ou fait un mot qui n'existe pas prend 3 gorgées. "+nom+" commence",
                    "'Les trucs à faire dans un lit', le joueur qui répète ou ne trouve pasprend 4 gorgées."+nom+" commence",
                    "Plutôt être virtuose avec tous les instruments de musique ou parler 15 langues parfaitement? Votez tous en même temps, les minoritaires prennent 2 gorgées!",
                    "Jeu du con! A tour de rôle désignez qui prendra 2 gorgées.",
                    "'Les films où le personnage principal est une daube, il se motive et on voit un montage de 3 minutes qui le fait passer de grosse merde à mec trop fort', le joueur qui répète ou ne trouve pas prend 2 gorgées. "+nom+" commence",
                    "'Les animaux de la basse cour', le joueur qui répète ou n'a plus d'idée prend 2 gorgées! "+nom+" commence",
                    nom+" mime une scène de film, le premier joueur qui devine distribue 3 gorgées"]
            
        classic = [nom+ ", tous ceux qui ne sont pas amis avec toi sur facebook boivent 2 gorgées.",
                       nom+ ", si la dernière fois que tu as pissé était dans tes toilettes, prends 3 gorgées. Autrement distribue-les",
                       "Le premier joueur à se lécher le coude distribue 2 gorgées",
                       "La personne à gauche de "+nom+" prend 3 gorgées",
                       "Prends 3 gorgées si dans ton adolescence, tu as déjà été en couple moins d'une journée",
                       nom+" envoie 'je t'aime' par texto (sans rien envoyer derrière) à une personne choisie par "+ nom2+", ou prend 3 gorgées",
                       "Distribue 2 gorgées si "+nom+" t'as déjà prêté des vêtements",
                       nom+", par amour, donne 2 gorgées au joueur que tu aimes le plus",
                       nom+" rajoute ce que tu veux dans le verre de "+nom2,
                       "Prends 2 gorgées si tu as déjà pissé sans les mains",
                       "Prends 2 gorgées si tu avais toujours un doudou après 12 ans",
                       nom+", envoie un texto à la dernière personne que tu as contactée ou prends 2 gorgées",
                       nom+", distribue autant de gorgées que tu citeras de mathématiciens célèbres. Arrêtes-toi quand tu veux, mais tu perds et tu prends 4 gorgées à la première erreur",
                       nom+" et "+nom2+" échangent de place, de verres aussi",
                       nom+", montre des photos de personnes à poil que t'as dans ton téléphone ou prends 4 gorgées",
                       nom+", demande en ami quelqu'un sur Instagram choisi par "+nom+ " ou prends 2 gorgées"]
            
        #choix de la question en fonction du type de question tiré aléatoirement
        type_question = [virus, classic, game]
        question = choice(type_question)
        defi = choice(question)
    
    
        #affichage de la question avec un arrière plan différent en fonction du type de question
        if question == virus:
            root.configure(bg = 'yellow')
            f = font.Font(family = 'Times New Roman', size = 25, weight = 'bold')
            g = font.Font(family = 'Times New Roman', size = 35, weight = 'bold')
            vide = Label(root, text = 'VIRUS', fg = 'white', bg = 'yellow', height = 6)
            defi1 = Label(root, text = defi, bg = 'yellow', fg = 'white', wraplength = 1000)
            vide['font'] = g
            defi1['font'] = f
            vide.pack()
            defi1.pack()
            question.remove(defi)
                
                
        elif question == game:
            root.configure(bg = 'green')
            f = font.Font(family = 'Times New Roman', size = 25, weight = 'bold')
            g = font.Font(family = 'Times New Roman', size = 35, weight = 'bold')
            vide = Label(root, text = 'JEU', fg = 'white', bg = 'green', height = 6)
            defi1 = Label(root, text = defi, bg = 'green', fg = 'white', wraplength = 1000)
            vide['font'] = g
            defi1['font'] = f
            vide.pack()
            defi1.pack()
            question.remove(defi)
              
        elif question == classic:
            root.configure(bg = 'lightslategrey')
            f = font.Font(family = 'Times New Roman', size = 25, weight = 'bold')
            vide = Label(root, bg = 'lightslategrey', height = 20)
            defi1 = Label(root, text = defi, bg = 'lightslategrey', fg = 'white', wraplength = 1000)
            defi1['font'] = f
            vide.pack()
            defi1.pack()
            question.remove(defi)
    
        #si toutes les questions ont été posées éran noir avec écrit 'FIN DU JEU'
        else:
            root.configure(bg = 'black')
            f = font.Font(family = 'Times New Roman', size = 50, weight = 'bold')
            vide = Label(root, bg = 'lightslategrey', height = 20)
            defi = Label(root, text = 'FIN DU JEU', bg = 'lightslategrey', fg = 'white', wraplength = 1000)
            defi['font'] = f
            vide.pack()
            defi.pack()
    
    #en cliquant sur espace le programme passe à la question suivante
    root.bind('<space>', jeu_before)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      18 janvier 2023 à 17:19:52

      Slt !

      La flegme de lire un tel pavé !

      Pour supprimer un élément d'une liste ben pas compliqué : pop(index) ou remove(value)
      • Partager sur Facebook
      • Partager sur Twitter
        28 janvier 2023 à 4:16:06

        Salut,

        Premièrement, concernant ceci: "Certaines questions nécessitent de faire apparaitre le nom d'un ou de deux des joueurs tiré au hasard dans la liste des participants."

        Vous savez, que vous pouvez formatter des strings ?

        Voici un exemple:

        phrase1 = "{nom} le perroquet! Tu dois répéter tout ce que dis {nom2}"
        phrase2 = "{nom}, interdiction de boire dans ton verre. Tu devras choisir celui d'une autre personne"

        Ensuite, avec des "strings", vous pouvez utiliser ".format" pour remplir les parenthèses

        print(phrase1.format(nom="Alfred", nom2="Albert"))
        print(phrase2.format(nom="John", nom2="Doe"))

        Donc, même si vous avez qu'un seul joueur (ou deux joueurs), vous pouvez toujours afficher la "string", Par contre, vous aurez une erreur, si vous avez "nom2", mais que lui donnez pas.

        Ensuite, pour votre problème, vous pouvez supprimer des éléments d'une liste. Mais pour ce faire, vous devez modifier la façon dont votre code est écrit. Vous devriez pas "hard-coded" tout ce que vous voulez dans une fonction. Apprenez à décortiquer et créer plusieurs méthodes ou classes.

        Votre problème, vient du fait que tout vos listes sont dans la méthode "jeu_before()".

        Pour obtenir qu'une seule fois une question, vous devriez avoir 2 listes. Une liste par défault (contenant tous les questions) et une liste "normal" auquel vous supprimez(ou ajouter) la question choisit. Ensuite, lorsque la liste est vide, vous aurez le choix entre recopier la liste par défault vers la liste "normal", ou arreter les questions du sujet.

        Vous n'utilisez pas de classe, donc pour modifiez des variables vous devrez utiliser "global" dans une méthode.

        Voici un exemple simple:

        from random import choice
        
        LST_VIRUS_DEFAULT = [
            "{nom} le perroquet! Tu dois répéter tout ce que dis {nom2}",
            "{nom}, interdiction de boire dans ton verre. Tu devras choisir celui d'une autre personne",
            "{nom}, bon toutou! Quand on te donne un ordre habituellement donné à un chien, exécute-le ou prends 2 gorgées. On ne peut te donner qu'un ordre toute les 30 secondes",
            "Jusqu'à nouvel ordre, dès que {nom} parle, {nom2} prend une gorgée, et inversement",
            "{nom} tu as le freezer. A chaque fois que tu t'arrêtes de bouger (discrètement) le dernier joueur à faire de même prends 2 gorgées",
            "{nom} le clapeur fou! A chaque fois que tu claques des mains tout le monde prend une gorgées (même toi)!"
        ]
        
        LST_VIRUS = LST_VIRUS_DEFAULT.copy()
        
        def jeu_before():
            # Pour modifer des variables externes à la méthode, nous utilisons "global"
            global LST_VIRUS
        
            # Si la liste est vide
            if not LST_VIRUS:
                print("\nOups, je suis vide. On recommance?\n")
                # On recopie la liste par défault, vers la liste "normal"
                LST_VIRUS = LST_VIRUS_DEFAULT.copy()
        
            question = choice(LST_VIRUS)  # On choisit une question
            LST_VIRUS.remove(question)  # On supprime cette question de la liste
        
            nom = choice(["Capitaine", "Milou", "Tintin"])
            nom2 = choice(["Foo", "Bar"])
        
            return question.format(nom=nom, nom2=nom2)
        
        
        for i in range(10):
            print(jeu_before())


        J'espère que cela vous aideras à comprendre, qu'il est préférable de créer plusieurs méthodes, plutot que de tout mettre dans une seule.

        -
        Edité par nolimitech 28 janvier 2023 à 4:18:38

        • Partager sur Facebook
        • Partager sur Twitter

        Supprimer éléments d'une liste dans une fonction

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown