Jeu de pong en python

Fermé
AnneONyme - Modifié le 25 mai 2019 à 18:09
 AnneONyme - 27 mai 2019 à 19:53
Bonjour.
Avec l'aide du livre " j'apprends à programmer avec python " des éditions Usborn, j'essaye de programmer un jeu de pong ( avec une seule raquette que l'on dirige avec les flèches du clavier ). Ce jeu est la version la plus simple car il n'y a pas de score, et la balle n'accélère pas au fur et à mesure du jeu. Malgré cela, je rencontre un problème : lorsque l'on laisse tomber la balle, le livre explique comment afficher un message " Veux-tu rejouer ? " avec deux boutons " oui " et " non ". Si l'on clique sur non, la fenêtre de tkinter se ferme, et si l'on clique sur oui, le jeu recommence. Ça, c'est ce que le programme est censé faire...Quand le joueur clique sur oui, la raquette se positionne à gauche, la balle juste au dessus, mais appuyer sur les touches flèche gauche et flèche droite n'a aucun effet. > ( J'ai d'abord pensé que c'était moi qui avait mal tapé le code proposé par mon livre, alors j'ai directement télécharger le code sur le site www.usborne.com . Même problème. J'en déduis donc qu'il ont commis une erreur en écrivant le livre. Personne ne semble avoir eu le même problème que moi...J'utilise python 3.7.1 et voici mon code :

**Modifié par la modération pour une lecture plus facile du code, à l'avenir utilisez les balises, VOIR CETTE PAGE


import tkinter
from tkinter import messagebox
import time

canvasWidth = 750
canvasHeight = 500
fenêtre = tkinter.Tk()
canvas = tkinter.Canvas(fenêtre, width=canvasWidth, height=canvasHeight, bg="dodgerblue4")
canvas.pack()

raquette = canvas.create_rectangle(0, 0, 40, 10, fill="dark turquoise")
balle = canvas.create_oval(0, 0, 10, 10, fill="deep pink")

fenêtre_ouverte = True

def jouer_a_pong():
    while fenêtre_ouverte == True:placer_la_raquette()placer_la_balle()
        fenêtre.update()
        time.sleep(0.02)
        if fenêtre_ouverte == True:rifier_game_over()

gauche_appuyé = 0
droite_appuyé = 0

def quand_touche_appuyée(event):
    global gauche_appuyé, droite_appuyé
    if event.keysym == "Left":
        gauche_appuyé = 1
    elif event.keysym == "Right":
        droite_appuyé = 1

def quand_touche_relâchée(event):
    global gauche_appuyé, droite_appuyé
    if event.keysym == "Left":
        gauche_appuyé = 0 
    elif event.keysym == "Right":
        droite_appuyé = 0

vitesse_raquette = 6

defplacer_la_raquette():
    mouvement_raquette = vitesse_raquette * droite_appuyé - vitesse_raquette * gauche_appuyé
    (gauche_raquette, haut_raquette, droite_raquette, bas_raquette) = canvas.coords(raquette)
    if (gauche_raquette > 0 or mouvement_raquette > 0) and (droite_raquette < canvasWidth or mouvement_raquette < 0):
        canvas.move(raquette, mouvement_raquette, 0)

mouvement_balle_X = 4
mouvement_balle_Y = -4
déf_haut_raquette = canvasHeight-40
déf_bas_raquette = canvasHeight-30

defplacer_la_balle():
    global mouvement_balle_X, mouvement_balle_Y
    (gauche_balle, haut_balle, droite_balle, bas_balle) = canvas.coords(balle)
    if mouvement_balle_X > 0 and droite_balle > canvasWidth:
        mouvement_balle_X = -mouvement_balle_X
    if mouvement_balle_X < 0 and gauche_balle < 0:
        mouvement_balle_X = -mouvement_balle_X
    if mouvement_balle_Y < 0 and haut_balle < 0:
        mouvement_balle_Y = -mouvement_balle_Y
    if mouvement_balle_Y > 0 and bas_balle > déf_haut_raquette and bas_balle < déf_bas_raquette:
        (gauche_raquette, haut_raquette, droite_raquette, bas_raquette) = canvas.coords(raquette)
        if droite_balle > gauche_raquette and gauche_balle < droite_raquette:
            mouvement_balle_Y = -mouvement_balle_Y
    canvas.move(balle, mouvement_balle_X, mouvement_balle_Y)

defrifier_game_over():
    (gauche_balle, haut_balle, droite_balle, bas_balle) = canvas.coords(balle)
    if haut_balle > canvasHeight:
        rejouer = tkinter.messagebox.askyesno(message = " Veux-tu rejouer ? ")
        if rejouer == True:initialiser()
        else:
            fermer()

def fermer():
    global fenêtre_ouverte
    fenêtre_ouverte = False
    fenêtre.destroy()

definitialiser():
    global gauche_appuyé, droite_appuyé
    global mouvement_balle_X, mouvement_balle_Y
    gauche_appuyé = 0
    droite_appuyé = 0
    mouvement_balle_X = 4
    mouvement_balle_Y = -4
    canvas.coords(raquette, 10, déf_haut_raquette, 50, déf_bas_raquette)
    canvas.coords(balle, 20, déf_haut_raquette-10, 30, déf_haut_raquette)

fenêtre.protocol("WM_DELETE_WINDOW", fermer)
fenêtre.bind("<KeyPress>", quand_touche_appuyée)
fenêtre.bind("<KeyRelease>", quand_touche_relâchée)initialiser()
jouer_a_pong()

5 réponses

Bonjour,

C'est simplement une histoire de focus.

Lorsque la toplevel s'affiche en demandant si le joueur veut rejouer, le canvas perd le focus au profit de la toplevel, et lorsque celle-ci est fermée en cliquant sur le bouton oui, le focus est attribué à un autre widget au bon vouloir du gestionnaire graphique du système d'exploitation, dans ton cas, cela semble être sur la fenêtre principale Tk, chez moi et chez d'autres c'est sur le widget précédent l'ayant eu.

Il est nécessaire alors de forcer le focus sur le canvas.
Dans la fonction réinitialiser, le simple ajout de l'instruction
canvas.focus_set()
assurera de redonner le focus au canvas avant le démarrage d'une partie.
0
ARRRGH !!! Ça ne marche pas !
0
par contre, la première fois que l'on joue, ils a une sorte de cadre noir qui n'était pas là avant... le focus?
0
A, une dernière chose, " j'apprend à programmer avec python " est un bouquin de vulgarisation et puis j'ai douze ans, alors toplevel, focus, widget, vous pouvez m'expliquer ? :-/
0

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

Posez votre question
ah, si ! Mais le focus n'arrive que si l'on clique sur la fenêtre. Y a-il moyen de corriger ça ? Dans tout les cas, merci de m'avoir aider !
0