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.
112 lines
4.0 KiB
112 lines
4.0 KiB
2 months ago
|
''' 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
|
||
|
"""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)
|
||
|
print("bonjour")
|
||
|
# (..., 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 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
|
||
|
|
||
|
"""Classe intégrant la gestion du jeu."""
|
||
|
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.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.perenoel.gravite()
|
||
|
j = Jeu()
|