''' 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 Zombie: class Enemmi: 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.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.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.objet.afficher() self.objet2.afficher() j = Jeu()