N.B. Niveau : Première Générale, enseignement de spécialité NSI (Numérique et Sciences Informatiques)
Dans le cadre des projets, si vous êtes intéressés par la création de jeux vidéo en 2D, il existe le module Pygame de Python.
Attention : le choix de ce type de projet demande un investissement initial important, et cela ne doit pas empiéter sur les autres disciplines...
#########################################- Enregistez le programme dans le répertoire du jeu
# Programme écrit par Prénom Nom Classe #
#########################################
import pygame,sys
from pygame.locals import *
pygame.init()
pygame.font.init()
fenetre_jeu=pygame.display.set_mode((450,560)) # Taille fenêtre du jeu en pixels
pygame.display.set_caption('SpaceInvader') # titre de la fenêtre
#############################
# Déclaration des variables #
#############################
Gauche = False
Droite = False
Texty = pygame.font.Font('SUPERPOI_R.TTF', 10)
Obj_texte = Texty.render('les envahisseurs', 0, (0,0,255))
clock = pygame.time.Clock()
vaisseau = pygame.image.load('vaisseau.png')
rectangle_vaisseau = pygame.Rect(20,500,31,32)
#####################################
# Fonction de détection des Touches #
#####################################
def detecte_touches():
""" Cette fonction permet de détecter les touches enfoncées ou relâchées
de quitter le jeu ou de permettre le déplacement du vaisseau"""
global Gauche,Droite
for event in pygame.event.get():
if event.type==QUIT: # Traite l'évènement fermer la fenêtre avec la souris
pygame.quit()
sys.exit()
if event.type== KEYDOWN: # Traiter les évènements du clavier
if event.key==K_ESCAPE:
pygame.quit()
sys.exit()
if event.key==K_RIGHT:
Droite = True
if event.key==K_LEFT:
Gauche = True
if event.type== KEYUP:
if event.key==K_RIGHT:
Droite = False
if event.key==K_LEFT:
Gauche = False
#####################
# BOUCLE PRINCIPALE #
#####################
while True:
fenetre_jeu.fill (0x00001A) # Remplir l'arrieère plan avec la couleur RVB Bleu foncé
fenetre_jeu.blit(Obj_texte,(50,20)) # Placer le texte
fenetre_jeu.blit(vaisseau,rectangle_vaisseau) # placer l'image
detecte_touches()
# Déplacement du vaisseau d'un pixel
if Gauche and rectangle_vaisseau.left > 10 : rectangle_vaisseau.left -= 1
if Droite and rectangle_vaisseau.right < 440 : rectangle_vaisseau.right += 1
pygame.display.update() # rafraichir l'affichage de la fenêtre jeu
clock.tick(30) # Vitesse du jeu : 30 FPS
Si la touche K_SPACE est enfoncée alorsl'ajout d'un missile se fait par la l'instruction : missiles.append(pygame.Rect(rectangle_vaisseau.left+12,rectangle_vaisseau.top,6,16))
ajouter à la liste missiles un nouveau missle
def deplace_missiles():
""" Cette fonction permet de changer les coordonnées des missiles contenu dans la liste missiles"""
for missile in missiles: # pour chaque missiles existant
missile.top=missile.top-10 # soustraire 10 à la coordonnée du point haut
pygame.draw.rect(fenetre_jeu,0xFF0000,missile) # dessinner un rectangle de couleur rouge
if missile.top<=100: # si le missiles arrive en haut de l'écran
missiles.remove(missile) # supprimer le missiles de la liste
A la fin du programme, avant pygame.display.update(), appeler la fonction deplace_missiles()def niveau(n):- Avant la boucle principale, appeler la fonction niveau(1)
"""Cette fonction génère des coordonnées de retangles aléatoirement"""
if n==1:
for i in range(100,500,50):
aliens.append(pygame.Rect(i,random.randint(100,200),31,24))
def placer_aliens():- Appeler cette fonction dans la boucle principale avant l'appel de la fonction deplace_missiles().
"""Cette fonction permet de placer les aliens dans la fenêtre de jeu"""
for alien in aliens:
pygame.draw.rect(fenetre_jeu,0x00FFFF,alien)
déclarer la fonction detecte_collision():- Appeler la fonction detect_collision() dans la boucle principale avant le placement des aliens dans de la fenêtre jeu.
pour chaque missile dans la liste des missiles:
pour chaque alien dans la liste des aliens:
si le missile est en collision avec un alien:
retirer l'alien de la liste des aliens
retirer le missile de la liste des missiles
def placer_aliens(image):- Dans la boucle pricipale modifier l'appel de la fonction placer_aliens() par placer_aliens(img_aliens)
"""Cette fonction permet de placer les aliens dans la fenêtre de jeu"""
for alien in aliens:
fenetre_jeu.blit(image,alien)
définir la fonction niveau(n):
.... code actuel à garder puis à compléter par : ...
si n = 2 alors
pour y variant de 100 à 250 avec un pas de 50
pour x variant de 75 à 300 avec un pas de 50
ajouter à la liste des aliens les coordonnées du rectangle (x,y,31,24)
img_aliens=[pygame.image.load('invader1.png'),pygame.image.load('invader2.png')]img_alien devient une liste contenant 2 images qu'on peut alterner en fonction du temps. Dans le boucle principale l'appel de la fonction placer_aliens(img_aliens) sera remplacée par le code suivant :
i+=1- Déclarer et initialiser la variable i=0 en début de programme.
placer_aliens(img_aliens[(i//15)%2]) # Changement d'image toutes les 0.5 secondes si FPS=30
définir la fonction deplace_aliens(x,y):- Appler cette fonction dans la boucle principale avant de placer les aliens : deplace_aliens(vitesse,0)
pour chaque alien dans la liste des aliens
alien.left + = x
alien.top + = y
définir la fonction change_sens_aliens():- Appeler cette fonction avant la ligne pygame.display.update()
déclarer la variable globale vitesse
pour chaque alien dans la liste des aliens:
si la coordonnée droite de l'alien > 440 ou si la coordonnée gauche de l'alien < 10
vitesse=-vitesse
déplace aliens (0,10)
stop (break)
- Déclarer une variables de type liste missiles_aliens=[]
si tps_tir_alien <= i alors- La fonction ajouter_tir_alien() se code de la manière suivante :
tps_tir_alien = i + random.randint(15,60)
ajouter_tir_alien()
def ajouter_tir_alien()- Commenter les lignes du code ci-dessus dans votre porgramme.
choix=random.choice(aliens)
missiles_aliens.append(pygame.Rect(choix.left+12,choix.bottom,6,16))
Deux ouvrages sur Pygame (pour Python version 3) sont consultables et téléchargeables sur le site de Al Sweigart (en anglais) :
inventwithpython.com
inventwithpython.com/chapters (chapters 17 to 20)
inventwithpython.com/pygame/chapters
Contenu sous licence CC BY-NC-SA 3.0
Fabrice Sincère ; version 1.3.5.29
Modifié et adapté par Pascal Hassenforder 11/12/2019