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
220 changes: 182 additions & 38 deletions snake.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
import random

class Snake:
def __init__(self, cell_size):
def __init__(self, cell_size, color=(0, 255, 0), start_pos=(100, 100)):
self.cell_size = cell_size
self.color = color
self.direction = (cell_size, 0)
self.body = [(100, 100), (90, 100), (80, 100)]
self.body = [start_pos, (start_pos[0] - cell_size, start_pos[1]), (start_pos[0] - 2*cell_size, start_pos[1])]

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 +47,16 @@ 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):
head = self.body[0]
return head in other_snake.body

class Food:
def __init__(self, cell_size):
self.cell_size = cell_size
Expand Down Expand Up @@ -86,10 +91,18 @@ def increase_score(self, points):
def reset_score(self):
self.score = 0

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

if position == 'left':
screen.blit(text, (10, 10))
else: # right
text_rect = text.get_rect()
screen.blit(text, (width - text_rect.width - 10, 10))

class PowerUp:
def __init__(self, cell_size):
Expand Down Expand Up @@ -128,6 +141,28 @@ def __init__(self, cell_size, position):
def draw(self, screen):
pygame.draw.rect(screen, blue, pygame.Rect(self.position[0], self.position[1], self.cell_size, self.cell_size))

def choose_game_mode():
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_1:
return 1
elif event.key == pygame.K_2:
return 2

screen.fill(black)
font = pygame.font.Font(None, 36)
text = font.render("Choisissez le mode de jeu:", True, white)
screen.blit(text, (width//4, height//2 - 50))
text = font.render("1 - Un joueur", True, white)
screen.blit(text, (width//4, height//2))
text = font.render("2 - Deux joueurs", True, white)
screen.blit(text, (width//4, height//2 + 50))
pygame.display.flip()

def choose_difficulty():
while True:
for event in pygame.event.get():
Expand Down Expand Up @@ -160,7 +195,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 +210,11 @@ 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:
draw_centered_text(screen, winner, font, white, -30)
draw_centered_text(screen, "Appuyez sur R pour rejouer ou sur Q pour quitter.", font, white, 30)
else:
draw_centered_text(screen, "Game Over! Appuyez sur R pour rejouer ou sur Q pour quitter.", font, white)
pygame.display.flip()

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

game_mode = choose_game_mode()
difficulty, fps = choose_difficulty()

snake = Snake(cell_size)
snake1 = Snake(cell_size, green, (100, 100))
food = Food(cell_size)
score = Score()
score1 = Score()
obstacles = []
power_ups = []
num_power_ups = 3

# Initialiser le deuxième serpent en mode 2 joueurs
if game_mode == 2:
snake2 = Snake(cell_size, blue, (width - 100, height - 100))
score2 = Score()
snake1_alive = True
snake2_alive = True
else:
snake2 = None

for _ in range(num_power_ups):
power_up = PowerUp(cell_size)
power_ups.append(power_up)
Expand All @@ -235,45 +284,140 @@ def game_over_screen():
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
# Contrôles Joueur 1 (flèches)
if event.key == pygame.K_UP:
snake.change_direction((0, -cell_size))
snake1.change_direction((0, -cell_size))
elif event.key == pygame.K_DOWN:
snake.change_direction((0, cell_size))
snake1.change_direction((0, cell_size))
elif event.key == pygame.K_LEFT:
snake.change_direction((-cell_size, 0))
snake1.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)
snake1.change_direction((cell_size, 0))

# Contrôles Joueur 2 (ZQSD)
if game_mode == 2:
if 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))

# Déplacer les serpents
if game_mode == 1:
snake1.move()
else:
if snake1_alive:
snake1.move()
if snake2_alive:
snake2.move()

# Vérifier les collisions pour le mode 1 joueur
if game_mode == 1:
if snake1.check_collision(obstacles, width, height):
score1.reset_score()
if not game_over_screen():
pygame.quit()
sys.exit()
else:
snake1 = Snake(cell_size, green, (100, 100))
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 snake1.check_food_collision(food):
snake1.grow()
food.generate_position()
score1.increase_score(10)

# Vérifier les collisions pour le mode 2 joueurs
else:
# Vérifier collisions Joueur 1
if snake1_alive:
if snake1.check_collision(obstacles, width, height) or (snake2_alive and snake1.check_snake_collision(snake2)):
snake1_alive = False

# Vérifier collisions Joueur 2
if snake2_alive:
if snake2.check_collision(obstacles, width, height) or (snake1_alive and snake2.check_snake_collision(snake1)):
snake2_alive = False

# Fin de partie si au moins un serpent est mort
if not snake1_alive or not snake2_alive:
winner_message = ""
if not snake1_alive and not snake2_alive:
winner_message = "Match nul!"
elif snake1_alive:
winner_message = "Joueur 1 (Vert) gagne!"
else:
winner_message = "Joueur 2 (Bleu) gagne!"

score1.reset_score()
score2.reset_score()

if not game_over_screen(winner_message):
pygame.quit()
sys.exit()
else:
# Réinitialiser le jeu
game_mode = choose_game_mode()
difficulty, fps = choose_difficulty()
snake1 = Snake(cell_size, green, (100, 100))
food = Food(cell_size)
score1 = Score()
obstacles = []

if game_mode == 2:
snake2 = Snake(cell_size, blue, (width - 100, height - 100))
score2 = Score()
snake1_alive = True
snake2_alive = True
else:
snake2 = None

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)

# Nourriture pour Joueur 1
if snake1_alive and snake1.check_food_collision(food):
snake1.grow()
food.generate_position()
score1.increase_score(10)

# Nourriture pour Joueur 2
if snake2_alive and snake2.check_food_collision(food):
snake2.grow()
food.generate_position()
score2.increase_score(10)

screen.fill(black)

snake.draw(screen)
# Dessiner les éléments
if game_mode == 1 or snake1_alive:
snake1.draw(screen)
if game_mode == 2 and snake2_alive:
snake2.draw(screen)

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

# Afficher les scores
if game_mode == 1:
score1.display_score(screen)
else:
score1.display_score(screen, 'left', 1)
score2.display_score(screen, 'right', 2)

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