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