Projet ISN

Résolu
Bonjour a tous,

J'ai besoin d'aide pour finir mon projet en isn. J'ai déjà programmer mon menu il reste plus que la parti jeux (tout est fait sous tkinter).

Le jeux choisi est un street fighter mais en mode pierre feuille ciseau: on définit une touche qui l'emporte sur une autre et ceux plusieurs fois, celui qui l'emporte inflige des dégâts a son adversaire et si il a plus de pv il a perdu.

Un exemple si c’était pas claire, on définit la touche a comme uppercuts et touche qui l'emporte sur la touche b qui est elle un coup de pied. Le jouer 1 enchaine les a et réalise des uppercuts quant au joueur 2 les b et réalise des coups de pieds, donc victoire du jouer 1 car a>b.

Donc j'aimerai comment coder ça, j'attends vos conseilles.

21 réponses

Résumé de la discussion

Le fil porte sur l’implémentation d’un mini-jeu Street Fighter en mode pierre-feuille-ciseaux sous tkinter, avec des dégâts infligés et des PV qui dépendent de la touche qui l’emporte. Plusieurs contributeurs détaillent la gestion des touches A et M, la détection simultanée et la mise à jour des dégâts lorsque le joueur 1 ou 2 remporte le duel. Les échanges abordent des erreurs pratiques comme NameError, l’usage du global dans scene et scene2, et la nécessité d’organiser le code par petites scènes avant d’ajouter les images. Des conseils utiles suggèrent d’affiner d’abord la mécanique en console, d’utiliser un chronomètre ou un thread pour tester un top toutes les quelques secondes, puis d’intégrer progressivement les ressources visuelles.

