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. L’inconvenant d’après moi dans ton code c'est que justement il devient trop simple. On a besoin des canevas pour toutes les images. Comme dit précédemment il est essentielle d'avoir un menu travaillé et le plus proche du réel. L’esthétique fait aussi parti du travail, j'y ai passé limite plus de temps que sur le code.

    Je peux comprendre que ça soit dure a regarder, c'est comme un texte remplis de faute, on a du mal a rester concentré sur le message (je ne dis pas la que je suis irréprochable a ce sujet).
    0
    1. 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
    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. 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
    4. 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. 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'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. 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. 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
            2. 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
            3. 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. 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. 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. 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. 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
                    2. 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
                    3. 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
                    4. 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
                    5. 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
                      • 2