Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
230 changes: 178 additions & 52 deletions snake.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,15 @@
import random

class Snake:
def __init__(self, cell_size):
def __init__(self, cell_size, color=None, start_position=None):
self.cell_size = cell_size
self.direction = (cell_size, 0)
self.body = [(100, 100), (90, 100), (80, 100)]
self.color = color if color else (0, 255, 0) # vert par défaut
if start_position:
self.body = [start_position, (start_position[0] - cell_size, start_position[1]), (start_position[0] - 2*cell_size, start_position[1])]
self.direction = (cell_size, 0)
else:
self.direction = (cell_size, 0)
self.body = [(100, 100), (90, 100), (80, 100)]

def move(self):
new_head = (self.body[0][0] + self.direction[0], self.body[0][1] + self.direction[1])
Expand Down Expand Up @@ -46,12 +51,18 @@ def grow(self):

def draw(self, screen):
for segment in self.body:
pygame.draw.rect(screen, green, pygame.Rect(segment[0], segment[1], self.cell_size, self.cell_size))
pygame.draw.rect(screen, self.color, pygame.Rect(segment[0], segment[1], self.cell_size, self.cell_size))

def check_portal_collision(self, portal):
head = self.body[0]
return head == portal.position

def check_snake_collision(self, other_snake):
"""Vérifie si ce serpent entre en collision avec un autre serpent"""
head = self.body[0]
# Collision avec le corps de l'autre serpent (incluant sa tête)
return head in other_snake.body

class Food:
def __init__(self, cell_size):
self.cell_size = cell_size
Expand All @@ -77,19 +88,23 @@ def draw(self, screen):
pygame.draw.rect(screen, gray, pygame.Rect(self.position[0], self.position[1], self.cell_size, self.cell_size))

class Score:
def __init__(self):
def __init__(self, player_num=None):
self.score = 0
self.player_num = player_num

def increase_score(self, points):
self.score += points

def reset_score(self):
self.score = 0

def display_score(self, screen):
def display_score(self, screen, x_position=10):
font = pygame.font.Font(None, 36)
text = font.render(f"Score: {self.score}", True, white)
screen.blit(text, (10, 10))
if self.player_num:
text = font.render(f"Score J{self.player_num}: {self.score}", True, white)
else:
text = font.render(f"Score: {self.score}", True, white)
screen.blit(text, (x_position, 10))

class PowerUp:
def __init__(self, cell_size):
Expand Down Expand Up @@ -136,21 +151,25 @@ def choose_difficulty():
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_F1:
return "Facile", fps_facile
return "Facile", fps_facile, False
elif event.key == pygame.K_F2:
return "Moyen", fps_moyen
return "Moyen", fps_moyen, False
elif event.key == pygame.K_F3:
return "Difficile", fps_difficile
return "Difficile", fps_difficile, False
elif event.key == pygame.K_F4:
return "Facile", fps_facile, True

