Bonsoir !
Voila, etant actuellement en classe de terminale S, je dois realiser un projet en python pour ma spécialité ISN.
J'ai donc choisi de réaliser un jeu du style de pong !
J'ai pour le moment gerer le mouvement aléatoire ainsi que les collisions de la balle, il me reste donc a gerer le deplacement de la raquette, je souhaiterai faire un peu dans l'originalité, le jeu ne serait pas vraiment un pong mais plutot un mur, il me faudrait donc mettre un timer pour permettre de comptabiliser des scores !
J'ai oublier de préciser que je ne dois utiliser ni pygame, ni de classes pour la réalisation de ce projet.
Voici ce que j'ai fait pour l'instant, j'ai l'impression qu'il n'est pas optimal, si quelqu'un pourrait y apporter des modifs et des améliorations ça serait génial ! Merci d'avance !
- --- Importer les bibliothèques utilisées ---- #
import tkinter as tk # pour Python 2.x, c'est Tkinter (majuscule initiale)
import random
import time
- --- Variables --- #
w_fen, h_fen = 500, 400 # Dimensions de notre zone graphique.
x = random.randint(0,500) # Position x aléatoire des balles.
y = random.randint(0,400) # Position y aléatoire des balles.
r = 8 # Rayon de la balle.
n = 0
dx = random.randint(-5,5) # Etape 4 : Rebond aléatoire.
dy = random.randint(-5,5) # Etape 4 : Rebond aléatoire.
while n != 1 : # Empecher d'avoir le 0 comme valeur et ainsi empecher un non mouvement possible d'une balle.
if dx == 0 or dy == 0 :
dx = random.randint(-5,5) # Etape 4 : Rebond aléatoire.
dy = random.randint(-5,5) # Etape 4 : Rebond aléatoire.
n = - 1
n = n + 1
n = 1
a = 0
b = 150
c = 10
d = 100
drapeau = False
- --- Fonctions de modification de l'interface graphique --- #
def fin(event=None):
"Fin anticipée (Maj+Ctrl+Fin)."
fen.destroy()
def arret(event=None):
global drapeau
drapeau = True
def reprise(event=None):
global drapeau
drapeau = False
def left (event=None) :# descend
can.move("rec",0,10)
b = b + 10
d = d + 10
print(d)
return d and b
def right (event=None) : # monte
can.move("rec",0,-10)
b = b - 10
d = d - 10
print(d)
return d and b
- --- Fenêtre principale --- #
fen = tk.Tk() # Crée la fenêtre principale de l'application.
fen.title("Pytypong")
tit = tk.Label(fen, text="Pytypong") # Un titre
tit.pack(side=tk.TOP)
can = tk.Canvas(fen) # Puis une surface 'pour dessiner' à l'intérieur.
can.configure(width=w_fen, height=h_fen, bg='black')
can.pack(side=tk.TOP)
- --- COMMANDES --- #
boutQuit=tk.Button(fen, text="Quitter", command=fin).pack(side=tk.BOTTOM)
fen.bind("<Shift-Control-End>", fin)
fen.bind("<Return>",arret)
fen.bind("<space>",reprise)
fen.bind("<Left>",left)
fen.bind("<Right>",right)
- --- FONCTIONS --- #
def cercle(x, y, r, nom = "balle"): #Fonction cercle
a = x - r
b = y - r
c = x + r
d = y + r
return can.create_oval((a,b,c,d), fill="blue", outline="black", tag = nom)
def rec (nom1 = "rec"):
return can.create_rectangle(a,b,c,d, fill='white', outline='blue', width=5, tag = nom1)
- --- PARTIE PRINCIPALE DU CODE --- #
cercle(x,y,r)
rec()
while 1 : # Boucle infinie.
# --- GESTION DU MOUVEMENT --- #
can.move("balle",dx,dy) # Déplacement de la balle selon dx et dy.
fen.update() # Actualisation de la fenetre graphique.
fen.after(10) # Vitesse de la balle.
# --- GESTION DES REBONDS SUR LES BORDS --- #
if 490 < x < 505 or -5 < x < 10 : # Si la balle touche le bord en x ...
dx = -dx # Gestion du rebord en prenant l'inverse de dx pour un rebond coherent.
if 390 < y < 405 or -5 < y < 10 : # Si la balle touche le bord en y ...
dy = -dy # Gestion du rebord en prenant l'inverse de dy pour un rebond coherent.
y = y + dy # Incrémentation de dy sur y.
x = x + dx # Incrémentation de dx sur x.
# --- GESTION DES COLLISIONS --- #
if 0 < x < 10 and b < y < d :
print("test")
- ------------------------------------ #
fen.mainloop()