Compte-rendu des ateliers du 13 avril et 11 mai 2019

Les cours d’initiation à la programmation Python touchent à leur fin.

Les Jeunes ont été sensibilisés aux notions suivantes :

  • comment représenter des nombres, des chaines de caractères et des listes
  • qu’appelle-t-on une « variable » et comment s’en sert-on
  • comment faire des tests avec la construction « if…..else… »
  • comment faire des boucles avec « for » et « while »
  • pourquoi factoriser son code et définir des fonctions
  • qu’est-ce-qu’un paramètre de fonction

L’objectif final était de réaliser, par étapes successives, un début de jeu simple mettant en oeuvre un objet qui se déplace automatiquement (ici, une tortue) et qu’on cherche à faire rentrer en collision avec une balle dirigée par le joueur. A chaque collision, un indicateur de score est incrémenté.

Voici le code final :

import turtle as tt
from random import randint

pos_x, pos_y = 0, 0
DIAMETRE = 20
COULEUR = 'red'
VITESSE = 10
LARGEUR = 300
HAUTEUR = 300

ma_tortue = tt.Turtle()
ma_tortue.shape('turtle')
ma_tortue.up()
ma_tortue.speed(0)
ma_tortue_x = randint(60, LARGEUR//2-30)
ma_tortue_y = randint(60, HAUTEUR//2-30)
ma_tortue.setheading(randint(0, 359))

TORTUE_VITESSE = 15
TORTUE_DELAI = 300

mon_score = tt.Turtle()
mon_score.hideturtle()
mon_score.up()
mon_score_x = LARGEUR//2 - 20
mon_score_y = -HAUTEUR//2 + 20
mon_score.goto(mon_score_x, mon_score_y)
mon_score.pencolor("black")
score = 0

def affiche():
  tt.hideturtle()
  tt.up() 
  tt.goto(pos_x, pos_y)
  tt.down()
  tt.clear() 
  tt.dot(DIAMETRE, COULEUR)

def deplace_horiz(delta):
  global pos_x
  pos_x += delta
  affiche()

def deplace_vert(delta):
  global pos_y
  pos_y += delta
  affiche()

def deplace_gauche():
  if pos_x - VITESSE > -LARGEUR / 2:
  deplace_horiz(-VITESSE)

def deplace_droite():
  if pos_x + VITESSE < LARGEUR / 2:
  deplace_horiz(VITESSE)

def deplace_haut():
  if pos_y + VITESSE < HAUTEUR / 2:
  deplace_vert(VITESSE)

def deplace_bas():
  if pos_y - VITESSE > -HAUTEUR / 2:
  deplace_vert(-VITESSE)

def deplace_tortue():
  x, y = ma_tortue.position()
  ma_tortue.forward(TORTUE_VITESSE)

  # test de collision
  global TORTUE_DELAI, score
  if abs(pos_x - x) < DIAMETRE/2 and abs(pos_y - y) < DIAMETRE/2:
    TORTUE_DELAI -= int(TORTUE_DELAI * .1)
    score += 1
    mon_score.clear()
    mon_score.write(score, font=("Aria", 14, "bold"))
 
  if x > LARGEUR/2:
    ma_tortue.goto(-LARGEUR/2, y)
  elif x < -LARGEUR/2:
    ma_tortue.goto(LARGEUR/2, y)

  if y > HAUTEUR/2:
    ma_tortue.goto(x, -HAUTEUR/2)
  elif y < -HAUTEUR/2:
    ma_tortue.goto(x, HAUTEUR/2)
 
  tt.ontimer(deplace_tortue, TORTUE_DELAI)

# programme principal 
tt.speed(0)
tt.setup(LARGEUR + DIAMETRE, HAUTEUR + DIAMETRE)
tt.screensize(canvwidth=LARGEUR, canvheight=HAUTEUR)
affiche()
tt.listen()
tt.onkeypress(deplace_gauche, "Left")
tt.onkeypress(deplace_droite, "Right")
tt.onkeypress(deplace_haut, "Up")
tt.onkeypress(deplace_bas, "Down")

ma_tortue.goto(ma_tortue_x, ma_tortue_y)
tt.ontimer(deplace_tortue, TORTUE_DELAI)
tt.mainloop()