''' 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 random
import pyxel
#Constantes
COULEUR_PERE_NOEL = 1
COULEUR_TIR = 10
COULEUR_ENNEMI = 8
X1_SAPIN = 25
Y1_SAPIN = 46
X2_SAPIN = 15
Y2_SAPIN = 19
POSITION_PLATEFORME = [
[ 0 , 2 , 0 , 0 , 0 , 0 , 4 ] ,
[ 3 , 1 , 1 , 0 , 4 , 1 , 1 ] ,
[ 1 , 0 , 0 , 1 , 1 , 3 , 3 ] ,
[ 1 , 1 , 0 , 1 , 0 , 0 , 0 ] ,
[ 3 , 3 , 1 , 0 , 0 , 4 , 0 ] ,
[ 0 , 0 , 0 , 1 , 0 , 1 , 3 ] ,
[ 0 , 0 , 0 , 0 , 1 , 0 , 0 ] ,
[ 4 , 0 , 0 , 1 , 3 , 3 , 0 ] ,
[ 1 , 1 , 1 , 3 , 1 , 1 , 1 ]
]
#Déclaration des classes
""" class Projectile:
def __init__ ( self ) - > None :
self . x = 20
self . y = 20
self . etat_projectile = 0
self . matrice_projectile = [ [ 0 , 0 ] , [ 0 , 0 ] , [ 0 , 0 ] , [ 0 , 0 ] , [ 0 , 0 ] , [ 0 , 0 ] , [ 0 , 0 ] , [ 0 , 0 ] , [ 0 , 0 ] , [ 0 , 0 ] ]
self . range = 0
def projectile ( self ) - > None :
self . etat_projectile = pyxel . count_frame / / 60
if self . etat_projectile % 2 == 1 and self . range < 8 :
print ( " test " )
alea = random . randint ( 0 , 200 )
self . range = self . range + 1
self . matrice_projectile [ self . range ] [ 0 ] = self . x
self . matrice_projectile [ self . range ] [ 1 ] = alea
if self . etat_projectile > 10 :
for i in range ( 0 , self . range ) :
self . matrice_projectile [ i ] [ 0 ] = self . matrice_projectile [ i ] [ 0 ] + 1
pyxel . blt ( self . matrice_projectile [ i ] [ 0 ] , self . matrice_projectile [ i ] [ 1 ] , 0 , 0 , 24 , 7 , 7 ) """
class Plateforme :
def __init__ ( self ) - > None :
self . x = 20
self . y = 20
def afficher ( self ) - > None :
for colonne in range ( 9 ) :
for ligne in range ( 7 ) :
if POSITION_PLATEFORME [ colonne ] [ ligne ] == 1 :
x = ( self . x * ( ligne ) )
y = ( self . y * ( colonne ) )
pyxel . blt ( x , y , 0 , 0 , 0 , 20 , 4 )
elif POSITION_PLATEFORME [ colonne ] [ ligne ] == 2 :
x = ( self . x * ( ligne ) )
y = ( self . y * ( colonne ) ) + 4
pyxel . blt ( x , y , 0 , 25 , 46 , 14 , 20 )
elif POSITION_PLATEFORME [ colonne ] [ ligne ] == 3 :
x = ( self . x * ( ligne ) )
y = ( self . y * ( colonne ) )
pyxel . blt ( x , y , 0 , 24 , 3 , 20 , 4 )
elif POSITION_PLATEFORME [ colonne ] [ ligne ] == 4 :
x = ( self . x * ( ligne ) )
y = ( self . y * ( colonne ) ) + 13
pyxel . blt ( x , y , 0 , 30 , 107 , 6 , 8 )
""" Classe intégrant la gestion du Modèle et de la Vue relative au Perenoel du joueur. """
class Perenoel :
def __init__ ( self ) - > None :
self . x = 20 # coordonnée x du coin haut à gauche du carré
self . y = 100 # coordonnée y du coin haut à gauche du carré
self . a_gagner = False
self . etat = 0
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 ' ) :
if POSITION_PLATEFORME [ int ( ( self . y + 18 ) / / 20 ) ] [ int ( ( self . x + 8 ) / / 20 ) ] == 1 :
self . set_y ( - 15 )
def gravite ( self : ' Perenoel ' ) :
if POSITION_PLATEFORME [ int ( ( self . y + 18 ) / / 20 ) ] [ int ( ( self . x + 8 ) / / 20 ) ] == 0 :
self . y = self . y + 1
elif POSITION_PLATEFORME [ int ( ( self . y + 18 ) / / 20 ) ] [ int ( ( self . x + 8 ) / / 20 ) ] == 4 :
self . y = self . y + 1
elif POSITION_PLATEFORME [ int ( ( self . y + 18 ) / / 20 ) ] [ int ( ( self . x + 8 ) / / 20 ) ] == 3 :
self . y = self . y + 1
def gagner ( self : ' Perenoel ' ) :
if POSITION_PLATEFORME [ int ( ( self . y + 18 ) / / 20 ) ] [ int ( ( self . x + 8 ) / / 20 ) ] == 2 :
self . a_gagner = True
def degats ( self : ' Perenoel ' , joueur : ' Joueur ' ) :
if POSITION_PLATEFORME [ int ( ( self . y + 18 ) / / 20 ) ] [ int ( ( self . x + 8 ) / / 20 ) ] == 3 :
degats_gen ( joueur )
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 """
self . etat = pyxel . frame_count / / 15
if self . etat % 2 == 1 :
pyxel . blt ( self . x , self . y , 0 , 23 , 72 , 16 , 18 )
else :
pyxel . blt ( self . x , self . y , 0 , 39 , 72 , 18 , 17 )
# (..., 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
def afficher_vies ( self ) :
vie = self . get_vies ( )
pyxel . text ( 0 , 190 , " vie : " + str ( vie ) , 7 )
""" Classe intégrant la gestion du jeu. """
class Jeu :
def __init__ ( self ) - > None :
# Création de la fenêtre graphique
pyxel . init ( 140 , 200 , title = " Pere noel du bled " )
pyxel . load ( " lorenzoxxxDark.pyxres " )
pyxel . playm ( 0 )
# Initialisation des données du jeu
self . perenoel = Perenoel ( )
self . plateforme = Plateforme ( )
self . joueur = Joueur ( self . perenoel , 1 )
#self.projectile = Projectile()
# Lancement de l'alternance 30x par seconde entre controleur et vue
pyxel . run ( self . controler , self . afficher )
def controler ( self ) :
if self . joueur . est_vivant ( ) :
if pyxel . btn ( pyxel . KEY_D ) :
self . perenoel . set_x ( 1 )
if pyxel . btn ( pyxel . KEY_Q ) :
self . perenoel . set_x ( - 1 )
if pyxel . btn ( pyxel . KEY_Z ) :
self . perenoel . saut ( )
def afficher ( self : ' Jeu ' ) - > None :
pyxel . cls ( 4 )
self . perenoel . afficher ( )
self . plateforme . afficher ( )
self . perenoel . gravite ( )
self . perenoel . degats ( self . joueur )
self . perenoel . gagner ( )
self . joueur . afficher_vies ( )
#self.projectile.projectile()
if self . perenoel . a_gagner :
pyxel . text ( 60 , 110 , " Bravo :) " , 7 )
elif not self . joueur . est_vivant ( ) :
pyxel . text ( 60 , 110 , " Dommage :( " , 7 )
def degats_gen ( joueur : ' Joueur ' ) :
joueur . perd_une_vie ( )
j = Jeu ( )