Vous connaissez tous le jeu du Pong ?
Mais si, le jeu du Pong c’est ce jeu où l’on doit faire rebondir une balle entre deux barres…
Vous ne voyez toujours pas ?
Le voici :
Aujourd’hui je suis allée voir un tuto sur YouTube de FreeCodeCamp : https://youtu.be/XGf2GcyHPhc pour réaliser le jeu du Pong.
J’ai réalisé le jeu en même temps que la vidéo.
C’était ma petite partie récréative pour me réconcilier avec Python (car en ce moment j’ai une overdose du cours que je suis sur OpenClassrooms; et surtout des classes et méthodes qui sont pour moi imbuvables ! 😉 )
Alors le principe est simple : il faut créer une fenêtre avec des dimensions précises, des barres et une balle. Puis programmer pour que tout se déplace, que la balle rebondisse et que les scores s’affichent…
Simple comme bonjour ? Presque…
J’ai suivi la vidéo et j’ai dû faire quelques modifications pour que le programme marche sur mon ordinateur !
- Tout d’abord, j’ai fait des erreurs de frappe. Par exemple pour le déplacement des barres, j’ai oublié de mettre le signe négatif pour le déplacement en bas… Ce qui fait que, quelle que soit la touche paramétrée utilisée, ma barre se déplaçait uniquement en haut !
# Function def paddle_a_up(): y = paddle_a.ycor() y += 20 paddle_a.sety(y) def paddle_a_down(): y = paddle_a.ycor() y += -20 paddle_a.sety(y)
- Le déplacement de la balle était bien trop rapide avec une valeur de 2. J’ai donc diminué progressivement jusqu’à 0.1 pour que la balle se déplace suffisamment lentement pour pouvoir jouer sans perdre dès le début !
ball.dx = 0.1 # speed ball.dy = -0.1 # speed
- Lorsque je suis passée au codage du déplacement de la balle, la balle doit toujours se retrouver au milieu après être sortie sur un côté. Mon code a marché lorsque j’ai supprimé les espaces dans la ligne.
if ball.xcor() > 390: # right side of the screen ball.goto(0,0) ball.dx *= -1 if ball.xcor() < -390: # left side of the screen ball.goto(0,0) ball.dx *= -1
- Pour les conditions permettant à la balle de « rebondir » sur les barres, je n’avais pas mis toutes les parenthèses nécessaires. Ce qui provoquait un arrêt du programme…
# Paddle and ball collisions if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < paddle_b.ycor() + 40 and ball.ycor() > paddle_b.ycor() -40): ball.setx(340) ball.dx *= -1 if (ball.xcor() < -340 and ball.xcor() > -350) and (ball.ycor() < paddle_a.ycor() + 40 and ball.ycor() > paddle_a.ycor() -40): ball.setx(-340) ball.dx *= -1
Finalement, ce moment récréatif a été très instructif !
En effet, même en ayant le modèle sous les yeux, j’ai eu quelques bugs qui m’ont permis de réfléchir et donc de m’améliorer !!! 🙂
De plus j’ai découvert une nouvelle bibliothèque : « turtle » qui permet notamment de dessiner des lignes. Et ça c’est top ! 😎
Et voici le code final !
# Simple Pong # By @TokyoEdTech import turtle wn = turtle.Screen() wn.title("Pong by @TokyoEdTech") wn.bgcolor("black") wn.setup(width=800, height=600) wn.tracer(0) # Score score_a = 0 score_b = 0 # Paddle A paddle_a = turtle.Turtle() paddle_a.speed(0) paddle_a.shape("square") paddle_a.color("white") paddle_a.shapesize(stretch_wid=5, stretch_len=1) paddle_a.penup() paddle_a.goto(-350, 0) # Paddle B paddle_b = turtle.Turtle() paddle_b.speed(0) paddle_b.shape("square") paddle_b.color("white") paddle_b.shapesize(stretch_wid=5, stretch_len=1) paddle_b.penup() paddle_b.goto(350, 0) # Ball ball = turtle.Turtle() ball.speed(0) ball.shape("square") ball.color("white") ball.penup() ball.goto(0, 0) ball.dx = 0.2 # speed ball.dy = -0.2 # speed # Pen pen = turtle.Turtle() pen.speed(0) pen.color("white") pen.penup() pen.hideturtle() pen.goto(0, 260) pen.write("Player A: 0 Player B: 0", align="center", font=("Courier", 24, "normal")) # Function def paddle_a_up(): y = paddle_a.ycor() y += 20 paddle_a.sety(y) def paddle_a_down(): y = paddle_a.ycor() y += -20 paddle_a.sety(y) def paddle_b_up(): y = paddle_b.ycor() y += 20 paddle_b.sety(y) def paddle_b_down(): y = paddle_b.ycor() y += -20 paddle_b.sety(y) # Keyboard binding wn.listen() wn.onkeypress(paddle_a_up, "a") wn.onkeypress(paddle_a_down, "q") wn.onkeypress(paddle_b_up, "p") wn.onkeypress(paddle_b_down, "m") # Main game loop while True: wn.update() # Move the ball ball.setx(ball.xcor() + ball.dx) ball.sety(ball.ycor() + ball.dy) # Border checking if ball.ycor() > 290: # top of the screen ball.sety(290) ball.dy *= -1 if ball.ycor() < -290: # bottom of the screen ball.sety(-290) ball.dy *= -1 if ball.xcor() > 390: # right side of the screen ball.goto(0,0) ball.dx *= -1 score_a += 1 pen.clear() pen.write("Player A: {} Player B: {}". format(score_a, score_b), align="center", font=("Courier", 24, "normal")) if ball.xcor() < -390: # left side of the screen ball.goto(0,0) ball.dx *= -1 score_b += 1 pen.clear() pen.write("Player A: {} Player B: {}". format(score_a, score_b), align="center", font=("Courier", 24, "normal")) # Paddle and ball collision if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < paddle_b.ycor() + 40 and ball.ycor() > paddle_b.ycor() -40): ball.setx(340) ball.dx *= -1 if (ball.xcor() < -340 and ball.xcor() > -350) and (ball.ycor() < paddle_a.ycor() + 40 and ball.ycor() > paddle_a.ycor() -40): ball.setx(-340) ball.dx *= -1