diff --git a/gameover.mp3 b/gameover.mp3 new file mode 100644 index 0000000..1fd5b58 Binary files /dev/null and b/gameover.mp3 differ diff --git a/main.py b/main.py index 05e9e37..513c471 100644 --- a/main.py +++ b/main.py @@ -1,95 +1,126 @@ -import pygame +import pygame from pygame.locals import * -from random import randint -from pygame.mixer import music -pygame.mixer.init() +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 -fond.image = pygame.image.load("terre.jpg").convert() #charger l'image -fond.rect = fond.image.get_rect() #obtenir les coordonnées de l'image -fond.rect.x = 0 #position x -fond.rect.y = 0 #position y -def creer_ananas(pos_x, pos_y): #créer un ananas +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 - ananas.image = pygame.transform.scale(ananas.image,[200, 100]) #redimensionner l'image - ananas.rect = ananas.image.get_rect() #obtenir les coordonnées de l'image - ananas.rect.x = pos_x - ananas.rect.y = pos_y - return ananas #retourner l'ananas + 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 - missiles.image = pygame.transform.scale(missiles.image,[10, 100]) #redimensionner l'image - missiles.rect = missiles.image.get_rect() #obtenir les coordonnées de l'image - missiles.rect.x = pos_x - missiles.rect.y = pos_y - return missiles + 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 -missiles = pygame.sprite.Sprite() #créer un sprite -liste_de_missiles = [] #créer une liste -liste_sprites_missiles = pygame.sprite.Group() #créer un groupe +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.sprite.LayeredUpdates() #mettre les sprites en ordre -pygame.init() -clock = pygame.time.Clock() #créer un horloge +pygame.sprite.LayeredUpdates() #mettre les sprites en ordre +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() -pygame.sprite.Sprite.__init__(avion) #initialiser le sprite -avion.image = pygame.image.load("avion.png").convert_alpha() #charger l'image -avion.image = pygame.transform.scale(avion.image,[120, 120]) #redimensionner l'image -avion.rect = avion.image.get_rect() -avion.rect.x = 200 #position x -avion.rect.y = 400 #position y -liste_des_sprites = pygame.sprite.LayeredUpdates() #créer un groupe -liste_des_sprites.add(fond) #ajouter le fond -liste_sprites_ananas = pygame.sprite.LayeredUpdates() -liste_des_sprites.add(avion) #ajouter l'avion -liste_d_ananas = [] #créer une liste + +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")) -if intro == 1: - 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! Pour ce faire, appuyez sur votre souris pour tirer et manoeuvrez-la en la pour bouger votre SU-PER12! Bonne chance!") #afficher un message -else: +intro = int(input("Voulez-vous sauver la Terre ? 1 pour oui, 2 pour non: ")) #demander à l'utilisateur s'il veut sauver la Terre + +if intro == 1: #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 à intro == 1 + 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.remove(liste_des_sprites) #enlever l'avion + 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 à intro == 2 + 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() -texte.image = police.render("ALERTE, PLANETE TERRE EST SOUS ATTAQUE", 1, (10, 10, 10),(255, 90, 20)) #créer un texte -texte.rect = texte.image.get_rect() -texte.rect.centerx = 310 #position x -texte.rect.centery = 20 #position y -liste_des_sprites.add(texte) #ajouter le texte +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 -gameover = False #définir la variable gameover +rapidite_ananas = 4 # mouvement de l'ananas (4 pixels par refraichissement de la fenêtre)) -ananas_speed = 4 #définir la vitesse de l'ananas +delay = 10 #définir le délai (10sec) des ananas pour que l'utilisateur puisse lire la consigne -delay = 10 #définir le délai +missiles_sound = pygame.mixer.Sound("bruitstirs.wav") #créer un son pour les missiles -missiles_sound = pygame.mixer.Sound("bruitstirs.wav") #créer un son - -music = pygame.mixer.music.load("musique fond.mp3") #charger la musique +timer = 0 #initialiser le timer +score = 0 #initialiser le score while running: #tant que running est vrai + if intro == 2: #si l'utilisateur choisit l'intro == 2 + 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 - keys = pygame.key.get_pressed() #obtenir les touches appuyées - if keys[pygame.K_SPACE] == True: #si la touche espace est appuyée - liste_des_sprites.remove(texte) #retirer le texte + 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 + if intro == 1: - liste_des_sprites.draw(fenetre) #dessiner les sprites - liste_sprites_ananas.draw(fenetre) + liste_sprites_missiles.empty() #remove all missiles from the group + music = pygame.mixer.music.load("invasion musique.mp3") #charger la musique + pygame.mixer.music.play(1) + + + 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 @@ -97,79 +128,117 @@ while running: #tant que running est vrai 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 - nouveau_missile = tirer_missiles(avion.rect.centerx, HAUTEUR/2) #créer un nouveau missile - pygame.mixer.Sound.play(missiles_sound) #jouer le son - 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 event.type == MOUSEBUTTONDOWN: #si l'événement est le clic de la souris + if gameover == False and intro != 2: #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é - nombre_aleatoire = randint(0, 100) #obtenir un nombre aléatoire - if nombre_aleatoire == 100: #si le nombre aléatoire est 100 - position_x_aleatoire = randint(0, LARGEUR - 60) - 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 + 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'un + ananas.delay_timer -= 1 #soustraire le délai d'une ananas else: - ananas.rect.y += ananas_speed #ajouter la vitesse à la position y de l'ananas - if ananas.rect.colliderect(avion): #si l'ananas touche l'avion - print("COLLISION, L'OBJET A ÉTÉ ÉLIMINÉ, MALHEUREUSEMENT, VOUS AUSSI.") - police = pygame.font.Font(None, 50) #créer une police + ananas.rect.y += rapidite_ananas #ajouter la vitesse à la position y de l'ananas + if ananas.rect.colliderect(avion) and intro != 2: #si l'ananas touche l'avion ET si l'intro != 2 + 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 de l'image - texte.rect.centerx = 310 - texte.rect.centery = 200 - liste_des_sprites.add(texte) #ajouter le texte + 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 - gameover = True #définir la variable gameover à vrai - if ananas.rect.y > HAUTEUR: #si l'ananas dépasse la hauteur de la fenêtre - gameover = True - police = pygame.font.Font(None, 36) - texte1 = pygame.sprite.Sprite() #créer un texte - pygame.sprite.Sprite.__init__(texte1) #initialiser le sprite - texte1.image = police.render("GAMEOVER", 1, (10,10,10),(255, 90, 20)) - texte1.rect = texte1.image.get_rect() - texte1.rect.centerx = 310 - texte1.rect.centery = 200 - liste_des_sprites.add(texte1) #ajouter le texte1 + ananas.kill() #supprimer l'ananas (de la fenetre) + gameover = True #définir la variable gameover comme vrai - police = pygame.font.Font(None, 36) - texte22 = pygame.sprite.Sprite() #créer un texte - pygame.sprite.Sprite.__init__(texte22) - texte22.image = police.render("L'ennemi est entré dans notre atmosphère!", 1, (10,10,10),(255, 90, 20)) - texte22.rect = texte22.image.get_rect() - texte22.rect.centerx = 310 - texte22.rect.centery = 250 - liste_des_sprites.add(texte22) #ajouter le texte22 + if ananas.rect.y > HAUTEUR: #si l'ananas dépasse l'hauteur de la fenêtre - police = pygame.font.Font(None, 36) - texte33 = pygame.sprite.Sprite() #créer un texte - pygame.sprite.Sprite.__init__(texte33) - texte33.image = police.render("Réessayez de tuer tout les ennemis!", 1, (10,10,10),(255, 90, 20)) - texte33.rect = texte33.image.get_rect() - texte33.rect.centerx = 310 - texte33.rect.centery = 300 - liste_des_sprites.add(texte33) #ajouter le texte33 + if intro == 2: #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 - for missiles in liste_de_missiles: #pour chaque missile - missiles.rect.y -= 10 #soustraire 10 à la position y du missile + 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 + 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 + 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 - ananas.kill() #supprimer l'ananas - liste_de_missiles.remove(missiles) #retirer le missile de la liste - missiles.kill() #supprimer 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 - pygame.display.flip() #mettre à jour la fenêtre - fenetre.fill((0,0,0)) #remplir la fenêtre avec la couleur noire - clock.tick(50) #mettre le nombre de frames par seconde -pygame.quit() + 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 diff --git a/victoire.mp3 b/victoire.mp3 new file mode 100644 index 0000000..b5a300c Binary files /dev/null and b/victoire.mp3 differ