Jeu de pong en python
AnneONyme
-
AnneONyme -
AnneONyme -
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
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: déplacer_la_raquette() déplacer_la_balle() fenêtre.update() time.sleep(0.02) if fenêtre_ouverte == True: vé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 def déplacer_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 def déplacer_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) def vérifier_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: réinitialiser() else: fermer() def fermer(): global fenêtre_ouverte fenêtre_ouverte = False fenêtre.destroy() def réinitialiser(): 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) réinitialiser() jouer_a_pong()
A voir également:
- Code python jeu pong
- Citizen code python avis - Accueil - Outils
- Mot secret python pix ✓ - Forum Python
- Python est introuvable. exúcutez sans argument pour procúder ó l ✓ - Forum Python
- Ce programme est écrit en python il construit un mot secret ✓ - Forum Python
- Python par la pratique : 101 exercices corrigés pdf - Forum Python
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
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.
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?
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 ? :-/
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question