import pygame from pygame.locals import * from random import randint from pygame.mixer import music #musique pygame.mixer.init() #initialiser la musique LARGEUR = 610 #largeur de la fenêtre HAUTEUR = 600 #hauteur de la fenêtre fenetre = pygame.display.set_mode((LARGEUR, HAUTEUR)) #créer la fenêtre fond = pygame.sprite.Sprite() #créer un sprite pour le fond de la terre fond.image = pygame.image.load("terre.jpg").convert() #charger l'image de la terre fond.rect = fond.image.get_rect() #obtenir les coordonnées de l'image de la terre fond.rect.x = 0 #position x de l'image "terre.jpg" fond.rect.y = 0 #position y de l'image "terre.jpg" def creer_ananas(pos_x, pos_y): #créer un ananas (adversaire) ananas = pygame.sprite.Sprite() #créer un sprite pygame.sprite.Sprite.__init__(ananas) #initialiser le sprite ananas.image = pygame.image.load("ananas.png").convert_alpha() #charger l'image de l'ananas ananas.image = pygame.transform.scale(ananas.image,[200, 100]) #redimensionner l'image de l'ananas ananas.rect = ananas.image.get_rect() #obtenir les coordonnées de l'image de l'ananas ananas.rect.x = pos_x # position x de l'image de l'ananas ananas.rect.y = pos_y # position y de l'image de l'ananas return ananas #retourner l'ananas def tirer_missiles(pos_x, pos_y): #créer un missile missiles = pygame.sprite.Sprite() #créer un sprite pygame.sprite.Sprite.__init__(missiles) #initialiser le sprite missiles.image = pygame.image.load("missiles.png").convert_alpha() #charger l'image du missile missiles.image = pygame.transform.scale(missiles.image,[10, 100]) #redimensionner l'image du missile missiles.rect = missiles.image.get_rect() #obtenir les coordonnées de l'image du missile missiles.rect.x = pos_x # position x de l'image du missile missiles.rect.y = pos_y # position y de l'image du missile return missiles #retourner le missile liste_sprites_ananas = pygame.sprite.LayeredUpdates() #créer une liste pour les ananas liste_de_missiles = [] #créer une liste vide pour stocker les missiles liste_sprites_missiles = pygame.sprite.Group() #créer un groupe pour stocker les missiles pygame.init() #initialiser pygame clock = pygame.time.Clock() #créer un horloge pour contrôler la vitesse de rafraîchissement de la fenêtre running = True #définir la variable running avion = pygame.sprite.Sprite() #créer un sprite pour l'avion pygame.sprite.Sprite.__init__(avion) #initialiser le sprite de l'avion avion.image = pygame.image.load("avion.png").convert_alpha() #charger l'image de l'avion avion.image = pygame.transform.scale(avion.image,[120, 120]) #redimensionner l'image de l'avion avion.rect = avion.image.get_rect() #obtenir les coordonnées de l'image de l'avion avion.rect.x = 200 #position x de l'image de l'avion avion.rect.y = 450 #position y de l'image de l'avion liste_des_sprites = pygame.sprite.LayeredUpdates() #créer un groupe pour stocker les sprites liste_des_sprites.add(fond) #ajouter le fond à la liste des sprites liste_des_sprites.add(avion) #ajouter l'avion à la liste des sprites liste_d_ananas = [] #créer une liste vide pour stocker les ananas gameover = False #définir la variable gameover intro = int(input("Voulez-vous sauver la Terre ? 1 pour oui, 2 pour non: ")) #demander à l'utilisateur s'il veut sauver la Terre sauver = (intro == 1) if sauver == True: #si l'utilisateur veut sauver la Terre print("ALERTE! La planète Terre est attaquée par une flotte d’avions spatiaux! Vous vous trouvez dans l’engin SU-PER12. Votre mission est d’éliminer le plus d’ennemis possible! En éliminant les adversaires, vous gagnez 10 points. La planète sera sauvée, lorsque vous aurez atteind les 100 points! Pour ce faire, appuyez sur votre souris pour tirer et manoeuvrez-la en la pour bouger votre SU-PER12. Bonne chance!") #afficher un message music = pygame.mixer.music.load("musique fond.mp3") #charger la musique de fond correspondant à sauver == True pygame.mixer.music.play(-1) #jouer la musique de fond en boucle pygame.mixer.music.set_volume(0.3) # changer le volume de la musique de fond else: #si l'utilisateur ne veut pas sauver la Terre gameover == True #définir la variable gameover print("Dommage, la fin du Monde est proche...") avion.kill() # enlever l'avion de la liste des sprites (et donc de la fenetre) liste_sprites_missiles.empty() #enlever tout les missiles du groupe music = pygame.mixer.music.load("invasion musique.mp3") #charger la musique de fond correspondant à sauver == False pygame.mixer.music.play(1) #jouer la musique de fond qu'une seule fois police = pygame.font.Font(None, 30) #créer une police texte= pygame.sprite.Sprite() #créer un sprite texte.image = police.render("ALERTE, PLANETE TERRE EST SOUS ATTAQUE", 1, (10, 10, 10),(255, 90, 20)) #créer un texte pour annoncer l'invasion texte.rect = texte.image.get_rect() #obtenir les coordonnées du texte texte.rect.centerx = 310 #position x du texte texte.rect.centery = 20 #position y du texte liste_des_sprites.add(texte) #ajouter le texte à la liste des sprites rapidite_ananas = 4 # mouvement de l'ananas (4 pixels par refraichissement de la fenêtre)) delay = 10 #définir le délai (10sec) des ananas pour que l'utilisateur puisse lire la consigne missiles_sound = pygame.mixer.Sound("bruitstirs.wav") #créer un son pour les missiles timer = 0 #initialiser le timer score = 0 #initialiser le score while running: #tant que running est vrai if sauver == False: #si l'utilisateur choisit l'sauver == False timer += 1 #incrément du timer à chaque phase d'exécution if timer >= 30 * 60: #si le timer est plus grand ou égal à 30 sec * 60 cadres par sec gameover = True #définir gameover comme True music = pygame.mixer.music.load("gameover.mp3") #charger la musique du gameover pygame.mixer.music.play(1)#jouer la musique du gameover qu'une seule fois police = pygame.font.Font(None, 50) #créer une police pour le texte texte = pygame.sprite.Sprite() #créer un texte pour le gameover texte.image = police.render("GAMEOVER", 1, (10, 10, 10),(255, 90, 20)) #créer un texte pour le gameover texte.rect = texte.image.get_rect() #obtenir les coordonnées du texte texte.rect.centerx = 310 #position x du texte texte.rect.centery = 200 #position y du texte liste_des_sprites.add(texte) #ajouter le texte à la liste des sprites texte = pygame.sprite.Sprite() #créer un second message texte.image = police.render("INVASION ABOUTIE", 1, (10, 10, 10),(255, 90, 20)) #créer un texte pour informer le joueur de l'invasion texte.rect = texte.image.get_rect() #obtenir les coordonnées de l'image texte.rect.centerx = 310 texte.rect.centery = 240 liste_des_sprites.add(texte) #ajouter le texte liste_des_sprites.draw(fenetre) #dessiner les sprites liste_sprites_ananas.draw(fenetre) #dessiner les ananas liste_sprites_missiles.draw(fenetre) #dessiner les missiles for event in pygame.event.get(): #pour chaque événement if event.type == pygame.QUIT: #si l'événement est quitter running = False if event.type == MOUSEMOTION: #si l'événement est la position de la souris avion.rect.x = event.pos[0] if event.type == MOUSEBUTTONDOWN: #si l'événement est le clic de la souris if gameover == False and sauver == True: #if gameover is not true nouveau_missile = tirer_missiles(avion.rect.centerx, HAUTEUR/2) #créer un nouveau missile pygame.mixer.Sound.play(missiles_sound) #jouer le son du tir liste_de_missiles.append(nouveau_missile) #ajouter le nouveau missile à la liste liste_sprites_missiles.add(nouveau_missile) #ajouter le nouveau missile au groupe if gameover == False: #si le jeu n'est pas terminé if score < 100: # only spawn ananas if score is less than 100 nombre_aleatoire = randint(0, 100) #obtenir un nombre aléatoire pour contrôler la fréquence des ananas if nombre_aleatoire == 100: #si le nombre aléatoire est 100 position_x_aleatoire = randint(0, LARGEUR - 60) #obtenir une position x aléatoire pour l'ananas nouvel_ananas = creer_ananas(position_x_aleatoire, -100) #créer une nouvelle ananas liste_d_ananas.append(nouvel_ananas) #l'ajouter à la liste liste_sprites_ananas.add(nouvel_ananas) #l'ajouter au groupe nouvel_ananas.delay_timer = delay * 60 #définir le délai for ananas in liste_d_ananas: if ananas.delay_timer > 0: #si le délai est supérieur à 0 ananas.delay_timer -= 1 #soustraire le délai d'une ananas else: ananas.rect.y += rapidite_ananas #ajouter la vitesse à la position y de l'ananas if ananas.rect.colliderect(avion) and sauver == True: #si l'ananas touche l'avion ET si sauver == True print("COLLISION, L'OBJET A ÉTÉ ÉLIMINÉ, MALHEUREUSEMENT, VOUS AUSSI.") #message pour informer la mort de l'utilisateur avion.kill() #enlever l'avion de la liste des sprites (et donc de la fenetre)) music = pygame.mixer.music.load("gameover.mp3") #charger la musique du gameover pygame.mixer.music.play(1) #jouer la musique du gameover qu'une seule fois police = pygame.font.Font(None, 50) #créer une police pour le texte texte = pygame.sprite.Sprite() #créer un texte texte.image = police.render("GAMEOVER", 1, (10, 10, 10),(255, 90, 20)) texte.rect = texte.image.get_rect() #obtenir les coordonnées du texte texte.rect.centerx = 310 #position x du texte texte.rect.centery = 200 #position y du texte liste_des_sprites.add(texte) #ajouter le texte à la liste des sprites liste_d_ananas.remove(ananas) #retirer l'ananas de la liste ananas.kill() #supprimer l'ananas (de la fenetre) gameover = True #définir la variable gameover comme vrai if ananas.rect.y > HAUTEUR: #si l'ananas dépasse l'hauteur de la fenêtre if sauver == False: #si l'utilisateur a choisi de ne pas sauver la Terre gameover = False #définir la variable gameover comme faux else: gameover = True #définir la variable gameover comme vrai police = pygame.font.Font(None, 36) texte1 = pygame.sprite.Sprite() #créer un texte du gameover pygame.sprite.Sprite.__init__(texte1) #initialiser le sprite texte1.image = police.render("GAMEOVER", 1, (10,10,10),(255, 90, 20)) #créer un texte du gameover texte1.rect = texte1.image.get_rect() #obtenir les coordonnées du texte texte1.rect.centerx = 310 #position x du texte texte1.rect.centery = 200 #position y du texte liste_des_sprites.add(texte1) #ajouter le texte1 à la liste des sprites police = pygame.font.Font(None, 36) #créer une police pour le texte texte22 = pygame.sprite.Sprite() #créer un texte pour informer de l'invasion des adversaires pygame.sprite.Sprite.__init__(texte22) #initialiser le sprite texte22.image = police.render("L'ennemi est entré dans notre atmosphère!", 1, (10,10,10),(255, 90, 20)) #créer un texte pour informer de l'invasion des adversaires texte22.rect = texte22.image.get_rect() #obtenir les coordonnées du texte texte22.rect.centerx = 310 #position x du texte texte22.rect.centery = 250 #position y du texte liste_des_sprites.add(texte22) #ajouter le texte22 à la liste des sprites police = pygame.font.Font(None, 36) #créer une police pour le texte texte33 = pygame.sprite.Sprite() #créer un texte motivant l'utilisateur d'une (nouvelle) mission pygame.sprite.Sprite.__init__(texte33) #initialiser le sprite texte33.image = police.render("Réessayez de tuer tout les ennemis!", 1, (10,10,10),(255, 90, 20)) #créer un texte motivant l'utilisateur d'une (nouvelle) mission texte33.rect = texte33.image.get_rect() #obtenir les coordonnées du texte texte33.rect.centerx = 310 #position x du texte texte33.rect.centery = 300 #position y du texte liste_des_sprites.add(texte33) #ajouter le texte33 à la liste des sprites for missiles in liste_de_missiles: #pour chaque missile dans la liste des missiles missiles.rect.y -= 10 #soustraire 10 à la position y du missile (10 pixels, le missile monte dans l'écran) if missiles.rect.y <= 0: #si la position y du missile est inférieure ou égale à 0 liste_de_missiles.remove(missiles) #retirer le missile de la liste missiles.kill() #supprimer le missile (de la fenetre) else: for ananas in liste_d_ananas: #pour chaque ananas dans la liste des ananas if ananas.rect.colliderect(missiles): #si l'ananas touche le missile liste_d_ananas.remove(ananas) #retirer l'ananas de la liste des ananas ananas.kill() #supprimer l'ananas (de la fenetre) liste_de_missiles.remove(missiles) #retirer le missile de la liste des missiles missiles.kill() #supprimer le missile (de la fenetre) score += 10 # augmenter le score de l'utilisateur de 10 points print(f"Score:", score) # print le score texte_score = police.render("Score: " + str(score), 1, (10, 10, 10), (255, 90, 20)) #actualiser le texte du score texte_score_rect = texte_score.get_rect() #obtenir les coordonnées du texte texte_score_rect.topleft = (10, 10) #position du texte if score >= 100: #vérifier le jeu pour une victoire gameover = True #définir la variable gameover comme vrai music = pygame.mixer.music.load("victoire.mp3") #charger la musique de la victoire pygame.mixer.music.play(1) #jouer la musique de la victoire qu'une seule fois police = pygame.font.Font(None, 50) #créer une police pour le texte texte = pygame.sprite.Sprite() #créer un texte pour informer de la victoire texte.image = police.render("VICTOIRE!", 1, (10, 10, 10),(255, 90, 20)) #créer un texte pour informer de la victoire texte.rect = texte.image.get_rect() #obtenir les coordonnées du texte texte.rect.centerx = 310 #position x du texte texte.rect.centery = 200 #position y du texte liste_des_sprites.add(texte) #ajouter le texte à la liste des sprites texte = pygame.sprite.Sprite() #créer un second texte pour informer de la victoire texte.image = police.render("LA TERRE EST SAUVÉE!", 1, (10, 10, 10),(255, 90, 20)) #créer un second texte pour informer de la victoire texte.rect = texte.image.get_rect() #obtenir les coordonnées du texte texte.rect.centerx = 310 #position x du texte texte.rect.centery = 235 #position y du texte liste_des_sprites.add(texte) #ajouter le texte à la liste des sprites pygame.display.flip() #mettre à jour la fenêtre fenetre.fill((0,0,0)) #remplir la fenêtre avec la couleur noire (derrière la terre) clock.tick(50) #mettre le nombre de cadres par sec pygame.quit() #quitter pygame