

#--------#
#modules #
#--------#
import pygame
import sys
import random


#-----------------------------------------#

# Declaration des variables er constantes #

#-----------------------------------------#





# Constantes de la fenêtre de jeu
SCREEN_LARG = 800 # SCREEN_LARG de la fenêtre de jeu
SCREEN_HAUT = 600 # Hauteur de la fenêtre de jeu

# Constantes du Jeu
RAQU_HAUT = 100 # Hauteur d'une raquette
RAQU_LARG = 15 # SCREEN_LARG d'une raquette
DIST_MUR = 50 # Distance du mur au bord d'une raquette
BALL_RAY = 40 # Rayon de l'asteroide

# Couleurs

NOIR = (0, 0, 0)
BLANC = (255, 255, 255)
ROUGE = (255, 0, 0)
BLEU = (0, 0, 255)
VERT = (0, 255, 0)


##################
# INITIALISATION #
##################
# Initialisation de l'écran de jeu
pygame.init()

# Initialisation de la fenêtre de jeu
ecran = pygame.display.set_mode((SCREEN_LARG, SCREEN_HAUT))
pygame.display.set_caption("Pong Spatial")

# Choix de la police de caractères
police = pygame.font.SysFont("Arial", 25)
font = pygame.font.Font(None, 36)
big_font = pygame.font.Font(None, 72)  # Police pour les écrans de démarrage et de fin

# Gestion du rafraichissement de l'écran
clock = pygame.time.Clock()

# Initialisation de la fréquence sur 30 FPS
clock.tick(30)

# Cacher le pointeur de la souris
pygame.mouse.set_visible(0)

# Arrière-plan spatial (étoiles et nébuleuses)



# Coordonnées des vaisseaux
# Méthodes d'initialisation, pour être réutilisées dans le jeu

