''' Programme pyxel inspiré d ' un tutoriel en ligne de " la Nuit du Code " https://nuit-du-code.forge.apps.education.fr/DOCUMENTATION/PYTHON/01-presentation/ https://www.cahiernum.net/KV8H5B Licence GNU (https://github.com/nuitducode/DOCUMENTATION/blob/main/LICENSE)
Module basé sur une architecture MVC ( modèle - vue - controleur ) globale et également intégrée aux objets .
'''
#Importation
import pyxel
import random
#Constantes
COULEUR_PERE_NOEL = 1
COULEUR_TIR = 10
COULEUR_ENNEMI = 8
X1_SAPIN = 25
Y1_SAPIN = 46
X2_SAPIN = 38
Y2_SAPIN = 19
X1_CADEAU1 = 14
Y1_CADEAU1 = 110
X2_CADEAU1 = 22
Y2_CADEAU1 = 115
POSITION_PLATEFORME = [ [ 1 , 0 , 0 , 0 , 0 , 1 ] , [ 1 , 1 , 1 , 0 , 1 , 0 ] ]
#Déclaration des classes
class Plateforme :
def __init__ ( self ) - > None :
self . x = 10
self . y = 10
def afficher ( self ) - > None :
for colonne in range ( 1 ) :
for ligne in range ( 6 ) :
if POSITION_PLATEFORME [ colonne ] [ ligne ] == 1 :
self . x = ( self . x * ( colonne + 1 ) )
self . y = ( self . y * ( ligne + 1 ) )
pyxel . blt ( self . x , self . y , 0 , 27 , 30 , 37 , 32 )
class Objet :
def __init__ ( self , x , y , x1 , y1 , x2 , y2 ) - > None :
self . x = x # coordonnée x du coin haut à gauche du carré
self . y = y # coordonnée y du coin haut à gauche du carré
self . x1 = x1
self . x2 = x2
self . y1 = y1
self . y2 = y2
def afficher ( self : ' Objet ' ) - > None :
""" Affichage des objets """
pyxel . blt ( self . x , self . y , 0 , self . x1 , self . y1 , self . x2 , self . y2 )
""" Classe intégrant la gestion du Modèle et de la Vue relative au Perenoel du joueur. """
class Perenoel :
def __init__ ( self , couleur : int = COULEUR_PERE_NOEL ) - > None :
self . x = 60 # coordonnée x du coin haut à gauche du carré
self . y = 60 # coordonnée y du coin haut à gauche du carré
self . couleur = couleur # couleur du vaisseau à l'écran
def set_x ( self : ' Perenoel ' , dx : int ) - > None :
""" Déplace le Perenoel à gauche si dx positif, à droite si négatif """
self . x = self . x + dx
if self . x < 0 :
self . x = 0
elif self . x > = 120 :
self . x = 120
def set_y ( self : ' Perenoel ' , dy : int ) - > None :
""" Déplace le Perenoel en bas si dy positif, en haut si négatif """
self . y = self . y + dy
if self . y < 0 :
self . y = 0
elif self . y > = 120 :
self . y = 120
def saut ( self : ' Perenoel ' ) :
for i in range ( 1 ) :
if i < 5 :
self . set_y ( - 1 )
else :
self . set_y ( 1 )
def gravite ( self : ' Perenoel ' ) :
if self . y < 80 :
self . set_y ( 1 )
def get_coord ( self : ' Perenoel ' ) - > tuple [ int , int ] :
""" Renvoie le couple (x, y) qui contient les coordonnées (du coin haut gauche) du Perenoel """
return ( self . x , self . y )
def afficher ( self : ' Perenoel ' ) - > None :
""" Affiche le Perenoel """
pyxel . blt ( self . x , self . y , 0 , 23 , 68 , 16 , 25 )
# (..., 0, 0, 0, 8, 8) car Image 0 à partir de (0;0) de taille 8*8)
""" Classe intégrant la gestion du Modèle relative au joueur. """
class Joueur :
def __init__ ( self , perenoel : ' Perenoel ' , vies : int ) - > None :
self . vies = vies # A 0, le joueur a perdu
self . perenoel = perenoel # L'instance de Perenoel du joueur
def est_vivant ( self : ' Joueur ' ) - > bool :
""" Prédicat qui renvoie vrai si le joueur a encore des vies """
return self . vies > 0
def get_vies ( self : ' Joueur ' ) - > int :
""" Renvoie le nombre de vies du joueur """
return self . vies
def perd_une_vie ( self : ' Joueur ' ) - > None :
""" Fait perdre une vie au joueur mais en imposant un minimum de 0 """
self . vies = self . vies - 1
if self . vies < 0 :
self . vies = 0
""" Classe intégrant la gestion du jeu. """
class Monstre :
def __init__ ( self ) - > None :
self . x = 100 # coordonnée x du coin haut à gauche du carré
self . y = 0 # coordonnée y du coin haut à gauche du carré
def set_x ( self : ' Monstre ' , dx : int ) - > None :
""" Déplace le zombie à gauche si dx positif, à droite si négatif """
self . x = self . x + dx
if self . x < 0 :
self . x = 0
elif self . x > = 120 :
self . x = 120
def set_y ( self : ' Monstre ' , dy : int ) - > None :
""" Déplace le Monstre en bas si dy positif, en haut si négatif """
self . y = self . y + dy
if self . y < 0 :
self . y = 0
elif self . y > = 120 :
self . y = 120
def get_coord ( self : ' Perenoel ' ) - > tuple [ int , int ] :
""" Renvoie le couple (x, y) qui contient les coordonnées (du coin haut gauche) du Perenoel """
return ( self . x , self . y )
def afficher ( self : ' Perenoel ' ) - > None :
""" Affiche le Perenoel """
pyxel . blt ( self . x , self . y , 0 , 10 , 5 , 21 , 22 )
class Ennemi :
def __init__ ( self , monstre : ' Monstre ' , vies : int ) - > None :
self . vies = vies
self . monstre = monstre
def est_vivant ( self : ' Ennemi ' ) - > bool :
return self . vies > 0
class Jeu :
def __init__ ( self ) - > None :
# Création de la fenêtre graphique
pyxel . init ( 128 , 128 , title = " Nuit du c0de " )
pyxel . load ( " lorenzoxxxDark.pyxres " )
# Initialisation des données du jeu
self . perenoel = Perenoel ( )
self . monstre = Monstre ( )
self . objet = Objet ( 115 , 0 , X1_SAPIN , Y1_SAPIN , X2_SAPIN , Y2_SAPIN )
self . objet2 = Objet ( 80 , 80 , X1_CADEAU1 , Y1_CADEAU1 , X2_CADEAU1 , Y2_CADEAU1 )
self . plateforme = Plateforme ( )
self . joueur = Joueur ( self . perenoel , 4 )
self . ennemi = Ennemi ( self . monstre , 1 )
self . tirs = [ ] # Tableau des tirs
self . ennemis = [ ] # Tableau des ennemis présents
self . explosions = [ ] # Tableau des explosions
# Lancement de l'alternance 30x par seconde entre controleur et vue
pyxel . run ( self . controler , self . afficher )
def controler ( self ) :
if pyxel . btn ( pyxel . KEY_RIGHT ) :
self . perenoel . set_x ( 1 )
if pyxel . btn ( pyxel . KEY_LEFT ) :
self . perenoel . set_x ( - 1 )
if pyxel . btn ( pyxel . KEY_UP ) :
self . perenoel . saut ( )
def afficher ( self : ' Jeu ' ) - > None :
pyxel . cls ( 4 )
self . perenoel . afficher ( )
self . monstre . afficher ( )
self . objet . afficher ( )
self . objet2 . afficher ( )
j = Jeu ( )