Projet de Terminale - Jeu Snake en Python

Contexte

Ce projet a été réalisé en Terminale dans le cadre de la spécialité NSI. Il consistait à développer une version du célèbre jeu "Snake" en utilisant Python et la bibliothèque Pygame.

Besoins et Missions

Le but principal était de créer un jeu fonctionnel en Python, tout en intégrant des concepts de programmation orientée objet. Il était nécessaire de mettre en œuvre des algorithmes pour la gestion du serpent et des éléments du jeu, notamment la croissance du serpent, la gestion des collisions et la génération aléatoire des pommes.

Langages et Outils
  • Python
  • Pygame
Dates

Année scolaire 2022/2023

Illustrations

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"({self.x},{self.y})"

class Snake:
    def __init__(self):
        self.corps = [Point(10, 10)]  # La tête du serpent commence au point (10, 10)
        self.vX = 1  # Déplacement initial vers la droite
        self.vY = 0
        self.score = 0

    def avance(self):
        # Mise à jour de la position de la tête
        nouvelle_tete = Point(self.corps[0].x + self.vX, self.corps[0].y + self.vY)
        self.corps.insert(0, nouvelle_tete)  # Ajout de la nouvelle tête au début de la liste
        self.corps.pop()  # Suppression de la queue pour simuler l'avancement

    def collision(self):
        # Collision avec les murs
        if self.corps[0].x < 0 or self.corps[0].x >= DIMX or self.corps[0].y < 0 or self.corps[0].y >= DIMY:
            return True
        
        # Collision avec le corps
        for point in self.corps[1:]:
            if self.corps[0].x == point.x and self.corps[0].y == point.y:
                return True
        return False
                
Jeu Snake
Résumé et Apports du Projet

Ce projet m'a permis de renforcer mes compétences en programmation orientée objet, en gestion des structures de données comme les listes chaînées, et en manipulation de la bibliothèque Pygame. J'ai également appris à gérer des aspects complexes comme la détection de collisions et la génération d'événements aléatoires dans un contexte de jeu.

Code

import pygame
import random

# Définition des dimensions de la fenêtre
DIMX = 800
DIMY = 600

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"({self.x},{self.y})"

class Snake:
    def __init__(self):
        self.corps = [Point(10, 10)]  # La tête du serpent commence au point (10, 10)
        self.vX = 1  # Déplacement initial vers la droite
        self.vY = 0
        self.score = 0

    def avance(self):
        # Mise à jour de la position de la tête
        nouvelle_tete = Point(self.corps[0].x + self.vX, self.corps[0].y + self.vY)
        self.corps.insert(0, nouvelle_tete)  # Ajout de la nouvelle tête au début de la liste
        self.corps.pop()  # Suppression de la queue pour simuler l'avancement

    def collision(self):
        # Collision avec les murs
        if self.corps[0].x < 0 or self.corps[0].x >= DIMX or self.corps[0].y < 0 or self.corps[0].y >= DIMY:
            return True
        
        # Collision avec le corps
        for point in self.corps[1:]:
            if self.corps[0].x == point.x and self.corps[0].y == point.y:
                return True
        return False

    def grandir(self):
        # Ajoute une nouvelle partie à la queue du serpent
        derniere_partie = self.corps[-1]
        self.corps.append(Point(derniere_partie.x, derniere_partie.y))

# Fonction principale
if __name__ == "__main__":
    pygame.init()
    screen = pygame.display.set_mode((DIMX, DIMY))
    clock = pygame.time.Clock()
    snake = Snake()
    running = True

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        # Contrôles du serpent
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            snake.vX = -1
            snake.vY = 0
        elif keys[pygame.K_RIGHT]:
            snake.vX = 1
            snake.vY = 0
        elif keys[pygame.K_UP]:
            snake.vX = 0
            snake.vY = -1
        elif keys[pygame.K_DOWN]:
            snake.vX = 0
            snake.vY = 1

        snake.avance()
        if snake.collision():
            running = False

        # Rafraîchissement de l'affichage
        screen.fill((0, 0, 0))
        for part in snake.corps:
            pygame.draw.rect(screen, (0, 255, 0), (part.x * 20, part.y * 20, 20, 20))
        pygame.display.flip()
        clock.tick(10)
    
    pygame.quit()