urgent commit

This commit is contained in:
2025-05-19 09:54:23 +02:00
parent 4a8c4fdc2c
commit 8f9f4088fd
17 changed files with 1032 additions and 251 deletions

View File

@@ -1,255 +1,55 @@
import pygame
import sys
import random
import math
import sys, pygame
import bouton
import constantes
import pygame.freetype
import jeu, highscore
# Initialisation de Pygame
pygame.init()
# Définition des dimensions de la fenêtre
SCREEN_WIDTH = 1080
SCREEN_HEIGHT = 720
def affiche_menu(ecran):
b1.affiche(ecran)
b2.affiche(ecran)
b3.affiche(ecran)
return 0
# Définition des couleurs (R, G, B)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
RED = (255, 0, 0)
# Création de la fenêtre de jeu
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Casse-Brique Auto-Play")
pygame.init() # initialisation des modules de pygame
# Creation de la fenetre
ecran = pygame.display.set_mode((constantes.LARGEUR_ECRAN, constantes.HAUTEUR_ECRAN))
ecran.fill(constantes.BLANC)
pygame.display.set_caption("Casse Brique")
clock = pygame.time.Clock()
FPS = 100
b1 = bouton.Bouton((100, 100, 400, 100), "Jouer", (255, 0, 0))
b2 = bouton.Bouton((100, 300, 400, 100), "Highscore", (255, 0, 0))
b3 = bouton.Bouton((100, 500, 400, 100), "Quitter", (255, 0, 0))
hs1 = highscore.Highscore()
j1 = jeu.Jeu()
etat = 0
# Fonction d'affichage du menu de démarrage
def show_menu():
menu_running = True
title_font = pygame.font.SysFont("Arial", 72)
button_font = pygame.font.SysFont("Arial", 36)
button_width = 200
button_height = 50
button_rect = pygame.Rect(0, 0, button_width, button_height)
button_rect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)
while menu_running:
clock.tick(FPS)
screen.fill(BLACK)
# Affichage du titre
title_surface = title_font.render("Casse-Brique", True, WHITE)
title_rect = title_surface.get_rect(
center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 3)
)
screen.blit(title_surface, title_rect)
# Dessiner le bouton "Jouer"
pygame.draw.rect(screen, BLUE, button_rect)
button_text = button_font.render("Jouer", True, WHITE)
button_text_rect = button_text.get_rect(center=button_rect.center)
screen.blit(button_text, button_text_rect)
# Gestion des événements du menu
while True: # Demarrage de la boucle infinie
if etat == 0:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.QUIT: # Evt de sortie de boucle
sys.exit()
# Détection d'un clic sur le bouton "Jouer"
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
if button_rect.collidepoint(event.pos):
menu_running = False
elif event.type == pygame.MOUSEBUTTONUP and event.button == 1:
if b1.zone_cliquable.collidepoint(event.pos):
etat = 1
elif b2.zone_cliquable.collidepoint(event.pos):
etat = 2
elif b3.zone_cliquable.collidepoint(event.pos):
sys.exit()
pygame.display.flip()
ecran.fill(constantes.BLANC)
if etat == 0:
etat = affiche_menu(ecran)
elif etat == 1:
etat = j1.gereJeu(ecran)
elif etat == 2:
etat = hs1.gereHighScore(ecran)
# Fonction principale du jeu
def game_loop():
# Paramètres de la raquette
PADDLE_WIDTH = 100
PADDLE_HEIGHT = 15
paddle_x = (SCREEN_WIDTH - PADDLE_WIDTH) / 2 # centré horizontalement
paddle_y = SCREEN_HEIGHT - PADDLE_HEIGHT - 10 # position verticale en bas
paddle_speed = 7
# Paramètres de la balle
ball_radius = 10
# Liste de balles (initialement une seule)
balls = [
{
"x": SCREEN_WIDTH / 2,
"y": SCREEN_HEIGHT / 2,
"radius": ball_radius,
"speed_x": 9 * random.choice([-1, 1]),
"speed_y": -9,
}
]
# Paramètres des briques
BRICK_ROWS = 5 # nombre de lignes de briques
BRICK_COLUMNS = 10 # nombre de colonnes de briques
BRICK_WIDTH = SCREEN_WIDTH // BRICK_COLUMNS
BRICK_HEIGHT = 20
brick_padding = 5
# Création de la grille de briques (liste de listes)
bricks = []
for row in range(BRICK_ROWS):
brick_row = []
for col in range(BRICK_COLUMNS):
brick_x = col * BRICK_WIDTH + brick_padding
brick_y = row * (BRICK_HEIGHT + brick_padding) + brick_padding
brick_rect = pygame.Rect(
brick_x, brick_y, BRICK_WIDTH - brick_padding * 2, BRICK_HEIGHT
)
brick_row.append(brick_rect)
bricks.append(brick_row)
running = True
while running:
clock.tick(FPS)
screen.fill(BLACK)
# Gestion des événements
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# --- Déplacement automatique de la raquette ---
# On cherche une balle qui descend (speed_y > 0), sinon on prend la première balle
target_ball = None
for ball in balls:
if ball["speed_y"] > 0:
target_ball = ball
break
if target_ball is None:
target_ball = balls[0]
# Calcul du centre de la raquette
paddle_center = paddle_x + PADDLE_WIDTH / 2
# Si le centre est trop à gauche ou à droite de la balle cible, on déplace la raquette
if paddle_center < target_ball["x"] - 5:
paddle_x += paddle_speed
elif paddle_center > target_ball["x"] + 5:
paddle_x -= paddle_speed
# Limiter la raquette à l'intérieur de l'écran
paddle_x = max(0, min(paddle_x, SCREEN_WIDTH - PADDLE_WIDTH))
# Création du rectangle de la raquette pour la collision
paddle_rect = pygame.Rect(paddle_x, paddle_y, PADDLE_WIDTH, PADDLE_HEIGHT)
# Liste pour stocker les nouvelles balles créées lors des collisions avec la raquette
nouvelles_balles = []
# Mise à jour de la position des balles
for ball in balls:
ball["x"] += ball["speed_x"]
ball["y"] += ball["speed_y"]
# Collision avec les murs latéraux
if (
ball["x"] - ball["radius"] <= 0
or ball["x"] + ball["radius"] >= SCREEN_WIDTH
):
ball["speed_x"] *= -1
# Collision avec le haut de l'écran
if ball["y"] - ball["radius"] <= 0:
ball["speed_y"] *= -1
# Création du rectangle de la balle pour la détection des collisions
ball_rect = pygame.Rect(
ball["x"] - ball["radius"],
ball["y"] - ball["radius"],
ball["radius"] * 2,
ball["radius"] * 2,
)
# Collision entre la balle et la raquette (uniquement si la balle descend)
if ball_rect.colliderect(paddle_rect) and ball["speed_y"] > 0:
ball["speed_y"] *= -1 # Inversion de la vitesse verticale
offset = (ball["x"] - (paddle_x + PADDLE_WIDTH / 2)) / (
PADDLE_WIDTH / 2
)
ball["speed_x"] = 4 * offset
# Création d'une nouvelle balle lors de la collision
new_ball = ball.copy()
new_ball["speed_x"] *= -1
new_ball["speed_x"] += random.choice([-1, 1])
nouvelles_balles.append(new_ball)
# Collision entre la balle et les briques
hit_brick = None
for row in bricks:
for brick in row:
if brick and ball_rect.colliderect(brick):
hit_brick = brick
ball["speed_y"] *= -1 # Inversion de la vitesse verticale
break
if hit_brick:
row[row.index(hit_brick)] = None
break
# Ajout des nouvelles balles générées
balls.extend(nouvelles_balles)
# Gestion des collisions entre balles
for i in range(len(balls)):
for j in range(i + 1, len(balls)):
dx = balls[i]["x"] - balls[j]["x"]
dy = balls[i]["y"] - balls[j]["y"]
distance = math.sqrt(dx * dx + dy * dy)
if distance < balls[i]["radius"] + balls[j]["radius"]:
# Échange des vitesses pour simuler une collision élastique
balls[i]["speed_x"], balls[j]["speed_x"] = (
balls[j]["speed_x"],
balls[i]["speed_x"],
)
balls[i]["speed_y"], balls[j]["speed_y"] = (
balls[j]["speed_y"],
balls[i]["speed_y"],
)
# Ajustement des positions pour éviter la superposition
overlap = balls[i]["radius"] + balls[j]["radius"] - distance
if distance != 0:
nx = dx / distance
ny = dy / distance
else:
nx, ny = 1, 0
balls[i]["x"] += nx * overlap / 2
balls[i]["y"] += ny * overlap / 2
balls[j]["x"] -= nx * overlap / 2
balls[j]["y"] -= ny * overlap / 2
# Suppression des balles qui sortent par le bas de l'écran
balls = [ball for ball in balls if ball["y"] - ball["radius"] <= SCREEN_HEIGHT]
if not balls:
print("Game Over!")
running = False
# Dessiner la raquette
pygame.draw.rect(screen, BLUE, paddle_rect)
# Dessiner les briques
for row in bricks:
for brick in row:
if brick:
pygame.draw.rect(screen, RED, brick)
# Dessiner les balles
for ball in balls:
pygame.draw.circle(
screen, WHITE, (int(ball["x"]), int(ball["y"])), ball["radius"]
)
pygame.display.flip()
pygame.quit()
sys.exit()
# Programme principal
if __name__ == "__main__":
show_menu() # Afficher le menu de démarrage
game_loop() # Lancer le jeu
pygame.display.update() # rafraichissement
clock.tick(60)