screen.fill(black)
font = pygame.font.Font(None, 36)
text = font.render("Choisissez le niveau de difficulté:", True, white)
screen.blit(text, (width//4, height//2 - 50))
screen.blit(text, (width//4, height//2 - 100))
text = font.render("F1 - Facile", True, white)
screen.blit(text, (width//4, height//2))
screen.blit(text, (width//4, height//2 - 50))
text = font.render("F2 - Moyen", True, white)
screen.blit(text, (width//4, height//2 + 50))
screen.blit(text, (width//4, height//2))
text = font.render("F3 - Difficile", True, white)
screen.blit(text, (width//4, height//2 + 50))
text = font.render("F4 - Mode 2 Joueurs", True, white)
screen.blit(text, (width//4, height//2 + 100))
pygame.display.flip()

Expand All @@ -160,7 +179,7 @@ def draw_centered_text(screen, text, font, color, y_offset=0):
text_rect.center = (width // 2, height // 2 + y_offset)
screen.blit(text_surface, text_rect)

def game_over_screen():
def game_over_screen(winner=None):
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
Expand All @@ -175,7 +194,14 @@ def game_over_screen():

screen.fill(black)
font = pygame.font.Font(None, 36)
draw_centered_text(screen, "Game Over! Appuyez sur R pour rejouer ou sur Q pour quitter.", font, white)
if winner:
if winner == "draw":
draw_centered_text(screen, "Égalité! Les deux serpents ont perdu!", font, white, -30)
else:
draw_centered_text(screen, f"Le Joueur {winner} a gagné!", font, white, -30)
else:
draw_centered_text(screen, "Game Over!", font, white, -30)
draw_centered_text(screen, "Appuyez sur R pour rejouer ou sur Q pour quitter.", font, white, 30)
pygame.display.flip()

pygame.init()
Expand Down Expand Up @@ -208,11 +234,19 @@ def game_over_screen():
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Snake Game")

difficulty, fps = choose_difficulty()
difficulty, fps, two_player_mode = choose_difficulty()

# Initialisation des serpents selon le mode de jeu
if two_player_mode:
snake1 = Snake(cell_size, green, (100, height // 2))
snake2 = Snake(cell_size, cyan, (width - 100, height // 2))
score1 = Score(1)
score2 = Score(2)
else:
snake = Snake(cell_size)
score = Score()

snake = Snake(cell_size)
food = Food(cell_size)
score = Score()
obstacles = []
power_ups = []
num_power_ups = 3
Expand All @@ -235,45 +269,137 @@ def game_over_screen():
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
snake.change_direction((0, -cell_size))
elif event.key == pygame.K_DOWN:
snake.change_direction((0, cell_size))
elif event.key == pygame.K_LEFT:
snake.change_direction((-cell_size, 0))
elif event.key == pygame.K_RIGHT:
snake.change_direction((cell_size, 0))

snake.move()

if snake.check_collision(obstacles, width, height):
score.reset_score()
if not game_over_screen():
pygame.quit()
sys.exit()
else:
snake = Snake(cell_size)
food = Food(cell_size)
obstacles = []
if difficulty == "Moyen" or difficulty == "Difficile":
num_obstacles = 10 if difficulty == "Moyen" else 20
for _ in range(num_obstacles):
obstacle = Obstacle(cell_size)
obstacles.append(obstacle)

if snake.check_food_collision(food):
snake.grow()
food.generate_position()
score.increase_score(10)

if two_player_mode:
# Contrôles Joueur 1 (flèches)
if event.key == pygame.K_UP:
snake1.change_direction((0, -cell_size))
elif event.key == pygame.K_DOWN:
snake1.change_direction((0, cell_size))
elif event.key == pygame.K_LEFT:
snake1.change_direction((-cell_size, 0))
elif event.key == pygame.K_RIGHT:
snake1.change_direction((cell_size, 0))
# Contrôles Joueur 2 (ZQSD)
elif event.key == pygame.K_z:
snake2.change_direction((0, -cell_size))
elif event.key == pygame.K_s:
snake2.change_direction((0, cell_size))
elif event.key == pygame.K_q:
snake2.change_direction((-cell_size, 0))
elif event.key == pygame.K_d:
snake2.change_direction((cell_size, 0))
else:
if event.key == pygame.K_UP:
snake.change_direction((0, -cell_size))
elif event.key == pygame.K_DOWN:
snake.change_direction((0, cell_size))
elif event.key == pygame.K_LEFT:
snake.change_direction((-cell_size, 0))
elif event.key == pygame.K_RIGHT:
snake.change_direction((cell_size, 0))

# Déplacement
if two_player_mode:
snake1.move()
snake2.move()
else:
snake.move()

# Gestion des collisions
if two_player_mode:
# Vérifier les collisions pour les deux joueurs
snake1_collision = snake1.check_collision(obstacles, width, height)
snake2_collision = snake2.check_collision(obstacles, width, height)
snake1_hit_snake2 = snake1.check_snake_collision(snake2)
snake2_hit_snake1 = snake2.check_snake_collision(snake1)

winner = None
if snake1_collision or snake1_hit_snake2:
if snake2_collision or snake2_hit_snake1:
winner = "draw"
else:
winner = 2
elif snake2_collision or snake2_hit_snake1:
winner = 1

if winner:
score1.reset_score()
score2.reset_score()
if not game_over_screen(winner):
pygame.quit()
sys.exit()
else:
# Réinitialiser le jeu
difficulty, fps, two_player_mode = choose_difficulty()
if two_player_mode:
snake1 = Snake(cell_size, green, (100, height // 2))
snake2 = Snake(cell_size, cyan, (width - 100, height // 2))
score1 = Score(1)
score2 = Score(2)
else:
snake = Snake(cell_size)
score = Score()
food = Food(cell_size)
obstacles = []
if difficulty == "Moyen" or difficulty == "Difficile":
num_obstacles = 10 if difficulty == "Moyen" else 20
for _ in range(num_obstacles):
obstacle = Obstacle(cell_size)
obstacles.append(obstacle)
else:
if snake.check_collision(obstacles, width, height):
score.reset_score()
if not game_over_screen():
pygame.quit()
sys.exit()
else:
snake = Snake(cell_size)
food = Food(cell_size)
obstacles = []
if difficulty == "Moyen" or difficulty == "Difficile":
num_obstacles = 10 if difficulty == "Moyen" else 20
for _ in range(num_obstacles):
obstacle = Obstacle(cell_size)
obstacles.append(obstacle)

# Gestion de la nourriture
if two_player_mode:
if snake1.check_food_collision(food):
snake1.grow()
food.generate_position()
# Éviter que la nourriture apparaisse sur les serpents
while food.position in snake1.body or food.position in snake2.body:
food.generate_position()
score1.increase_score(10)
elif snake2.check_food_collision(food):
snake2.grow()
food.generate_position()
# Éviter que la nourriture apparaisse sur les serpents
while food.position in snake1.body or food.position in snake2.body:
food.generate_position()
score2.increase_score(10)
else:
if snake.check_food_collision(food):
snake.grow()
food.generate_position()
score.increase_score(10)

# Affichage
screen.fill(black)

snake.draw(screen)
if two_player_mode:
snake1.draw(screen)
snake2.draw(screen)
score1.display_score(screen, 10)
score2.display_score(screen, width - 250)
else:
snake.draw(screen)
score.display_score(screen)

food.draw(screen)
portal.draw(screen)
for obstacle in obstacles:
obstacle.draw(screen)
score.display_score(screen)

pygame.display.flip()
pygame.time.Clock().tick(fps)