''' 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("fichierpyxres.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()