def init_vaisseau_1():
    return pygame.Rect(DIST_MUR, SCREEN_HAUT // 2 - RAQU_HAUT // 2, RAQU_LARG, RAQU_HAUT)

def init_vaisseau_2():
    return pygame.Rect(SCREEN_LARG - DIST_MUR - RAQU_LARG, SCREEN_HAUT // 2 - RAQU_HAUT // 2, RAQU_LARG, RAQU_HAUT)

# Vaisseaux
joueur1_vaisseau = init_vaisseau_1()
joueur2_vaisseau = init_vaisseau_2()

# accelaration verticale vers le vas : coefficient de gravité
coef_grav = 0.001



# Dictionnaire qui servira a stocker les valeurs des différentes variables qui sont modifiées au cours du jeu

# variable score_equipe et nombre des asteroides_restants

#affichage initial de l'asteroide (gerer son rayon)en haut de l'ecran, de facçon aleatoire selon x

# les différents paramètres de l'asteroide qui sont modifiés ensuite à chaque choc sur un asteroide



etat = {

    'score_equipe': 10,
    'asteroides_restants': 10,

}

# Coordonnées de l'astéroïde
# Méthoode d'initialisation, pour être réutilisée dans le jeu
def initAsteroide():
    rayon = BALL_RAY
    x = SCREEN_LARG // 2
    y = SCREEN_HAUT // 2
    speed_x = 4 * random.choice([-1, 1])
    speed_y = 2 * random.choice([-1, 1])
    return (rayon, x, y, speed_x, speed_y)

asteroide_rayon, asteroide_x , asteroide_y , asteroide_speed_x , asteroide_speed_y  = initAsteroide()




# Horloge
clock = pygame.time.Clock()


#--------------------------#
# Definition des fonctions #
#--------------------------#



def dpct_vaisseaux():
    # Récupère la liste des touches claviers appuyeées sous la forme d'une liste de booléens
    KeysPressed = pygame.key.get_pressed()
    
    #Déplace les vaisseaux avec les touches du clavier.

    if KeysPressed[pygame.K_a] and joueur1_vaisseau.top > 0:# monter : touche Azerti R 'codé en python touche w qwerty)
        joueur1_vaisseau.y -= 5

    if KeysPressed[pygame.K_q] and joueur1_vaisseau.bottom < SCREEN_HAUT: # descendre : touche s
        joueur1_vaisseau.y += 5

    if KeysPressed[pygame.K_UP] and joueur2_vaisseau.top > 0:# monter touche flèche haut
        joueur2_vaisseau.y -= 5

    if KeysPressed[pygame.K_DOWN] and joueur2_vaisseau.bottom < SCREEN_HAUT: # descendre touche flèche bas
        joueur2_vaisseau.y += 5


def dpct_asteroide():
    #declaration des variables globales dans la fonction
    #Ça dit explicitement à Python : “ces variables viennent du scope global (déclarée en dehors de toute fonction)
    global asteroide_x, asteroide_y, asteroide_speed_x, asteroide_speed_y
    
    
    #Déplace l'astéroïde et gère les collisions.
    asteroide_x += asteroide_speed_x
    asteroide_y += asteroide_speed_y


     # Rebond sur les bords haut et bas
    if (asteroide_y - asteroide_rayon) <= 0:
        asteroide_speed_y *= -1


def perdu():
    est_perdu = False
    # Collision entre l'asteroïde et le bord gauche de la fenêtre
    # Perdu
    if asteroide_x  <= asteroide_rayon :
        est_perdu = True

    # Collision entre l'asteroïde et le bord droit de la fenêtre
    # Perdu
    if asteroide_x  >= SCREEN_LARG - asteroide_rayon :
        est_perdu = True
        
    # Collision entre l'asteroïde et le bas de la fenêtre
    # Perdu
    if  (asteroide_y + asteroide_rayon) >= SCREEN_HAUT :
        est_perdu = True
    
    return est_perdu

def gagne():
    if asteroide_rayon <= 5 :
        return True
    else :
        return False

def dessin():

    #Dessine tous les éléments à l'écran.

    ecran.fill(NOIR)

    #dessin_etoiles_fond(etoiles)
    

    #Dessine les vaisseaux 
    pygame.draw.rect(ecran, BLEU, joueur1_vaisseau)
    pygame.draw.rect(ecran, ROUGE, joueur2_vaisseau)

    #Dessine l'asteroide 
    if asteroide_rayon > 0:
        pygame.draw.circle(ecran, BLANC, (asteroide_x, asteroide_y), asteroide_rayon)


    # Affichage des points de vie de la Terre restantes

    vies_text = font.render(f"score de la planète : {etat['score_equipe']}", True, BLANC)

    ecran.blit(vies_text, (SCREEN_LARG // 2 - 80, 20))



    # Affichage du nombre d'asteroides restants

    asteroides_text = font.render(f"Astéroïdes restants : {etat['asteroides_restants']}", True, BLANC)

    ecran.blit(asteroides_text, (20, 50))



#######
# JEU #
#######
# Le jeu continue tant que l'utilisateur ne ferme pas la fenêtre
termine = False
# Boucle principale de jeu
while not termine:
    clock.tick(60)
    
    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            pygame.quit()

            sys.exit()
            
    if gagne():
        etat['asteroides_restants'] -= 1
        asteroide_rayon, asteroide_x , asteroide_y , asteroide_speed_x , asteroide_speed_y = initAsteroide()
        joueur1_vaisseau = init_vaisseau_1()
        joueur2_vaisseau = init_vaisseau_2()        
    elif perdu():
        etat['score_equipe'] -= 1
        etat['asteroides_restants'] -= 1
        asteroide_rayon, asteroide_x , asteroide_y , asteroide_speed_x , asteroide_speed_y = initAsteroide()
        joueur1_vaisseau = init_vaisseau_1()
        joueur2_vaisseau = init_vaisseau_2()
    else :
        dpct_vaisseaux()
        dpct_asteroide()

    dessin()

    pygame.display.flip()


