Projet ISN

Résolu/Fermé
Antoine451833 - 1 mai 2020 à 18:03
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020 - 5 mai 2020 à 18:42
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

Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
2 mai 2020 à 12:29
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
2 mai 2020 à 12:41
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
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
2 mai 2020 à 12:49
Ce serait bien de voir ton code quand même ... avec les balises:

https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
2 mai 2020 à 13:05
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
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
2 mai 2020 à 14:33
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
2 mai 2020 à 16:38
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
2 mai 2020 à 18:08
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
2 mai 2020 à 19:18
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
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
2 mai 2020 à 20:33
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
Modifié le 3 mai 2020 à 19:05
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
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
3 mai 2020 à 19:15
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
Modifié le 3 mai 2020 à 19:34
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
3 mai 2020 à 21:21
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
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
4 mai 2020 à 11:56
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
4 mai 2020 à 12:30
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
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 4 mai 2020 à 13:58
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
4 mai 2020 à 23:47
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
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
5 mai 2020 à 09:08
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
5 mai 2020 à 11:21
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
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 5 mai 2020 à 11:36
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
5 mai 2020 à 12:18
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
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 5 mai 2020 à 13:48
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
5 mai 2020 à 14:10
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
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 5 mai 2020 à 14:22
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
5 mai 2020 à 15:15
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
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 5 mai 2020 à 15:35
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
5 mai 2020 à 17:26
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
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 5 mai 2020 à 15:42
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
Modifié le 5 mai 2020 à 18:32
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
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
5 mai 2020 à 16:49
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
Antoine451833 Messages postés 47 Date d'inscription vendredi 1 mai 2020 Statut Membre Dernière intervention 13 mai 2020
Modifié le 5 mai 2020 à 18:26
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