Activité SNT : Améliorer un jeu Snake en Python

Objectif pédagogique

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 :

É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

Conclusion

Veuillez rendre votre travail avec ce lien.