Objectif pédagogique
- Comprendre les bases de la programmation avec Python et Pygame.
- Apprendre à utiliser des concepts comme les listes, les conditions, et les opérateurs.
- Développer un jeu simple et le personnaliser avec des améliorations guidées.
Introduction à l'activité
Dans cette activité, vous allez travailler sur un jeu Snake simple. Vous partirez d'un code de base fonctionnel, que vous devrez analyser et comprendre. Ensuite, vous serez guidés pour ajouter des améliorations au jeu.
Pour vous aider, nous allons expliquer certains concepts importants que vous rencontrerez dans le code.
Concepts clés à comprendre
1. Les listes
Une liste est une structure de données qui permet de stocker plusieurs valeurs dans une seule variable. Par exemple :
ma_liste = [1, 2, 3, 4]
- Chaque élément de la liste a une position (appelée index), qui commence à 0.
- Vous pouvez accéder à un élément avec son index : ma_liste[0] renvoie 1.
- Les listes sont très utiles pour stocker des données comme les positions du serpent dans le jeu.
Dans le code du Snake, la liste snake_list est utilisée pour stocker toutes les positions du serpent. À chaque déplacement, une nouvelle position est ajoutée à la liste, et l'ancienne est supprimée si la longueur du serpent reste la même.
2. L'opérateur % (modulo)
L'opérateur % renvoie le reste d'une division. Par exemple :
7 % 3 # Résultat : 1 (car 7 divisé par 3 donne 2 avec un reste de 1)
Dans le jeu, le % peut être utilisé pour vérifier si un nombre est divisible par un autre. Par exemple, si vous voulez augmenter la vitesse du jeu tous les 5 points, vous pouvez écrire :
if score % 5 == 0:
snake_speed += 1
Cela signifie : "Si le score est un multiple de 5, augmente la vitesse."
Code de base : Jeu Snake
Voici le code de base du jeu Snake. Lisez-le attentivement et essayez de comprendre son fonctionnement.
import pygame
import time
import random
pygame.init()
# Dimensions de l'écran
SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Snake Game")
# Couleurs
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (213, 50, 80)
GREEN = (0, 255, 0)
BLUE = (50, 153, 213)
# Taille du serpent
snake_block = 10
snake_speed = 15
clock = pygame.time.Clock()
# Police pour le score
font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)
def message(msg, color, x, y):
mesg = font_style.render(msg, True, color)
screen.blit(mesg, [x, y])
def gameLoop():
game_over = False
game_close = False
x1, y1 = SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2
x1_change, y1_change = 0, 0
snake_list = []
length_of_snake = 1
foodx = round(random.randrange(0, SCREEN_WIDTH - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, SCREEN_HEIGHT - snake_block) / 10.0) * 10.0
while not game_over:
while game_close:
screen.fill(BLUE)
message("Game Over! Press Q-Quit or C-Play Again", RED, 100, 250)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
game_close = False
if event.key == pygame.K_c:
gameLoop()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -snake_block
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = snake_block
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -snake_block
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = snake_block
x1_change = 0
if x1 >= SCREEN_WIDTH or x1 < 0 or y1 >= SCREEN_HEIGHT or y1 < 0:
game_close = True
x1 += x1_change
y1 += y1_change
screen.fill(WHITE)
pygame.draw.rect(screen, GREEN, [foodx, foody, snake_block, snake_block])
snake_head = []
snake_head.append(x1)
snake_head.append(y1)
snake_list.append(snake_head)
if len(snake_list) > length_of_snake:
del snake_list[0]
for x in snake_list[:-1]:
if x == snake_head:
game_close = True
for block in snake_list:
pygame.draw.rect(screen, BLACK, [block[0], block[1], snake_block, snake_block])
pygame.display.update()
if x1 == foodx and y1 == foody:
foodx = round(random.randrange(0, SCREEN_WIDTH - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, SCREEN_HEIGHT - snake_block) / 10.0) * 10.0
length_of_snake += 1
clock.tick(snake_speed)
pygame.quit()
quit()
gameLoop()
Étape 1 : Comprendre le code
Répondez aux questions suivantes pour vous assurer que vous comprenez le fonctionnement du code :
- Que fait la liste
snake_list? - Que se passe-t-il lorsque le serpent mange la nourriture ?
- Comment le jeu détecte-t-il que le joueur a perdu ?
- Que fait la fonction
display_score()? - À quoi sert la variable
length_of_snake?
Étape 2 : Ajouter des améliorations
Amélioration 1 : Ajouter des obstacles
Objectif : Ajouter des blocs rouges sur l'écran que le serpent doit éviter.
Indice : Utilisez une liste pour stocker les positions des obstacles et vérifiez si la tête du serpent entre en collision avec un obstacle.
Amélioration 2 : Augmenter la vitesse
Objectif : Faire en sorte que la vitesse du jeu augmente à mesure que le score augmente.
Indice : Utilisez l'opérateur % pour augmenter la vitesse tous les 5 points.
Amélioration 3 : Mode infini
Objectif : Permettre au serpent de traverser les bords de l'écran et de réapparaître de l'autre côté.
Indice : Modifiez les coordonnées x1 et y1 pour qu'elles "bouclent" lorsqu'elles dépassent les limites.
Étape 3 : Tester et présenter
1. Testez vos modifications pour vérifier qu'elles fonctionnent correctement.
2. Expliquez ce que vous avez ajouté et comment vous avez procédé.
Questionnaire final
- Qu'avez-vous appris sur les listes ?
- Comment avez-vous utilisé l'opérateur
%dans vos améliorations ? - Quelle amélioration vous a semblé la plus difficile ? Pourquoi ?