TP Snake en python⚓
Langage python
Les variables permettent de stocker les valeurs
x = 4
y = 2
Ici, x et y représentent une position sur l’écran.
Les conditions if
Permet de prendre une décision.
if condition:
actionExemple
if x > 0:
x = x - 1
Si x est supérieur à 0, on le diminue.
Avec plusieurs cas :
if direction == "left":
x -= 1
elif direction == "right":
x += 1
pas de parenthèses
: obligatoire
indentation obligatoire
Boucle while : Permet de répéter une action tant qu’une condition est vraie.
while condition:
actionExemple :
x = 0
while x < 8:
print(x)
x = x + 1
La boucle s’exécute tant que x < 8
Dans un jeu :
while True:
# boucle infinieBoucle for : Permet de parcourir une liste.
for element in liste:
actionExemple :
for i in range(8):
print(i)
Affiche les nombres de 0 à 7.
Exemple avec le Sense HAT :
for x in range(8):
sense.set_pixel(x, 2, (255, 0, 0))
Dessine une ligne rouge.
Les tuples :
Un tuple est un groupe de valeurs.
Exemple :
position = (4, 3)
Accès aux valeurs :
x = position[0]
y = position[1]
un tuple est non modifiable
utilisé pour stocker des coordonnées
Les listes :
Une liste contient plusieurs éléments.
snake = [(4,4), (3,4), (2,4)]
représente un serpent de 3 segments
Accès :
head = snake[0]
premier élément = tête
Ajouter un élément
snake.insert(0, (5,4))
Ajoute en début de liste
Supprimer un élément
snake.pop()
Application au Snake :
Principe du déplacement
snake = [(4,4), (3,4), (2,4)]
new_head = (5,4)
snake.insert(0, new_head)
snake.pop()
La tête avance
La queue disparaît
Le serpent se déplace
Programmer un serpent avec le Sense HAT
manipuler une liste en Python
représenter un objet (serpent) avec plusieurs coordonnées
gérer un déplacement avec mémoire de direction
utiliser le joystick
mettre à jour un affichage dynamique
Rappel : déplacer un point
Créer 01_point.py
from sense_hat import SenseHat
from time import sleep
sense = SenseHat()
vert = (0, 255, 0)
x = 4
y = 4
while True:
events = sense.stick.get_events()
for event in events:
if event.action == "pressed":
if event.direction == "left" and x > 0:
x -= 1
elif event.direction == "right" and x < 7:
x += 1
elif event.direction == "up" and y > 0:
y -= 1
elif event.direction == "down" and y < 7:
y += 1
sense.clear()
sense.set_pixel(x, y, vert)
sleep(0.05)
Créer un serpent (structure de données)
Un serpent = plusieurs segments.
On va utiliser une liste :
snake = [(4,4), (3,4), (2,4)]
tête = premier élément
corps = reste
Créer 02_snake_affichage.py
from sense_hat import SenseHat
from time import sleep
sense = SenseHat()
vert = (0, 255, 0)
snake = [(4,4), (3,4), (2,4)]
while True:
sense.clear()
for segment in snake:
x = segment[0]
y = segment[1]
sense.set_pixel(x, y, vert)
sleep(0.3)
Combien de pixels sont affichés ?
Pourquoi utilise-t-on une boucle for ?
Modifier la position du serpent.
Déplacer le serpent automatiquement
Principe fondamental du snake :
ajouter une nouvelle tête
supprimer la queue
Exemple :
snake = [(4,4), (3,4), (2,4)]
nouvelle_tete = (5,4)
snake.insert(0, nouvelle_tete)
snake.pop()
Créer 03_snake_move_auto.py
from sense_hat import SenseHat
from time import sleep
sense = SenseHat()
vert = (0, 255, 0)
snake = [(4,4), (3,4), (2,4)]
while True:
head = snake[0]
new_head = (head[0] + 1, head[1])
snake.insert(0, new_head)
snake.pop()
sense.clear()
for segment in snake:
sense.set_pixel(segment[0], segment[1], vert)
sleep(0.5)
Ajouter le joystick
Maintenant on contrôle la direction.
Nouvelle variable
direction = "right"
Créer 04_snake_control.py
from sense_hat import SenseHat
from time import sleep
sense = SenseHat()
vert = (0, 255, 0)
snake = [(4,4), (3,4), (2,4)]
direction = "right"
while True:
events = sense.stick.get_events()
for event in events:
if event.action == "pressed":
if event.direction == "left":
direction = "left"
elif event.direction == "right":
direction = "right"
elif event.direction == "up":
direction = "up"
elif event.direction == "down":
direction = "down"
head = snake[0]
if direction == "right":
new_head = (head[0] + 1, head[1])
elif direction == "left":
new_head = (head[0] - 1, head[1])
elif direction == "up":
new_head = (head[0], head[1] - 1)
elif direction == "down":
new_head = (head[0], head[1] + 1)
snake.insert(0, new_head)
snake.pop()
sense.clear()
for segment in snake:
sense.set_pixel(segment[0], segment[1], vert)
sleep(0.3)
Attention : Problème volontaire
Le serpent peut sortir de l’écran.
Ajouter les limites empêcher demi-tour
if new_head[0] < 0 or new_head[0] > 7:
breakFaire pareil pour y
Interdit de passer de droite à gauche directement
Ajouter cible pixel rouge - si tête touche cible → ne pas faire `pop()`