Bobot (l’IA à votre service)
  1. Bonjour Antoine451833,

    "J'attends vos conseils ..."

    En voila déjà un:

    https://www.commentcamarche.net/infos/25899-demander-de-l-aide-pour-vos-exercices-sur-ccm/
    0
    1. Bonjour Phil_1857

      j'avais déjà pris connaissance de ces règles. C'est pourquoi je demande des conseils pour pouvoir m'orienter et non le code complet. Je n'arrive pas sans rien, comme précisé j'ai déjà codé l'intégralité de mon menu cependant c'est ici que je bloque, je peux donc vous partager mon code mais rien dedans ne concerne mon problème. En espérant que tu puisses m'aider après ça.
      0
  2. Aucun soucis, cependant quelques détails: dans le menu le bouton qui renvoi vers la plateforme de jeux appelé "scene" ici passe d'abord par "switch" qui permet de faire un décompte et ensuite de lancer le jeux. Ici j'ai rendu inactif "song" car ça bloque le décompte. Je m'occuperais de ça après avoir coder le jeux mais si t'as une idée je suis preneur.

    #-----------------------------PARAMETRE NECESSAIRE------------------------------
    from tkinter import *
    from tkinter.messagebox import *
    import pygame
    
    #fenetre graphique
    Mafenetre=Tk()
    Mafenetre.geometry('1400x800')
    Mafenetre.attributes("-fullscreen",0)
    Mafenetre.title("STREET KO le meilleur jeu de bagarre")
    #-------------------------------PAGE D'OUVERTURE--------------------------------
    def menu1():
      global cand,fondepart
      cand=Canvas(Mafenetre,width=1400,height=800,bg='yellow')
      cand.place(x=0,y=0)
    
      image_fond=cand.create_image(0,0,image=fondepart,anchor="nw")
      cand.focus_set()
      cand.bind("<Key>",test_entree)
    
    def test_entree(event):
      touche=event.keysym
      if touche=="Return" :
        menu()
    #-------------------------------MENU ET SOUS MENU-------------------------------
    def menu():
        global can1,fond,bou1,bou2,bou3,bou5,image_fond
        can1=Canvas(Mafenetre,width=1400,height=800,bg='yellow')
        can1.place(x=0,y=0)
        image_fond=can1.create_image(0,0,image=fond,anchor="nw")
    
        #bouton
        bou1=Button(Mafenetre,text="Quitter",fg="#ffffff",width=250,height=50,image=bouton,compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=quitter)
        bou1.place(x=65,y=500)
        bou2=Button(Mafenetre,text="Règles",fg="#ffffff",width=250,height=50,image=bouton,compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=regles)
        bou2.place(x=65,y=240)
        bou3=Button(Mafenetre,text="Commencer",fg="#ffffff",width=250,height=50,image=bouton,compound=CENTER,borderwidth=0,font=('Fixedsys', '20'), command=switch)
        bou3.place(x=65,y=110)
        bou5=Button(Mafenetre,text="Histoire",fg="#ffffff",width=250,height=50,image=bouton,compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=histoire)
        bou5.place(x=65,y=370)
        #griser
        #bool_hitoire==False
    
        #if bool_hitoire==False :
            #bou2=Button(Mafenetre,text="Règles",fg="#ffffff",width=220,height=40,image=bouton_gris,compound=CENTER,borderwidth=0,command=menu)
            #bou2.place(x=215,y=240)
        #else :
            #bou2=Button(Mafenetre,text="Règles",fg="#ffffff",width=220,height=40,image=bouton,compound=CENTER,borderwidth=0,command=regles)
            #bou2.place(x=215,y=240)
    
    def reset():
        global bou1,bou2,bou3,bou5
        bou1.place_forget()
        bou2.place_forget()
        bou3.place_forget()
        bou5.place_forget()
    
    def histoire():
        global can1,image_fond,bou4, bou6,ennonce1, bou8
        reset()
        can1.itemconfig(image_fond,image=H)
        can1.focus_set()
        #texte
        text1="Il fut un temps où les guerres faisaient rage. Impac-"
        text2="tant la galaxie entière des millions de victimes ont"
        text3="été déplorés. L'objectif était toujours le même le dé-"
        text4="sir ardent d'être le plus puissant. Les dirigeants des"
        text5="quatre-coints de la galaxie en perdaient la raison."
        text6="C'est alors qu'un scientifique neutre créa deux comba-"
        text7="ttants hors-pairs, Rut et Bob. Tout juste sortis du"
        text8="four ils etaient déjà impliqués dans le combat. Alors"
        text9="dotés de capacités sans pareil, ils mirent fin à ces"
        text10="guerres et acquierent de nouveaux pouvoirs. Des années"
        text11="plus tard ils sont de nouveau reunis mais cette fois"
        text12="pour s'affronter. Le combat aura lieu à la plage 4586,"
        text13="sous un soleil tropical où les deux compagnons ont par"
        text14="le passé mis un therme à ces guerres. L'issue du com"
        text15="-bat sera décisive pour le futur. Afin d'en connaître"
        text16="d'avantage veuillez prendre connaissance des règles."
        textefinal=text1+'\n'+text2+'\n'+text3+'\n'+text4+'\n'+text5+'\n'+text6+'\n'+text7+'\n'+text8+'\n'+text9+'\n'+text10+'\n'+text11+'\n'+text12+'\n'+text13+'\n'+text14+'\n'+text15+'\n'+text16
        ennonce1=can1.create_text(895,340,text=textefinal,fil="white", font=('Fixedsys', '18'))
        #bouton
        bou4=Button(Mafenetre,text="Menu principal",fg="#ffffff",width=250,height=50,image=bouton, compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=menu)
        bou4.place(x=450,y=690)
        bou6=Button(Mafenetre,text="Règles",fg="#ffffff",width=250,height=50,image=bouton3, foreground="black", compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=reset_regles)
        bou6.place(x=790,y=690)
        bou8=Button(Mafenetre,text="règles.",fg="#ffffff",width=115,height=25,image=bouton2, compound=CENTER,borderwidth=0, font=('Fixedsys', '18'), command=reset_regles)
        bou8.place(x=1180,y=550)
    
    def reset_histoire():
        global bou7,bou9, can1,enonce2
        bou7.place_forget()
        bou9.place_forget()
        can1.itemconfig(ennonce2,text="")
        histoire()
    
    def regles():
        global can1,image_fond, bou7, bou9,ennonce2
        reset()
        can1.itemconfig(image_fond,image=R)
        can1.focus_set()
        #texte
        text1="Suivant le personnage que vous in-"
        text2="carnez, Rut ou Bob, votre objectif"
        text3="est de terrasser votre adversaire."
        text4="Pour se faire vous devez enchaîner"
        text5="les combinaisons de touche afin de"
        text6="gagner le combat. Ainsi il est con-"
        text7="seillé de prendre connaissance des"
        text8="commandes afin d'etablir une stra-"
        text9="tégie solide. L'enjeu de ce combat"
        text10="est de déterminer le futur époux"
        text11="de la princesse Sofya tant convoi-"
        text12="té. Donner tout ce que vous avez"
        text13="pour chopper cette BOMBE !!!!!!!!!"
        textefinal2=text1+'\n'+text2+'\n'+text3+'\n'+text4+'\n'+text5+'\n'+text6+'\n'+text7+'\n'+text8+'\n'+text9+'\n'+text10+'\n'+text11+'\n'+text12+'\n'+text13
        ennonce2=can1.create_text(370,365,text=textefinal2,fil="white", font=('Fixedsys', '18'))
        #bouton
        bou7=Button(Mafenetre,text="Menu principal",fg="#ffffff",width=250,height=50,image=bouton, compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=menu)
        bou7.place(x=450,y=690)
        bou9=Button(Mafenetre,text="Histoire",fg="#ffffff",width=250,height=50,image=bouton3, foreground="black", compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=reset_histoire)
        bou9.place(x=790,y=690)
    
    def reset_regles():
        global bou4,bou6, can1,enonce1, bou8
        bou4.place_forget()
        bou6.place_forget()
        bou8.place_forget()
        can1.itemconfig(ennonce1,text="")
        regles()
    
    def quitter():
        if askyesno("Fenêtre décisive", "Êtes-vous sûr de vouloir faire ça?"):
            Mafenetre.destroy()
        else:
            showinfo("Fenêtre du meilleur choix", "Vous avez bien raison!")
    #-------------------------------------JEUX--------------------------------------
    #fonction avant jeux
    def song():
        launched = True
        pygame.init()
        song = pygame.mixer.Sound("fight_song.wav")
        song.play()
        while launched:
            for even in pygame.event.get():
                if even.type == pygame.QUIT:
                    launched = False
    
    def switch():
        global Pchoisi
        reset()
        #song()
        can1.itemconfig(image_fond, image=mes_photos[Pchoisi])
        Pchoisi += 1
        if Pchoisi==5:
            pass
            scene()
        else :
            Mafenetre.after(1000, switch)
    
    p1=PhotoImage(file="Decort.png")
    p2=PhotoImage(file="3.png")
    p3=PhotoImage(file="2.png")
    p4=PhotoImage(file="1.png")
    p5=PhotoImage(file="Pdecort.png")
    
    mes_photos = [p2, p3, p4, p5 ,p1]
    Pchoisi = 0
    
    #scene de combat
    def scene():
        global can1,PosX,PosY
        reset()
        can1.itemconfig(image_fond,image=D)
        can1.focus_set()
        #bouton
        bou7 =Button(Mafenetre, text="pause", width =10,borderwidth=0, command=pause)
        bou7.place(x=100,y=720)
    
    def pause():
        global pause
        pause=can.create_text(250,250,font=('Fixedsys',18),text="PAUSE")
    
    #-----------------------------PARAMETRE NECESSAIRE------------------------------
    #importation des images
    fond=PhotoImage(file="Menu.png")
    fondepart=PhotoImage(file="Pmenu.png")
    D=PhotoImage(file="Decort.png")
    H=PhotoImage(file="Histoire.png")
    R=PhotoImage(file="Regles.png")
    bouton=PhotoImage(file="bouton.png")
    bouton2=PhotoImage(file="bouton2.png")
    bouton3=PhotoImage(file="bouton3.png")
    PosX=200
    PosY=200
    
    #lancement du menu
    menu1()
    Mafenetre.mainloop()
    0
    1. Ah ok, au début tu disais (tout est fait sous tkinter). mais je vois que tu a aussi Pygame

      Moi je ne l'ai pas ... mais bon

      En gros, ce que tu veux c'est capter les touches a et b dans ta fonction test_entree(event)

      et si appui a et joueur = 1 et ensuite appui sur b et joueur = 2 alors afficher 'c'est 1 qui gagne !'

      C'est ça ?
      0
      1. oui mais ne t'en fait pas pygame sert uniquement pour le son et c'est pas fonctionnel encore donc tu peux l'enlever. la fonction test_entree(event) sert uniquement a afficher l'image de présentation du jeux, après avoir appuyé sur "entré" on arrive au menu.

        J'aimerai créer une nouvelle fonction qui effectivement capte des touche par exemple: "a" "b" et "c" "d". Dans cette exemple on définit a<c et b>d et vice versa. On attribut les touches "a" "b" au joueur 1 et les touches "c" "d" au joueur 2. Et toutes les 3s (chiffre qui peut varier) les joueurs 1 et 2 appui sur l'une des touches qui lui est assignés, et en fonction ils perdent des pv. Celui qui n'a plus de pv a perdu, c'est game over. Enfin on assimile a chaque touché un coup différent mais si ca devient trop compliqué j'avais pensées a un gif tout simplement qui toute les 3s envoi un coup.

        Dit moi si t'as tout compris, j'ai essayé d’être le plus claire possible. Merci d'ailleurs d'interagir avec moi.
        0
    2. Ah ok,

      Apres un laps de temps, le programme donnerait un top, et là, les 2 joueurs appuient en même
      temps chacun sur une touche et si 1 a tapé "a" et 2 a tapé "c", c'est 2 qui gagne ?

      Là, on décrémente le nombre de points de vie de 1
      On teste si les pv de 1 sont =0 => game over, sinon, on continue

      Si ils jouent en même temps sur le même ordi, tu as intérêt a choisir des touches extrêmes du
      clavier, par exemple "a", "q" et "p", "m" !

      Il est touffu ton code !
      Il faut mieux commencer petit et agrémenter petit à petit

      Moi, si j'avais à faire ça, je commencerais par chercher comment programmer un chrono pour faire un top toutes les 3 secondes, en mode console déjà, pour tester plus rapidement tes différents essais, pas avec une interface graphique

      Ensuite, je reviendrais à une interface, mais pas avec tout ce bazar de photos et de textes d'explications, juste un petit truc pour tester le top ! les appuis de touches et afficher "c'est Bob qui gagne ! " et "attention Rut, plus que 5 pv" au fur et à mesure de la décrémentation des points
      et le message "game over" à la fin

      Tu sais déjà comment capter un appui de touche avec bind et comment récupérer quelle touche avec event.keysym

      Ensuite, quand ca tourne, tu peux ajouter tout le reste (photos, textes d'explications, etc …)

      Enfin, si je peux me permettre: :-)

      Ecris "Pour ce faire" plutôt que "Pour se faire"
      "tant convoitée" plutôt que "tant convoité"
      "mettre un terme" plutôt que "mettre un therme" (les thermes, c'est autre chose …)
      0
      1. Oui c'est exactement ça pour " si 1 a tapé "a" et 2 a tapé "c", c'est 2 qui gagne ? "

        Très bien merci mon pour tes conseils je vais voir tout ça, j'ai jusqu’à fin mai j’espère que j'aurai le temps mdr

        Et oui tu as bien fait de me corriger, je les avais pas vu, merci !

        Je reviendrais surement en cas de soucis, donc n’hésite pas a revenir. Merci encore
        0
    3. Pas de problème !

      Pour ton chrono, il faut que tu importes la bibliothèque datetime

      Sur le net il y a des tutos pour l'exploiter …
      0
      1. Salut, j'ai avancé sur le projet et suivi tes conseils. Enfin pas tous mdr. Pour le chrono avec datetime j'ai pas réussi a trouver ce que je voulais donc j'ai fait comme ça:

        from threading import Thread, Event
        
        class Chrono(Thread):
            def __init__(self, event):
                Thread.__init__(self)
                self.event = event
        
            def run(self):
                while not self.event.wait(3):
                    print("salut")
        
        flag_stop = Event()
        chrono = Chrono(flag_stop)
        chrono.start()
        
        #Quand tu veux l'arrêter :
        flag_stop.set()
        


        Le probleme c'est que ici "salut" ne se répète pas toutes les 3s
        donc je voulais avoir ton avis là-dessus.
        0
    4. Si ca marche pourquoi pas ?

      A quoi sert la ligne time.sleep(50000) ? ca marche sans ça ...

      On peut aussi faire ça:

      from threading import *
       
      def top():
      	t = Timer(3.0, top)
      	t.start()
      	print("Top !")
       
      top()
      
      0
      1. c'est vrai mais le probleme c'est que ca matche pas avec l'objectif. Donc je vais utiliser:

        from threading import Thread, Event
        
        class Chrono(Thread):
            def __init__(self, event):
                Thread.__init__(self)
                self.event = event
        
            def run(self):
                while not self.event.wait(3):
                    print("salut")
        
        flag_stop = Event()
        chrono = Chrono(flag_stop)
        chrono.start()
        
        #Quand tu veux l'arrêter :
        flag_stop.set()


        Du coup maintenant il faut que je fasse l’attribution des touches c'est ça ?
        0
      2. Petite update, oubli ce que t'as vu plus haut: j'ai utilisé un autre code pour relancer la fonction toutes les 3s et j'ai ensuite importe tkinter mais j'ai un message d'erreur : assert group is None, "group argument must be None for now". Voici le code, est ce que tu sais comment régler ça?
        from tkinter import *
        from threading import Thread, Event
        
        Mafenetre=Tk()
        Mafenetre.geometry('1400x800')
        Mafenetre.attributes("-fullscreen",0)
        Mafenetre.title("STREET KO le meilleur jeu de bagarre")
        can1=Canvas(Mafenetre,width=1400,height=800,bg='yellow')
        can1.place(x=0,y=0)
        
        class Chrono(Thread):
            def init(self, event):
                Thread.init(self)
                self.event = event
        
            def run(self):
                while not self.event.wait(3):
                    print("salut")
        
        flag_stop = Event()
        chrono = Chrono(flag_stop)
        
        chrono.start()
        Mafenetre.mainloop()
        0
    5. Bonjour Antoine451833,

      Qu'entends-tu par "ca matche pas avec l'objectif." ?

      Le code que je t'ai donné écrit Top! sur l'écran toutes les 3 secondes, non ?

      Mais bon ..... puisque tu as trouvé encore autre chose ...

      A part ça, as-tu testé le code de ton message de 19h26 ?

      Déjà, là, ca ne marche pas : il ne se passe rien, la fonction run de la classe Chrono n'est jamais

      appelée !

      D'où sors-tu cette mécanique ?

      Tu fait des copier/coller sans vraiment comprendre, non ?
      0
      1. Bonjour Phil_1857

        J'ai échangé avec une communauté de fan python sur discord et on est arrivé a ce code. Mais il est vrai que je n'est pas compris. Je me suis laissé emballé, il y a eu beaucoup de rebondissement pour pas grand chose mdr.

        C'est vrai que ton code me parait bien, je vais étudier ça.

        Avec mon binôme on va repartir sur quelque chose plus a notre niveau. Je t'informerais des éventuelles avancé et de nos soucis. Merci d’interagir avec nous.
        0
        1. Super!

          Toujours partir d'un truc simple et ajouter petit à petit

          Je ne sais pas si ça peut aider (il faut voir), mais voici une nouvelle direction en Tkinter, pas en mode console :

          def repete():
           
                 le code
          
                  mon_canvas.after(3000, repete)
          


          une fonction qui s'appelle elle-même toutes les 3 secondes ... à voir si ca peut aller ou pas
          (boucle infinie, dedans, il faut un test if pour arrêter à un moment donné)
          0
          1. Salut Phil, on a beaucoup avancé, j'avais pas vu ton dernier post donc j'ai fait différemment. C'est encore le début tout n'est pas totalement opérationnel mais on on a une syntax erreur ligne 19 et 21, ça doit être tout bête mais je vois pas le pb. Dit moi ce que tu en penses et si tu sais comment régler ça. Merci pour tes retours.

            def scene():
                joueur1=[R,Rpoint,Rpoint2]
                joueur2=[B,Bpoint,Bpied]
                touches = []
                can1.focus_set()
                can1.bind("<KeyPress>",pressed)
                can1.bind("<KeyRelease>",released)
                scene2()
            
            def scene2():
                global joueur1,joueur2
                if t=="A" and t in touches:
                    can1.create_image(100,100,image=joueur1[0])
                    toucheA="A"
                if t=="M" and t in touches:
                    can1.create_image(200,100,image=joueur2[0])
                    toucheB="M"
            
                if toucheA="A" and toucheB="M" :
                    score1=score1+1
                if toucheA="A" and toucheB="P" :
                    score2=score2+1
                #bouton
                bou7 =Button(Mafenetre, text="pause", width =10,borderwidth=0, command=pause)
                bou7.place(x=100,y=720)
                can1.after(100,scene2)
            
            def pressed(event):
                #on rajoute la touche pressée dans la liste touches si elle n’y est pas déjà
                global touches
                t = event.keysym.upper()
                if not t in touches:
                    touches.append(t)
            
            
            def released(event):
                #on enlève la touche relachée de la liste touches
                t = event.keysym.upper()
                if t in touches:
                    touches.remove(t)
            0
            1. Salut Antoine_451833,

              Ca saute aux yeux : tu as fait l'erreur classique que l'on peut faire dans n'importe quel langage de programmation, et pourtant lignes 12 et 15, c'est correct

              Confondre toucheA = 'a' et toucheA == 'a'
              0
              1. Mais oui bien-sur c’était tout bête. D'ailleurs cette parti du code (scene2) c'est notre prof qui nous a dit qu'elle était essentielle mais si je comprends: si la touche pressée est dans ma définition touche = [ ] alors le jours 1 prend l'image correspondante, idem pour joueur 2 et ensuite le score vari en fonction. C'est bien ça ?
                0
            2. si touche = A majuscule et qu'elle est dans la liste, affichage de l'image joueur[1][0]

              idem avec la touche M …

              Votre prof vous donne le code tout fait ?
              0
              1. D'accord je vois.

                Il nous aide en nous mettant sur la piste et après c'est a nous de comprendre pour finir et corriger les beugs.

                Du coup j'ai fait ça comme ça, donc si je comprends bien quand j’appuie sur "A" je devrais avoir l'image R. Mais j'ai "if t in touches: NameError: name 'touches' is not defined". Pourtant je lance d'abord ma fonction scène donc je créais bien touche et après j'envoie scene2 donc a quoi c'est dû?

                R=PhotoImage(file="rut.png")
                Rpoint=PhotoImage(file="rut_point.png")
                Rpoint2=PhotoImage(file="rut_point2.png")
                B=PhotoImage(file="bob.png")
                Bpoint=PhotoImage(file="bob_point.png")
                Bpied=PhotoImage(file="bob_pied.png")
                
                def scene():
                    joueur1=[R,Rpoint,Rpoint2]
                    joueur2=[B,Bpoint,Bpied]
                    touches = ["A","M"]
                    can1.focus_set()
                    can1.bind("<KeyPress>",pressed)
                    can1.bind("<KeyRelease>",released)
                    scene2()
                
                def scene2():
                    global joueur1,joueur2
                    t = event.keysym.upper()
                    if t=="A" and t in touches:
                        can1.create_image(100,100,image=joueur1[0])
                        toucheA="A"
                    if t=="M" and t in touches:
                        can1.create_image(200,100,image=joueur2[0])
                        toucheB="M"
                
                    if toucheA=="A" and toucheB=="M" :
                        score1=score1+1
                    if toucheA=="A" and toucheB=="P" :
                        score2=score2+1
                    #bouton
                    bou7 =Button(Mafenetre, text="pause", width =10,borderwidth=0, command=pause)
                    bou7.place(x=100,y=720)
                    can1.after(100,scene2)
                
                def pressed(event):
                    #on rajoute la touche pressée dans la liste touches si elle n’y est pas déjà
                    global touches
                    t = event.keysym.upper()
                    if not t in touches:
                        touches.append(t)
                
                
                def released(event):
                    #on enlève la touche relachée de la liste touches
                    t = event.keysym.upper()
                    if t in touches:
                        touches.remove(t)
                0
            3. Tu devrais mettre le code complet qu'on y voie clair ...

              En attendant, ton problème est un problème d'espaces de noms

              Je regarde ton code précédent, car tu as fait des modifs dans ce message-ci

              La variable touches est initialisée dans la fonction scene() : touches = [] (liste vide)

              Donc elle est connue uniquement dans cette fonction, mais pas en dehors de celle-ci
              et donc dans scene2(), elle est inconnue

              Un indice:

              Parmi les 4 fonctions, il y en a une qui est bien écrite : pressed(), la 1ere ligne de cette fonction est importante ...
              0
              1. J'imagine que tu fais référence au: global touches dans pressed()

                Cependant avant de t'envoyer j'avais mis en global touches pour que scene2() puisse l'utiliser mais la le programme ne réagissais plus a l'appuie des touches (avant comme réaction c’était une erreur) j'avais donc enlevé en me disais que c’était autre chose.

                Du coup soit tu fais pas référence au global soit c'est vraiment ça et du coup nouveau probleme mdr: line 194, in scene2
                t = event.keysym.upper()
                NameError: name 'event' is not defined


                Je renvoie la totalité du code du coup au risque que ça soit "toufu":
                #-----------------------------PARAMETRE NECESSAIRE------------------------------
                from tkinter import *
                from tkinter.messagebox import *
                import pygame
                
                #fenetre graphique
                Mafenetre=Tk()
                Mafenetre.geometry('1400x800')
                Mafenetre.attributes("-fullscreen",0)
                Mafenetre.title("STREET KO le meilleur jeu de bagarre")
                #-------------------------------PAGE D'OUVERTURE--------------------------------
                def menu1():
                  global cand,fondepart
                  cand=Canvas(Mafenetre,width=1400,height=800,bg='yellow')
                  cand.place(x=0,y=0)
                
                  image_fond=cand.create_image(0,0,image=fondepart,anchor="nw")
                  cand.focus_set()
                  cand.bind("<Key>",test_entree)
                
                def test_entree(event):
                  touche=event.keysym
                  if touche=="Return" :
                    menu()
                #-------------------------------MENU ET SOUS MENU-------------------------------
                def menu():
                    global can1,fond,bou1,bou2,bou3,bou5,image_fond
                    can1=Canvas(Mafenetre,width=1400,height=800,bg='yellow')
                    can1.place(x=0,y=0)
                    image_fond=can1.create_image(0,0,image=fond,anchor="nw")
                
                    #bouton
                    bou1=Button(Mafenetre,text="Quitter",fg="#ffffff",width=250,height=50,image=bouton,compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=quitter)
                    bou1.place(x=65,y=500)
                    bou2=Button(Mafenetre,text="Règles",fg="#ffffff",width=250,height=50,image=bouton,compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=regles)
                    bou2.place(x=65,y=240)
                    bou3=Button(Mafenetre,text="Commencer",fg="#ffffff",width=250,height=50,image=bouton,compound=CENTER,borderwidth=0,font=('Fixedsys', '20'), command=switch)
                    bou3.place(x=65,y=110)
                    bou5=Button(Mafenetre,text="Histoire",fg="#ffffff",width=250,height=50,image=bouton,compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=histoire)
                    bou5.place(x=65,y=370)
                    #griser
                    #bool_hitoire==False
                
                    #if bool_hitoire==False :
                        #bou2=Button(Mafenetre,text="Règles",fg="#ffffff",width=220,height=40,image=bouton_gris,compound=CENTER,borderwidth=0,command=menu)
                        #bou2.place(x=215,y=240)
                    #else :
                        #bou2=Button(Mafenetre,text="Règles",fg="#ffffff",width=220,height=40,image=bouton,compound=CENTER,borderwidth=0,command=regles)
                        #bou2.place(x=215,y=240)
                
                def reset():
                    global bou1,bou2,bou3,bou5
                    bou1.place_forget()
                    bou2.place_forget()
                    bou3.place_forget()
                    bou5.place_forget()
                
                def histoire():
                    global can1,image_fond,bou4, bou6,ennonce1, bou8
                    reset()
                    can1.itemconfig(image_fond,image=H)
                    can1.focus_set()
                    #texte
                    text1="Il fut un temps où les guerres faisaient rage. Impac-"
                    text2="tant la galaxie entière des millions de victimes ont"
                    text3="été déplorés. L'objectif était toujours le même le dé-"
                    text4="sir ardent d'être le plus puissant. Les dirigeants des"
                    text5="quatre-coints de la galaxie en perdaient la raison."
                    text6="C'est alors qu'un scientifique neutre créa deux comba-"
                    text7="ttants hors-pairs, Rut et Bob. Tout juste sortis du"
                    text8="four ils etaient déjà impliqués dans le combat. Alors"
                    text9="dotés de capacités sans pareil, ils mirent fin à ces"
                    text10="guerres et acquierent de nouveaux pouvoirs. Des années"
                    text11="plus tard ils sont de nouveau reunis mais cette fois"
                    text12="pour s'affronter. Le combat aura lieu à la plage 4586,"
                    text13="sous un soleil tropical où les deux compagnons ont par"
                    text14="le passé mis un terme à ces guerres. L'issue du com"
                    text15="-bat sera décisive pour le futur. Afin d'en connaître"
                    text16="d'avantage veuillez prendre connaissance des règles."
                    textefinal=text1+'\n'+text2+'\n'+text3+'\n'+text4+'\n'+text5+'\n'+text6+'\n'+text7+'\n'+text8+'\n'+text9+'\n'+text10+'\n'+text11+'\n'+text12+'\n'+text13+'\n'+text14+'\n'+text15+'\n'+text16
                    ennonce1=can1.create_text(895,340,text=textefinal,fil="white", font=('Fixedsys', '18'))
                    #bouton
                    bou4=Button(Mafenetre,text="Menu principal",fg="#ffffff",width=250,height=50,image=bouton, compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=menu)
                    bou4.place(x=450,y=690)
                    bou6=Button(Mafenetre,text="Règles",fg="#ffffff",width=250,height=50,image=bouton3, foreground="black", compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=reset_regles)
                    bou6.place(x=790,y=690)
                    bou8=Button(Mafenetre,text="règles.",fg="#ffffff",width=115,height=25,image=bouton2, compound=CENTER,borderwidth=0, font=('Fixedsys', '18'), command=reset_regles)
                    bou8.place(x=1180,y=550)
                
                def reset_histoire():
                    global bou7,bou9, can1,enonce2
                    bou7.place_forget()
                    bou9.place_forget()
                    can1.itemconfig(ennonce2,text="")
                    histoire()
                
                def regles():
                    global can1,image_fond, bou7, bou9,ennonce2
                    reset()
                    can1.itemconfig(image_fond,image=R)
                    can1.focus_set()
                    #texte
                    text1="Suivant le personnage que vous in-"
                    text2="carnez, Rut ou Bob, votre objectif"
                    text3="est de terrasser votre adversaire."
                    text4="Pour ce faire vous devez enchaîner"
                    text5="les combinaisons de touche afin de"
                    text6="gagner le combat. Ainsi il est con-"
                    text7="seillé de prendre connaissance des"
                    text8="commandes afin d'etablir une stra-"
                    text9="tégie solide. L'enjeu de ce combat"
                    text10="est de déterminer le futur époux"
                    text11="de la princesse Sofya tant convoi-"
                    text12="tée. Donner tout ce que vous avez"
                    text13="pour chopper cette BOMBE !!!!!!!!!"
                    textefinal2=text1+'\n'+text2+'\n'+text3+'\n'+text4+'\n'+text5+'\n'+text6+'\n'+text7+'\n'+text8+'\n'+text9+'\n'+text10+'\n'+text11+'\n'+text12+'\n'+text13
                    ennonce2=can1.create_text(370,365,text=textefinal2,fil="white", font=('Fixedsys', '18'))
                    #bouton
                    bou7=Button(Mafenetre,text="Menu principal",fg="#ffffff",width=250,height=50,image=bouton, compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=menu)
                    bou7.place(x=450,y=690)
                    bou9=Button(Mafenetre,text="Histoire",fg="#ffffff",width=250,height=50,image=bouton3, foreground="black", compound=CENTER,borderwidth=0, font=('Fixedsys', '20'), command=reset_histoire)
                    bou9.place(x=790,y=690)
                
                def reset_regles():
                    global bou4,bou6, can1,enonce1, bou8
                    bou4.place_forget()
                    bou6.place_forget()
                    bou8.place_forget()
                    can1.itemconfig(ennonce1,text="")
                    regles()
                
                def quitter():
                    if askyesno("Fenêtre décisive", "Êtes-vous sûr de vouloir faire ça?"):
                        Mafenetre.destroy()
                    else:
                        showinfo("Fenêtre du meilleur choix", "Vous avez bien raison!")
                
                
                #------------------------------------JEUX---------------------------------------
                #-----------------------------fonction avant jeux-------------------------------
                def song():
                    launched = True
                    pygame.init()
                    song = pygame.mixer.Sound("fight_song.wav")
                    song.play()
                    while launched:
                        for even in pygame.event.get():
                            if even.type == pygame.QUIT:
                                launched = False
                
                def switch():
                    global Pchoisi
                    reset()
                    #song()
                    can1.itemconfig(image_fond, image=mes_photos[Pchoisi])
                    Pchoisi += 1
                    if Pchoisi==5:
                        can1.itemconfig(image_fond,image=D)
                        scene()
                    else :
                        Mafenetre.after(100, switch)
                
                #importation des images
                p1=PhotoImage(file="Decort.png")
                p2=PhotoImage(file="3.png")
                p3=PhotoImage(file="2.png")
                p4=PhotoImage(file="1.png")
                p5=PhotoImage(file="Pdecort.png")
                
                mes_photos = [p2, p3, p4, p5 ,p1]
                Pchoisi = 0
                
                #-------------------------------scene de combat---------------------------------
                #importation des images
                R=PhotoImage(file="rut.png")
                Rpoint=PhotoImage(file="rut_point.png")
                Rpoint2=PhotoImage(file="rut_point2.png")
                B=PhotoImage(file="bob.png")
                Bpoint=PhotoImage(file="bob_point.png")
                Bpied=PhotoImage(file="bob_pied.png")
                
                def scene():
                    global touches
                    joueur1=[R,Rpoint,Rpoint2]
                    joueur2=[B,Bpoint,Bpied]
                    touches = ["A","M"]
                    can1.focus_set()
                    can1.bind("<KeyPress>",pressed)
                    can1.bind("<KeyRelease>",released)
                    scene2()
                
                def scene2():
                    global joueur1,joueur2,touches
                    t = event.keysym.upper()
                    if t=="A" and t in touches:
                        can1.create_image(100,100,image=joueur1[0])
                        toucheA="A"
                    if t=="M" and t in touches:
                        can1.create_image(200,100,image=joueur2[0])
                        toucheB="M"
                
                    if toucheA=="A" and toucheB=="M" :
                        score1=score1+1
                    if toucheA=="A" and toucheB=="P" :
                        score2=score2+1
                    #bouton
                    bou7 =Button(Mafenetre, text="pause", width =10,borderwidth=0, command=pause)
                    bou7.place(x=100,y=720)
                    can1.after(100,scene2)
                
                def pressed(event):
                    #on rajoute la touche pressée dans la liste touches si elle n’y est pas déjà
                    global touches
                    t = event.keysym.upper()
                    if not t in touches:
                        touches.append(t)
                
                
                def released(event):
                    #on enlève la touche relachée de la liste touches
                    global touches
                    t = event.keysym.upper()
                    if t in touches:
                        touches.remove(t)
                
                
                def pause():
                    global pause
                    pass
                
                #-----------------------------PARAMETRE NECESSAIRE------------------------------
                #importation des images
                fond=PhotoImage(file="Menu.png")
                fondepart=PhotoImage(file="Pmenu.png")
                D=PhotoImage(file="Decort.png")
                H=PhotoImage(file="Histoire.png")
                R=PhotoImage(file="Regles.png")
                bouton=PhotoImage(file="bouton.png")
                bouton2=PhotoImage(file="bouton2.png")
                bouton3=PhotoImage(file="bouton3.png")
                PosX=200
                PosY=200
                
                #lancement du menu
                menu1()
                Mafenetre.mainloop()
                0
                1. Je vais regarder tout ça, mais en attendant, il faut global touches dans toutes les fonctions ou

                  touches est utilisée, touches est une variable globale et donc il faut l'inclure partout

                  le code est touffu, mais je t'avais dit de ne pas inclure de suite les textes et les images pour tester la mécanique globale,

                  ce n'est pas indispensable

                  Je n'ai pas tes images, mais je vais me débrouiller ...
                  0
                  1. J'ai incrusté touches partout ou c’était nécessaire il me semble.

                    Si tu veux envoie moi ton e-mail et je t’envoie le tout en fichier compressé
                    0
                    1. in scene2
                      t = event.keysym.upper()
                      NameError: name 'event' is not defined


                      le nom 'event' n'est pas défini

                      C'est évident: à l'intérieur de scene2, event, il sortirait d'où ?

                      Regarde la définition de cette fonction avec celle de pressed par exemple …

                      Tu ne vois pas une différence ?
                      0
                      1. Donc j'imagine qu'il faut faire comme ça:

                        def scene2(event):
                            global joueur1,joueur2,touches
                            t = event.keysym.upper()
                            if t=="A" and t in touches:
                                can1.create_image(100,100,image=joueur1[0])
                                toucheA="A"
                            if t=="M" and t in touches:
                                can1.create_image(200,100,image=joueur2[0])
                                toucheB="M"
                        
                            if toucheA=="A" and toucheB=="M" :
                                score1=score1+1
                            if toucheA=="A" and toucheB=="P" :
                                score2=score2+1
                            #bouton
                            bou7 =Button(Mafenetre, text="pause", width =10,borderwidth=0, command=pause)
                            bou7.place(x=100,y=720)
                            can1.after(100,scene2)


                        Cependant maintenant j'ai ça :( j'ai l'impression de ne pas avancer
                        in scene
                        scene2()
                        TypeError: scene2() missing 1 required positional argument: 'event'
                        0
                    2. Je t'avais dit de commencer simple quel foutoir avec toutes ces images et définies a plusieurs

                      endroits !

                      On pouvait commencer avec des boutons normaux pour tester

                      Sinon, tu savais qu'on pouvait faire ça:
                      info = '''
                      Il fut un temps où les guerres faisaient rage.
                      Impactant la galaxie entière des millions de victimes ont
                      été déplorés
                      '''
                      enonce1=can1.create_text(895,340,text=info, fill ="white", font=('Fixedsys', '18'))
                      


                      fill avec 2 l !

                      Plus simple que tout tes text1=, text2=, ...
                      0
                      1. J'ai lancé pour voir le résultat. Mais info apparait comme une fenêtre appart sans design et le but de notre jeux est de proposer une interface conforme aux jeux vidéos, tu n'as pas les photos donc tu vois pas l’intérêt d'avoir text1, text2.. Mais ils sont essentielles.

                        En tout cas merci d'avoir proposer une intervalle plus allégé.
                        0
                    3. Comme je te le disais, commencer petit et ajouter ensuite ...

                      Trop compliqué ton code avec tous ces boutons que l'on créé puis que l'on cache, et que l'on reset, et toutes ces définitions de Canvas inutiles, et il y en a partout !
                      Et ce 1er appui sur Return qui affiche le menu ...

                      A mon avis, on n'a pas besoin de tout ça ! il y a plus simple

                      J'ai fait un début de code tout simple, teste-le et regarde bien la structure:

                      _ les définitions de fonctions en 1er
                      _ puis l'interface graphique avec Canvas et boutons, tout objet graphique doit regroupé ici

                      L'appui sur les boutons règles et histoire affiche le texte dans une fenêtre secondaire qui s'ouvre
                      Les textes sont définis en 1 seul bloc, c'est plus facile pour modifier ou ajouter des lignes
                      Il y a a juste à cliquer sur la croix en haut pour fermer les fenêtres une fois lues

                      Les bouton restent tout le temps en bas de fenêtre, mais pourquoi pas ?
                      pourquoi les cacher ? Ca n'empêche pas de jouer

                      Ensuite il faut ajouter le code pour déclencher le jeu ...

                      # -*- coding:Latin-1 -*-
                      
                      from tkinter import *
                      
                      def regles():
                      	''' affichage des règles dans une fenetre secondaire '''
                      
                      	fenetre_secondaire = Toplevel(Mafenetre)
                      	fenetre_secondaire.geometry('410x200+450+300')
                      
                      	zone_graphique_secondaire = Canvas(fenetre_secondaire,bg='ivory',height=190,width=400)
                      	zone_graphique_secondaire.place(x = 5,y = 5)
                      
                      	info = '''
                      Suivant le personnage que vous incarnez, Rut ou Bob, votre objectif
                      est de terrasser votre adversaire.
                      Pour ce faire vous devez enchaîner les combinaisons de touches afin de
                      gagner le combat.
                      Ainsi il est conseillé de prendre connaissance des commandes
                      afin d'etablir une stratégie solide.
                      L'enjeu de ce combat est de déterminer le futur époux de la princesse Sofya
                      tant convoitée. Donnez tout ce que vous avez pour la séduire !!!!!!!!!
                      	'''
                      	zone_graphique_secondaire.create_text(5,5,text=info, anchor = NW, fill = 'blue')
                      
                      def histoire():
                      	''' affichage de l'histoire dans une fenetre secondaire '''
                      	fenetre_secondaire = Toplevel(Mafenetre)
                      	fenetre_secondaire.geometry('410x200+450+300')
                      
                      	zone_graphique_secondaire = Canvas(fenetre_secondaire,bg='ivory',height=190,width=400)
                      	zone_graphique_secondaire.place(x = 5,y = 5)
                      
                      	info = '''
                      Il fut un temps où les guerres faisaient rage.
                      Impactant la galaxie entière des millions de victimes ont été déplorés.
                      L'objectif était toujours le même le désir ardent d'être le plus puissant.
                      etc .........
                      	'''
                      	zone_graphique_secondaire.create_text(5,5,text=info,anchor = NW, fill = 'blue')
                      
                      def switch():
                      	''' '''
                      	pass
                      
                      
                      #Interface graphique
                      Mafenetre=Tk()
                      Mafenetre.geometry('700x400+300+100')
                      Mafenetre.title("STREET KO le meilleur jeu de bagarre")
                      
                      cand=Canvas(Mafenetre,bg='yellow', height=350, width=700)
                      cand.place(x=0,y=0)
                      
                      bou2=Button(Mafenetre,text="Règles",command=regles)
                      bou2.place(x=10,y=370)
                      
                      bou3=Button(Mafenetre,text="Commencer", command=switch)
                      bou3.place(x=75,y=370)
                      
                      bou5=Button(Mafenetre,text="Histoire", command=histoire)
                      bou5.place(x=170,y=370)
                      
                      Mafenetre.mainloop()
                      
                      0
                      1. Pour tes deux dernier message je garde ça de cote, même si pour toi c'est foutoirs, et je comprends tout a fait, j'ai appris comme ça et je sais que tout fonctionne comme je le veux.

                        Mais ta manière de faire ma l'aire bien plus simple effectivement donc je garde ça précieusement et une fois que tout sera fonctionnelle je ferais au mieux pour optimiser. En attendant soit compréhensif et essaye de faire abstraction si tu le peux.
                        0
                    • 1
                    • 2