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.
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.
Année scolaire 2022/2023
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
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.
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()