# ProjetPyxel2 ''' 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 # Déclaration des classes class Perenoel: """Classe intégrant la gestion du Modèle et de la Vue relative au Perenoel du joueur.""" 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 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, 23, 68, 0, 15, 25) # (..., 0, 0, 0, 8, 8) car Image 0 à partir de (0;0) de taille 8*8 class Joueur: """Classe intégrant la gestion du Modèle relative au joueur.""" def __init__(self, perenoel:'Perenoel', vies:int) -> None: self.vies = vies # A 0, le joueur a perdu self.perenoel = perenoel # L'instance de Vaisseau 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 class Jeu: """Classe intégrant la gestion du jeu.""" def __init__(self) -> None: # Création de la fenêtre graphique pyxel.init(128, 128, title="Nuit du c0de") pyxel.load("bjr.pyxres") # Initialisation des données du jeu self.perenoel = Perenoel() 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 afficher(self:'Jeu') -> None: self.perenoel.afficher() application = Jeu()