You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

221 lines
7.3 KiB

''' 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()