lien à conserver:
www.nuitducode.net/pyxel/studio/8u3lxb5g
|
|
Durant l'épreuve de la Nuit du Code, vous disposerez de 6 heures pour créer un jeu avec Python / Pyxel. Pour cela, vous pouvez utiliser les ressources (fichiers LES RÈGLES
QUELQUES CONSEILS
ndc.py
import pyxel
import random
import csv
class Jeu():
"""Classe lancant le jeu"""
def __init__(self):
#initialisation de pyxel
pyxel.init(256,256,"Espace Invasion")
pyxel.load("2.pyxres")
#initialisation des attributs
with open("Meilleures_scores.csv","a",newline=''):pass
with open("Meilleures_scores.csv","r",newline='') as score:
lecteur_csv=csv.reader(score,delimiter=";")
self.save=[]
for ligne in lecteur_csv : self.save.append(ligne)
self.vaisseau=Vaisseau(256//2,256//2)
self.tirs_allies=[] #contiendra les tirs des alliees et enemy (x,y,v) v=-1 si alliee/ 1 si enemy
self.tirs_enemys=[] #contiendra la liste des tirs enemys
self.enemys=[] #contiendra la liste des enemys
self.enemys_mort=[] #contiendra la liste des enemys mort
self.enemys_mort_pour_buff=[] #contiendra la liste des enemys mort pour créer les buffs
self.drops=[] #contiendra la liste des drops sur le terrain
self.score=900
self._fond=[(88+random.randint(0,5)*8,56+random.randint(0,5)*8) for _ in range(0,256,8) for _ in range(0,256,8)]
self.boss=[Boss_Carre]
self.boutons_menu={
"Jouer":Bouton(100,128,"Jouer"),
"Parametres":Bouton(100,152,"Setting"),
"Quitter":Bouton(100,176,"Quitter")
}
self.boutons_setting={
"Save":Bouton(100,50,"Saving"),
"Touches":Bouton(100,94,"Touches"),
"Touches_avancer":Bouton(100,118,"Avancer"),
"Touches_reculer":Bouton(100,142,"Reculer"),
"Touches_gauche":Bouton(100,166,"Gauche"),
"Touches_droite":Bouton(100,190,"Droite"),
"Touches_tir":Bouton(100,214,"Tirer"),
}
self.menu=True
self.jouer=False
self.setting=False
self.quitter=False
self.check_enemy_mort=False
#lancement du jeu
pyxel.fullscreen(True)
pyxel.run(self.update,self.draw)
def reset(self):
"""
reinitialise le jeu a son etat initial
"""
with open("Meilleures_scores.csv","r",newline='') as score:
lecteur_csv=csv.reader(score,delimiter=";")
self.save=[]
for ligne in lecteur_csv : self.save.append(ligne)
self.vaisseau=Vaisseau(256//2,256//2)
self.tirs_allies=[] #contiendra les tirs des alliees et enemy (x,y,v) v=-1 si alliee/ 1 si enemy
self.tirs_enemys=[] #contiendra la liste des tirs enemys
self.enemys=[] #contiendra la liste des enemys
self.enemys_mort=[] #contiendra la listee des enemys mort
self.drops=[] #contiendra la liste des drops sur le terrain
self.enemys_mort_pour_buff=[] #contiendra la liste des enemys mort pour créer les buffs
self.score=0
self._fond=[(88+random.randint(0,5)*8,56+random.randint(0,5)*8) for _ in range(0,256,8) for _ in range(0,256,8)]
def sauvegarder(self):
with open("Meilleures_scores.csv","a",newline='') as scores :
ecrire=csv.writer(scores,delimiter=";")
ecrire.writerow([self.score])
#____________________fonction jeu____________________
#buffs
def creation_buff(self):
chance = 5
for enemy_mort in self.enemys_mort_pour_buff:
if random.randint(0,100) < chance:
choix_buff=random.choice(([Buff_bombe]*4+[Buff_bouclier]*6+[Buff_soin]*6+[Buff_vitesse]*4+[Buff_cerise]))
self.drops.append(choix_buff(enemy_mort.enemy.x,enemy_mort.enemy.y))
self.enemys_mort_pour_buff=[]
def update_buff(self):
self.creation_buff()
for drop in self.drops :
drop.update()
if drop.drop.isOut() and drop in self.drops:self.drops.remove(drop)
def draw_buff(self):
for drop in self.drops:
drop.draw()
#Tirs Allies
def creation_tir(self):
"""
Methode de la classe jeu
Permet de creer un tir lors de l'appuie sur sur espace
POSTCONDITION:
-Met a jour la liste tirs
"""
self.vaisseau.select_fire()
if self.vaisseau.tirer():
self.tirs_allies+=self.vaisseau.tirer()
expl=self.vaisseau.explosion()
if expl:
self.tirs_allies.append(expl)
def deplacement_tirs(self):
"""
Methode de la classe jeu
Permet le deplacement des tirs
POSTCONDITION:
-Met a jour les coordonnees de tout les tirs
"""
for tir in self.tirs_allies:
tir.deplacement()
for y in tir.getY() :
if not -16<=y<=256 and tir in self.tirs_allies:
self.tirs_allies.remove(tir)
def update_tirs(self):
"""
Methode de la classe jeu
Met a jour les tirs
"""
self.creation_tir()
self.deplacement_tirs()
def draw_tirs(self):
"""
Methode de la classe jeu
Permet l'affichage des tirs
"""
for tir in self.tirs_allies :
tir.draw()
#Enemys
def creation_enemy(self):
"""
Methode de la classe jeu
Permet la creation d'enemy
POSTCONDITION:
-Met a jour la liste d'enemys
"""
#taux d'apparition = diff*50
#premier boss 50000 score raporte 1000c
#second boss 100000 score raporte 2000c
#troisieme boss 200000 score raporte 5000c
#4000 boss ultime rapporte 10000c
#(achat de skin avec les c)
diff=150 #regle la difficultée dans un sens decroissant diff 1>diff 2 => dif n>diff n+1
if pyxel.frame_count%(diff//(self.score+1)+5)==4:
self.enemys.append(Enemy_simple_axe_x(random.randint(0,248),0)) #enemys simples x diff=1/10
if self.score>70 :
if pyxel.frame_count%(6*(diff//(self.score+1)+5))==29 :
self.enemys.append(Enemy_runner(random.randint(0,248),0)) #runner sur le vaisseau diff=5/10
if pyxel.frame_count%(15*(diff//(self.score+1)+5))==74 :
self.enemys.append(Enemy_simple_axe_y(random.randint(0,248),0)) #enemy simple y diff 2/10
if self.score>300 :
if pyxel.frame_count%(24*(diff//(self.score+1)+5))==119 :
self.enemys.append(Enemy_teleporteur(random.randint(0,248),0))
if self.score>750 :
if pyxel.frame_count%(17*(diff//(self.score+1)+5))==94 :
self.enemys.append(Enemy_tireur_simple(random.randint(0,248),40)) #tireur simples diff=2/10
if pyxel.frame_count%(24*(diff//(self.score+1)+5))==119 :
self.enemys.append(Enemy_tireur_triple(random.randint(0,248),40)) #enemy tir obliques diff 4/10
if self.score>1200 :
if pyxel.frame_count%(32*(diff//(self.score+1)+5))==159 :
self.enemys.append(Enemy_tireur_mitraillette(random.randint(0,248),40)) #enemy tir droit continu diff 8/10
def deplacement_enemys(self):
"""
Methode de la classe jeu
Permet le deplacement de tout les enemis
"""
for enemy in self.enemys :
if enemy in self.boss :
nouv_enemy=enemy.update()
if nouv_enemy : self.enemys.append(nouv_enemy)
else:
tir=None
if type(enemy)==Enemy_runner :
enemy.update(self.vaisseau.x,self.vaisseau.y)
else :
tir=enemy.update()
if tir : self.tirs_enemys.append(tir)
if (enemy.enemy.y>256 or not(0<=enemy.enemy.x<=256)) and not(enemy in self.boss):
if self.score>10:pass
#self.score-=10
self.enemys.remove(enemy)
def deplacement_enemy_tir(self):
"""
Gere les deplacement des tirs enemy
"""
for tir in self.tirs_enemys :
tir.deplacement()
def update_enemy(self):
if not(self.boss[0] in self.enemys) :
if self.score>900 :
try :
if not(self.boss[0].isDead()):
for enemy in self.enemys :
self.enemys_mort.append(enemy)
self.enemys=[self.boss[0]]
self.tirs_enemys=[]
self.tirs_allies=[]
self.drops=[]
except : self.boss[0]=self.boss[0]()
else :
self.creation_enemy()
self.deplacement_enemys()
self.deplacement_enemy_tir()
def draw_enemys(self):
"""
Methode de la classe jeu
Permet l'affichage des enemys
"""
for enemy in self.enemys :
enemy.draw()
for tir in self.tirs_enemys :
tir.draw()
#Collision
def collision(self):
"""
Methode de la classe jeu
Permet de gerer l'ensemble des collisions
"""
self.collision_tir_enemy()
self.collision_enemy_vaisseau()
self.collision_drops_vaisseau()
def collision_tir_enemy(self):
"""
Methode de la classe jeu
Permet de gerer les collisions entre les tirs et les enemys
"""
for enemy in self.enemys :
for tir in self.tirs_allies :
indice_a_supprimer=[]
for i in range(len(tir.getX())):
if not(enemy in self.boss) and enemy.enemy.x-4<=tir.getX()[i]<=enemy.enemy.x+4 and enemy.enemy.y-8<=tir.getY()[i]<=enemy.enemy.y+8 and (enemy in self.enemys) and tir in self.tirs_allies:
enemy.enemy.degat(tir.degat())
if enemy.enemy.isDead() :
self.enemys_mort_pour_buff.append(enemy)
self.enemys_mort.append(enemy)
self.enemys.remove(enemy)
self.score+=1
indice_a_supprimer=[i]+indice_a_supprimer
if enemy in self.boss and enemy.enemy.x-8<=tir.getX()[i]<=enemy.enemy.x+8 and enemy.enemy.y-12<=tir.getY()[i]<=enemy.enemy.y+12 and (enemy in self.enemys) and tir in self.tirs_allies:
if not(enemy.spawn):
enemy.enemy.degat(tir.degat())
if enemy.enemy.isDead() :
self.enemys_mort_pour_buff.append(enemy)
self.enemys_mort.append(enemy)
self.enemys.remove(enemy)
self.score+=1
indice_a_supprimer=[i]+indice_a_supprimer
for i in indice_a_supprimer : tir.supprimer_un_tir(i)
if len(tir.tir)==0 :
self.tirs_allies.remove(tir)
def collision_enemy_vaisseau(self):
"""
Methode de la classe jeu
Permet de gerer les collisions entre le vaisseau et les enemis
"""
for enemy in self.enemys :
if (enemy in self.boss) and enemy.enemy.x-16<=self.vaisseau.x<=enemy.enemy.x+16 and enemy.enemy.y-16<=self.vaisseau.y<=enemy.enemy.y+16:
self.vaisseau.degat(1)
enemy.enemy.degat(10)
if enemy.enemy.x-8<=self.vaisseau.x<=enemy.enemy.x+8 and enemy.enemy.y-8<=self.vaisseau.y<=enemy.enemy.y+8 and enemy not in self.boss:
self.vaisseau.degat(1)
self.enemys_mort.append(enemy)
self.enemys_mort_pour_buff.append(enemy)
self.enemys.remove(enemy)
for tir in self.tirs_enemys :
indice_a_supprier=[]
for i in range(len(tir.getX())) : #getx et gety on le meme nombre d'element par tir
if self.vaisseau.x<=tir.getX()[i]+4<=self.vaisseau.x+8 and self.vaisseau.y-4<=tir.getY()[i]+2<=self.vaisseau.y+8 :
self.vaisseau.degat(2)
indice_a_supprier.append(i)
for i in indice_a_supprier:
tir.supprimer_un_tir(i)
if len(tir.tir)==0 :
self.tirs_enemys.remove(tir)
def collision_drops_vaisseau(self):
"""
Methode de la classe jeu
Permet de gerer les collisions entre le vaisseau et les drops
"""
for drop in self.drops :
if drop.drop.x-8<=self.vaisseau.x<=drop.drop.x+8 and drop.drop.y-8<=self.vaisseau.y<=drop.drop.y+8 :
if type(drop)==Buff_bombe :
self.vaisseau.degat(1)
if type(drop)==Buff_soin:
self.vaisseau.soigner(1)
if type(drop)==Buff_vitesse:
self.vaisseau.vitesse()
if type(drop)==Buff_bouclier:
self.vaisseau.bouclier()
if type(drop)==Buff_cerise :
self.vaisseau.cerise()
self.drops.remove(drop)
#____________________fonction menus____________________
"""
Affichage du nom du jeu en x= y=
Bouton :
-jouer
Menu nbr joueur
-1 ou 2
-Credit
-Quitter
"""
def draw_mouse(self):
"""
Affiche un allien sur la position de la souris
"""
if pyxel.frame_count%15<=7:pyxel.blt(pyxel.mouse_x,pyxel.mouse_y,0,24,8,8,8,0)
else:pyxel.blt(pyxel.mouse_x,pyxel.mouse_y,0,24,16,8,8,0)
def update_menu(self):
"""
Methode de la classe jeu
Gere les interaction entre le menu et le jeu
"""
if self.boutons_menu["Jouer"].isPress() :
if self.vaisseau.isDead():
self.reset()
self.jouer=True
self.menu=False
if self.boutons_menu["Parametres"].isPress():
self.setting=True
self.menu=False
if self.boutons_menu["Quitter"].isPress():
pyxel.quit()
def draw_menu(self):
"""
Methode de la classe jeu
Affiche le menu et permet la selection de la sauvegarde
"""
self.fond()
pyxel.text(95,90,"Espace Invasion",15)
for bouton in self.boutons_menu :
self.boutons_menu[bouton].draw()
self.draw_mouse()
def update_setting(self):
"""
gere l'interface setting
"""
if self.boutons_setting["Save"].isPress():
pass
if self.boutons_setting["Touches_avancer"].isPress():
pass
if self.boutons_setting["Touches_reculer"].isPress():
pass
if self.boutons_setting["Touches_gauche"].isPress():
pass
if self.boutons_setting["Touches_droite"].isPress():
pass
def draw_setting(self):
"""
gere l'affichage de l'inteface des setting
"""
self.fond()
for bouton in self.boutons_setting:
self.boutons_setting[bouton].draw()
self.draw_mouse()
def fond(self):
"""
Methode de la classe jeu
Affiche un fond etoile
"""
i=0
for x in range(0,256,8):
for y in range(0,256,8):
fond=self._fond[i]
pyxel.blt(x,y,0,fond[0],fond[1],8,8)
i+=1
def draw_pv(self):
"""
Methode de la classe jeu
Affiche le nombre de pv du vaisseau
"""
self.interface(0,232,"Vie",self.vaisseau.vie)
def draw_score(self):
"""
Methode de la classe jeu affiche le score
"""
self.interface(0,208,"Score",self.score*10)
def interface(self,x,y,titre,element):
pyxel.blt(x,y,0,64,104,64,24,0)
pyxel.text(x+8,y+8,titre,7)
pyxel.text(x+40,y+8,str(element),7)
#____________________update____________________
def update(self):
if self.jouer :
if pyxel.btnp(pyxel.KEY_TAB):
self.jouer=False
self.menu=True
self.sauvegarder()
if not self.vaisseau.isDead():
self.vaisseau.deplacement()
self.update_tirs()
self.collision()
self.update_buff()
self.update_enemy()
else :
pyxel.sound(0).speed=1
pyxel.play(0,5)
if self.menu :
self.update_menu()
if self.setting:
if pyxel.btnp(pyxel.KEY_TAB):
self.setting=False
self.menu=True
self.update_setting()
#____________________draw____________________
def draw(self):
if self.jouer :
if not self.vaisseau.isDead():
self.fond()
self.draw_enemys()
self.draw_tirs()
self.draw_buff()
self.vaisseau.draw()
self.draw_pv()
self.draw_score()
for enemy in self.enemys_mort :
enemy.enemy.explo()
self.enemys_mort=[]
self.check_enemy_mort=True
else :
pyxel.text(110,120,"Game Over",7)
if self.menu :
self.draw_menu()
if self.setting :
self.draw_setting()
#_______________________________________________________Vaisseau_______________________________________________________#
class Vaisseau():
"""cree un vaisseau pour espace_invasion"""
def __init__(self,x,y):
"""
Constructeur de la classe Vaisseau
Initialise les valeurs des attributs
"""
self.x=x
self.y=y
self.vie=5
self.reculer=False
self.tir=0
self.t_dern_expl=-40
self.bclier=0
self.t_vitesse=0
self.t_cerise=0
pyxel.load("2.pyxres")
def deplacement(self):
"""
Methode de la classe Vaisseau
Permet des deplacement graces aux touches
"""
if self.t_vitesse>pyxel.frame_count:
v=6
elif self.t_cerise>pyxel.frame_count:
v=4
else :
v=2.5
if not self.isDead() :
self.reculer=False
if pyxel.btn(pyxel.KEY_Z) and self.y>2:
self.y-=v
if pyxel.btn(pyxel.KEY_S) and self.y<247:
self.y+=v-0.5
self.reculer=True
if pyxel.btn(pyxel.KEY_Q) and self.x>2:
self.x-=v
if pyxel.btn(pyxel.KEY_D) and self.x<246:
self.x+=v
def tirer(self):
"""
Methode de la classe Vaisseau
Permet de renvoyer True si la barre espace est pressé
POSTCONDITION:
-Renvoie vrai ou faux
"""
if self.t_cerise>pyxel.frame_count :
pyxel.sound(0).speed=1
pyxel.play(0,2)
return [Tir_simple(self.x,self.y),Tir_triple(self.x,self.y)]
elif pyxel.frame_count%3==0:
pyxel.sound(0).speed=1
pyxel.play(0,2)
return [[Tir_simple(self.x,self.y),Tir_triple(self.x,self.y)][self.tir]]
else : return False
def explosion(self):
"""
Permet la cration d'une explosion
"""
if pyxel.btn(pyxel.KEY_F) and pyxel.frame_count>self.t_dern_expl+40:
pyxel.sound(0).speed=1
pyxel.play(0,3)
self.t_dern_expl=pyxel.frame_count
return Explosion(self.x,self.y,rayonf=16)
def select_fire(self):
"""
Methode de la classe Vaisseau
Permet la selection des Tirs
"""
if pyxel.btnp(pyxel.KEY_SPACE) and self.tir==1:
self.tir=0
elif pyxel.btnp(pyxel.KEY_SPACE) and self.tir==0:
self.tir=1
def vitesse(self):
"""
Methode de la classe Vaisse
Modifie la vitesse du vaisseau
"""
self.t_vitesse=pyxel.frame_count+120
def degat(self,dgt):
"""
Methode de la classe Vaisseau
Permet de faire subir des degats au vaisseau
POSTCONDITION:
-met a jour vie
"""
while self.bclier>0 and dgt>0:
self.bclier-=1
dgt-=1
if dgt>0:
self.vie-=dgt
def soigner(self,soin):
"""
Methode de la classe Vaisseau
Permet de soigner le vaisseau
POSTCONDITION:
-Met a jour vie
"""
if self.vie+soin>=20:
self.vie=20
else :
self.vie+=soin
def isDead(self):
"""
Methode de la classe Vaisseau
Permet de revoyer True si le vaisseau est mort
POSTCONDITION:
-retourne true si la vie est inferieur a 0
-sinon retourne false
"""
if self.vie<=0 :return True
else : return False
def bouclier(self):
"""
Methode de la classe Vaisseau
Permet de generer un bouclier de 6pv max qui tank les degats a la place du vaisseau
"""
pyxel.sound(0).speed=1
pyxel.play(0,4)
if self.bclier<6 :
self.bclier+=1
def cerise(self):
"""
Methode de la classe Vaisseau
Active les 2 tirs en meme temps et initialise un bost de vitesse et met le bouclier au maximum
"""
self.vie=20
self.bclier=6
self.t_cerise=75+pyxel.frame_count
def draw_bouclier(self):
"""
Methode de la classe Vaisseau
Permet de gerer l'affichage du bouclier
"""
for i in range(self.bclier):
pyxel.circb(self.x+4,self.y+4,8+i,(i%2)*6+5)
def draw(self):
"""
Methode de la classe Vaisseau
Permet l'affichage du vaisseau
POSTCONDITION:
-Affiche le vaisseau
"""
if self.reculer :
if pyxel.frame_count%30<10 :
pyxel.blt(self.x,self.y,0,0,8,8,8,0)
elif pyxel.frame_count%30<20 :
pyxel.blt(self.x,self.y,0,8,8,8,8,0)
else :
pyxel.blt(self.x,self.y,0,16,8,8,8,0)
else :
if pyxel.frame_count%30<10 :
pyxel.blt(self.x,self.y,0,0,8,8,16,0)
elif pyxel.frame_count%30<20 :
pyxel.blt(self.x,self.y,0,8,8,8,16,0)
else :
pyxel.blt(self.x,self.y,0,16,8,8,16,0)
if self.bclier>0 :
self.draw_bouclier()
#_______________________________________________________Enemys_______________________________________________________#
class Enemy():
"""classe qui crée des objets enemy"""
def __init__(self, x, y, vie):
"""
constructeur créant des objets enemy avec des coordonnées x et y et des pv
PRECONDITION : x->int, y->int
"""
self.x=x
self.y=y
self.vie=vie
pyxel.load('2.pyxres')
def degat(self,dgt):
"""
methode qui retire un pv a un ennemi qui se prend une attaque
"""
self.vie-=dgt
def isDead(self):
"""
verifie si l'enemi est mort
"""
if self.vie<=0 : return True
else : return False
def explo(self):
"""
methode qui crée l'affichage d'une explosion a la mort de l'ennemie
"""
pyxel.sound(0).speed=1
pyxel.play(0,6)
pyxel.circ(self.x+4, self.y+4, 8, 10)
pyxel.circ(self.x+4, self.y+4, 6, 9)
pyxel.circ(self.x+4, self.y+4, 4, 8)
pyxel.circ(self.x+4, self.y+4, 2, 0)
class Enemy_simple_axe_x():
def __init__(self,x,y):
"""
constructeur créant des objets enemy tier 1 avec des coordonnées x et y et des pv
"""
self.enemy=Enemy(x,y,2)
def deplacement(self):
"""
methode permettant le deplacement des ennemis tier 1
"""
if self.enemy.y%2==0 and self.enemy.x<243:
self.enemy.x+=1
elif self.enemy.y%2==1 and self.enemy.x>13:
self.enemy.x-=1
else:
self.enemy.y+=9 #Se deplace d'un mouvement entier
def update(self):
self.deplacement()
def draw(self):
"""
methode qui crée l'affichage d'un ennemi tier 1
"""
if pyxel.frame_count%10<5 :
pyxel.blt(self.enemy.x, self.enemy.y, 0, 24, 8, 8, 8,0)
else :
pyxel.blt(self.enemy.x, self.enemy.y, 0, 24, 16, 8, 8,0)
class Enemy_runner():
def __init__(self,x,y):
"""
constructeur créant des objets enemy tier 2 avec des coordonnées x et y et des pv
"""
self.enemy=Enemy(x,y,1)
def deplacement(self, x,y):
"""
methode permettant le deplacement des ennemis tier 2
"""
if self.enemy.x0:
self.enemy.x-=1
else:self.dir="droite"
def tir(self):
"""
methode qui crée des objets Tir pour les ennemis tier 3
"""
if pyxel.frame_count%120==0 :
tir=Tir_simple(self.enemy.x, self.enemy.y, v=1,cmodele=(16,48),dgt=1)
return tir
def update(self):
self.deplacement()
return self.tir()
def draw(self):
"""
methode qui crée l'affichage d'un ennemi tier 3
"""
if pyxel.frame_count%30==0:
pyxel.blt(self.enemy.x, self.enemy.y, 0, 32, 16, 8, 8,0)
else:
pyxel.blt(self.enemy.x, self.enemy.y, 0, 32, 8, 8, 8,0)
class Enemy_simple_axe_y():
def __init__(self,x,y):
"""
constructeur créant des objets enemy tier 4 avec des coordonnées x et y et des pv
"""
self.enemy=Enemy(x,y,5)
self.x=self.enemy.x
def deplacement(self):
"""
methode permettant le deplacement des ennemis tier 4
"""
if self.x+8>self.enemy.x:
self.enemy.x+=0.5
elif self.enemy.x==self.x+8 and self.enemy.y<248 :
self.enemy.y+=0.5
else:
if self.x+28>self.enemy.x:
self.enemy.x+=0.5
elif self.enemy.x==self.x+28 and self.enemy.y>=8:
self.enemy.y-=10
else:
self.x=self.enemy.x
def update(self):
self.deplacement()
def draw(self):
"""
methode qui crée l'affichage d'un ennemi tier 4
"""
if pyxel.frame_count%12<6:
pyxel.blt(self.enemy.x, self.enemy.y, 0, 40, 8, 8, 8,0)
else:
pyxel.blt(self.enemy.x, self.enemy.y, 0, 40, 16, 8, 8,0)
class Enemy_tireur_triple():
def __init__(self,x,y):
"""
constructeur créant des objets enemy tier 5 avec des coordonnées x et y et des pv
"""
self.enemy=Enemy(x,y,1)
self.dir="droite"
def deplacement(self):
"""
methode permettant le deplacement des ennemis tier 5
"""
if self.dir=="droite" and self.enemy.x<248:
self.enemy.x+=2
elif self.dir=="droite" and self.enemy.x>=248:
self.dir="gauche"
elif self.dir=="gauche" and self.enemy.x>0:
self.enemy.x-=2
else:self.dir="droite"
def tir(self):
"""
methode qui crée des objets Tir pour les ennemis tier 5
"""
if pyxel.frame_count%90==0 :
tir=Tir_triple(self.enemy.x, self.enemy.y, v=1,cmodele=(16,40),dgt=1)
return tir
def update(self):
self.deplacement()
return self.tir()
def draw(self):
"""
methode qui crée l'affichage d'un ennemi tier 5
"""
if pyxel.frame_count%16<8 :
pyxel.blt(self.enemy.x, self.enemy.y, 0, 56, 16, 8, 8,0)
else :
pyxel.blt(self.enemy.x, self.enemy.y, 0, 56, 8, 8, 8,0)
class Enemy_tireur_mitraillette():
def __init__(self,x,y):
"""
constructeur créant des objets enemy tier 6 avec des coordonnées x et y et des pv
"""
self.enemy=Enemy(x,y,1)
def tir(self):
"""
methode qui crée des objets Tir pour les ennemis tier 6
"""
if pyxel.frame_count%5==0:
tir=Tir_simple(self.enemy.x, self.enemy.y, dgt=1, v=1, cmodele=(16,56))
return tir
def update(self):
return self.tir()
def draw(self):
"""
methode qui crée l'affichage d'un ennemi tier 6
"""
if pyxel.frame_count%18<9 :
pyxel.blt(self.enemy.x, self.enemy.y, 0, 64, 16, 8, 8,0)
else :
pyxel.blt(self.enemy.x, self.enemy.y, 0, 64, 8, 8, 8,0)
class Enemy_teleporteur():
def __init__(self,x,y):
"""
constructeur créant des objets enemy tier 6 avec des coordonnées x et y et des pv
"""
self.enemy=Enemy(x,y,7)
self.t_tp=pyxel.frame_count
self.tp_x_y=random.randint(0,248),random.randint(0,248)
self.x=x
self.y=y
def tp(self):
"""
methode qui crée des objets Tir pour les ennemis tier 6
"""
if pyxel.frame_count>=self.t_tp+120 :
self.t_tp=pyxel.frame_count
self.tp_x_y=random.randint(0,248),random.randint(0,248)
if pyxel.frame_count>=self.t_tp+60:
self.enemy.x=self.tp_x_y[0]
self.enemy.y=self.tp_x_y[1]
def update(self):
self.tp()
def draw(self):
"""
methode qui crée l'affichage d'un ennemi tier 6
"""
if pyxel.frame_count60:
self.enemy.y-=self.phase
if self.enemy.x>120:
self.enemy.x-=self.phase
if self.enemy.x<120:
self.enemy.x+=2*self.phase
if 118-16:
self.enemy.y-=1*self.phase**2
else:
self.compte_mouvement-=1
else :
def colone_droite():
self.enemy.x=56
if self.enemy.y<256 :
self.enemy.y+=8*self.phase
self.tier1=True
def colone_centre():
self.enemy.x=120
if self.enemy.y<256 :
self.enemy.y+=8*self.phase
self.tier1=True
def colone_gauche():
self.enemy.x=184
if self.enemy.y<256 :
self.enemy.y+=8*self.phase
self.tier1=True
liste_colone=[colone_centre,colone_droite,colone_gauche]
liste_colone[self.compte_mouvement-1]()
if self.enemy.y>=256:
self.compte_mouvement-=1
self.enemy.y=-16
def deplacement_horiziontale(self):
"""
Attaque 2 du bosse avec des deplacement horizontal
"""
if self.compte_mouvement==4:
if self.enemy.x>-16:
self.enemy.x-=1*self.phase**2
else:
self.compte_mouvement-=1
self.enemy.x=-16
else :
def colone_haut():
self.enemy.y=56
if self.enemy.x<256 :
self.enemy.x+=8*self.phase
self.tier2=True
def colone_milieu():
self.enemy.y=120
if self.enemy.x<256 :
self.enemy.x+=8*self.phase
self.tier2=True
def colone_bas():
self.enemy.y=184
if self.enemy.x<256 :
self.enemy.x+=8*self.phase
self.tier2=True
liste_colone=[colone_milieu,colone_haut,colone_bas]
liste_colone[self.compte_mouvement-1]()
if self.enemy.x>=256:
self.compte_mouvement-=1
self.enemy.x=-16
def gauche_droite_statique(self):
"""
Attaque 3 du bosse avec des deplacement de droite a gauche
"""
if self.compte_mouvement>0 :
if self.compte_mouvement%2==0 and self.enemy.x>56 :
self.enemy.x-=4*self.phase
elif self.compte_mouvement%2==1 and self.enemy.x<184 :
self.enemy.x+=4*self.phase
else :
self.compte_mouvement-=1
else : pass
def isOnStart(self):
"""
Verifie si le bosse se trouve en 120 60
"""
if self.enemy.x==120 and self.enemy.y==60 : return True
else : return False
#Apparition mobs
def apparition_mob(self):
"""
retourne les monstres genere par le bosse
"""
#apparition_enemy_simple_x and apparition_enemy_simple_y est impossible
if pyxel.frame_count%(4//self.phase)==0 and self.tier1:
self.tier1=False
return self.apparition_enemy_simple_x()
if pyxel.frame_count%(6//self.phase)==0 and self.tier2:
self.tier2=False
return self.apparition_enemy_simple_y()
def apparition_enemy_simple_x(self):
"""
retourne un enemy simple x
"""
return Enemy_simple_axe_x(self.enemy.x,self.enemy.y)
def apparition_enemy_simple_y(self):
"""
retourne un enemy simple x
"""
return Enemy_simple_axe_y(self.enemy.x,self.enemy.y)
def isDead(self):
"""
Revoie Vrai si le bosse est mort
"""
return self.enemy.isDead()
def update(self):
"""
Gere les changement du boss
"""
if not(self.spawn or self.isDead()):
if self.enemy.vie<=300: self.phase=2
self.deplacement()
return self.apparition_mob()
#Draw
def draw_apparition(self):
"""
Gere l'affichage de l'apparition
"""
if pyxel.frame_countself.t_animation//2:
pyxel.blt(8,8,0,0,96,64,8,0)
elif pyxel.frame_count%self.t_animationself.t_spawn+30*6:
self.spawn=False
def draw_phase_1(self):
"""
Gere l'affichage du boss lors de la phase 1
"""
if 0<=pyxel.frame_count%36<9: pyxel.blt(self.enemy.x,self.enemy.y,0,24,24,16,16,0)
elif 9<=pyxel.frame_count%36<18: pyxel.blt(self.enemy.x,self.enemy.y,0,24,40,16,16,0)
elif 18<=pyxel.frame_count%36<27: pyxel.blt(self.enemy.x,self.enemy.y,0,24,24,16,16,0)
else : pyxel.blt(self.enemy.x,self.enemy.y,0,24,40,-16,16,0)
def draw_phase_2(self):
"""
Gere l'affichage du boss lors de la phase 2
"""
if 0<=pyxel.frame_count%36<9: pyxel.blt(self.enemy.x,self.enemy.y,0,40,24,16,16,0)
elif 9<=pyxel.frame_count%36<18: pyxel.blt(self.enemy.x,self.enemy.y,0,40,40,16,16,0)
elif 18<=pyxel.frame_count%36<27: pyxel.blt(self.enemy.x,self.enemy.y,0,40,24,16,16,0)
else : pyxel.blt(self.enemy.x,self.enemy.y,0,40,40,-16,16,0)
def draw(self):
"""
Gere l'integralite de l'affichage du boss
"""
if self.spawn :
self.draw_apparition()
else :
if self.phase==1: self.draw_phase_1()
if self.phase==2: self.draw_phase_2()
class Boss_Autre():
"""Classe definissant les attribut d'un boss de base"""
def __init__(self,x,y,pv):
"""
Constructeur de la classe boss
"""
self.enemy=Enemy(x,y,500)
self.phase=1
#Deplacement
def deplacement():pass
def deplacement_verticale():pass
def deplacement_horiziontale():pass
def gauche_droite_statique():pass
#Apparition mobs
def apparition_enemy_simple_x():pass
def apparition_enemy_simple_y():pass
#Changement de phase
def change_phase():pass
def update(): pass
#Draw
def draw_phase_1():pass
def draw_phase_2():pass
def draw(): pass
#_______________________________________________________Bouton_______________________________________________________#
class Bouton():
"""Classe initialisant un bouton cliquable"""
def __init__(self,x,y,txt):
"""
Constructeur de la class Bouton
Initialise les attribut de la classe
w est une largeur de 16 pixel
"""
self.x=x
self.y=y
#pas besoin d'attribut high car predefini et statique
self.txt=txt
pyxel.load("2.pyxres")
#test Si in bouton est appuyé
def isPress(self):
"""
Methode de la classe Bouton
Retourn True si le bouton est presse False sinon
"""
if self.isOn() and pyxel.btnp(pyxel.MOUSE_BUTTON_LEFT) :
return True
else :
return False
#test si la souris est sur le bouton
def isOn(self):
"""
Methode de la classe jeu
Retourn True si la souris est dessus le bouton False sinon
"""
if self.x<=pyxel.mouse_x<=self.x+self.longueur()+16 and self.y<=pyxel.mouse_y<=self.y+24 :
return True
else :
return False
def draw(self):
"""
Methode de la classe Bouton
Affiche le bouton
"""
pyxel.blt(self.x,self.y,0,32,104,16,24,0)
for i in range(self.longueur()//16):
pyxel.blt(self.x+16*(i+1),self.y,0,48,104,16,24,0)
pyxel.blt(self.x+(self.longueur()//16+1)*16,self.y,0,80,104,16,24,0)
pyxel.text(self.x+8,self.y+8,self.txt,15)
def longueur(self):
"""
Methode de la classe Bouton
calcule la longueur necessaire
"""
return len(self.txt)*4-1 #une lettre fait 3px et un espace de 1px
#_______________________________________________________Tir_______________________________________________________#
class Tir():
"""cree un tir pour espace_invasion"""
def __init__(self,x,y,dgt,vecteur=-1,cmodele=(0,24)):
"""
Constructeur de la classe Tir
Initialise les attribut
"""
self.x=x
self.y=y
self.v=vecteur
self.dgt=dgt
self.modele=cmodele
def deplacement_vertical(self):
"""
Methode de la classe tir
gere le deplacement du tir
"""
self.y+=self.v*3
def deplacement_horizontal(self):
"""
Methode de la classe tir
gere le deplacement du tir
"""
self.x+=self.v*3
def draw(self):
"""
Methode de la classe tir
affiche le tir
"""
if pyxel.frame_count%2==0:
pyxel.blt(self.x,self.y,0,self.modele[0],self.modele[1],8,8,0)
class Tir_simple():
"""Classe creant un tir simple"""
def __init__(self,x,y,v=-1,cmodele=(0,24),dgt=4):
"""
Constructeur de la classe Tir_simple
Genere un tir simple
"""
self.tir=[Tir(x,y,vecteur=v,cmodele=cmodele,dgt=dgt)]
def getX(self): return [self.tir[0].x]
def getY(self): return [self.tir[0].y]
def deplacement(self):
"""
gere les deplacement du tir
"""
self.tir[0].deplacement_vertical()
def supprimer_un_tir(self,i):
"""
supprime un tir en position i
"""
self.tir.pop(i)
def draw(self):
"""
gere l'affichage des tirs
"""
self.tir[0].draw()
def degat(self):
"""
Retourne les degat a subir
"""
return self.tir[0].dgt
class Tir_triple():
"""Classe creant 3 tir se deplacant en triangle"""
def __init__(self,x,y,v=-1,cmodele=(8,40),dgt=1):
"""
Constructeur de la classe Tir_triple
genere 3 tir dont 2 se deplacent en diagonale
"""
self.tir=[Tir(x,y,vecteur=v,cmodele=cmodele,dgt=dgt),Tir(x,y,vecteur=v,cmodele=cmodele,dgt=dgt),Tir(x,y,vecteur=v,cmodele=cmodele,dgt=dgt),]
def getX(self):
l_temp=[]
for tir in self.tir : l_temp.append(tir.x)
return l_temp
def getY(self):
l_temp=[]
for tir in self.tir : l_temp.append(tir.y)
return l_temp
def supprimer_un_tir(self,i):
"""
supprime un tir en position i
"""
self.tir.pop(i)
def deplacement(self):
"""
Methode de la classe Tir
Gere le deplacement des 3 tirs
"""
#Se deplace
for i in range(len(self.tir)):
self.tir[i].deplacement_vertical()
self.tir[i].x+=i-1
def degat(self):
"""
Retourne les degat a subir
"""
return self.tir[0].dgt
def draw(self):
"""
Methode de la classe Tir triple
Gere l'affichage des 3 tirs
"""
for tir in self.tir :
tir.draw()
class Explosion():
def __init__(self,x,y,rayonf=8,cmodele=(8,40),dgt=1):
"""
Constructeur de la classe Explosion
genere 4 tir dont 2 se deplacent en horizontal jusqu'au rayon final
"""
self.tir=[[Tir(x,y,vecteur=1/3,cmodele=cmodele,dgt=dgt),Tir(x,y,vecteur=-1/3,cmodele=cmodele,dgt=dgt)],[Tir(x,y,vecteur=1/3,cmodele=cmodele,dgt=dgt),Tir(x,y,vecteur=-1/3,cmodele=cmodele,dgt=dgt)]]
self.indicef=rayonf
self.i=0
def getX(self):
l_temp=[]
for liste_tir in self.tir :
for tir in liste_tir : l_temp.append(tir.x)
return l_temp
def getY(self):
l_temp=[]
for liste_tir in self.tir :
for tir in liste_tir : l_temp.append(tir.y)
return l_temp
def supprimer_un_tir(self,i):
"""
supprime un tir en position i
"""
if len(self.tir[i//2])>=i%2:
self.tir[i//2].pop(i%2)
def deplacement(self):
"""
Methode de la classe Tir
Gere le deplacement des 3 tirs
"""
#Se deplace
if len(self.tir)>0:
for tir in self.tir[0]:
tir.deplacement_horizontal()
for tir in self.tir[1]:
tir.deplacement_vertical()
if self.i>=self.indicef :
self.tir=[]
else : self.i+=1
def draw(self):
"""
Methode de la classe Tir triple
Gere l'affichage des 3 tirs
"""
for liste_tir in self.tir :
for tir in liste_tir : tir.draw()
def degat(self):
"""
Retourne les degat a subir
"""
return self.tir[0][0].dgt
#_______________________________________________________Drop_______________________________________________________#
class Drop():
"""classe qui crée des objets drop et assure leurs deplacement"""
def __init__(self,x,y):
"""constructeur créant des objet drop avec des coordonnées x et y
PRECONDITION: x->int, y->int """
self.x=x
self.y=y
self.dispawn=False
pyxel.load('2.pyxres')
def deplacement(self):
"""methode qui permet le deplacement des drops"""
if self.dispawn==False:
self.y+=1
def isOut(self):
"""methode qui permet d'identifier rapidement les drops qui sortent de l'ecran"""
if self.y>=256:
self.dispawn=True
class Buff_bouclier():
def __init__(self,x,y):
"""constructeur créant des objets buff bouclier avec des coordonnées x et y"""
self.drop=Drop(x,y)
def update(self):
self.drop.deplacement()
self.drop.isOut()
def draw(self):
pyxel.blt(self.drop.x, self.drop.y, 0, 24, 72, 8, 8,0)
class Buff_soin():
def __init__(self,x,y):
"""constructeur créant des objets buff bouclier avec des coordonnées x et y"""
self.drop=Drop(x,y)
def update(self):
self.drop.deplacement()
self.drop.isOut()
def draw(self):
pyxel.blt(self.drop.x, self.drop.y, 0, 32, 88, 8, 8,0)#animation possible
class Buff_bombe():
def __init__(self,x,y):
"""constructeur créant des objets buff bouclier avec des coordonnées x et y"""
self.drop=Drop(x,y)
def update(self):
self.drop.deplacement()
self.drop.isOut()
def draw(self):
pyxel.blt(self.drop.x, self.drop.y, 0, 32, 80, 8, 8,0)#animation possible
class Buff_vitesse():
def __init__(self,x,y):
"""constructeur créant des objets buff bouclier avec des coordonnées x et y"""
self.drop=Drop(x,y)
def update(self):
self.drop.deplacement()
self.drop.isOut()
def draw(self):
pyxel.blt(self.drop.x, self.drop.y, 0, 24, 80, 8, 8,0)#animation possible
class Buff_cerise():
def __init__(self,x,y):
"""constructeur créant des objets buff bouclier avec des coordonnées x et y"""
self.drop=Drop(x,y)
def update(self):
self.drop.deplacement()
self.drop.isOut()
def draw(self):
pyxel.blt(self.drop.x, self.drop.y, 0, 24, 88, 8, 8,0)#animation possible
Jeu()
Documentation
BIBLIOTHÈQUES
Si vous utilisez des bibliothèques tierces pour votre projet (c'est-à-dire de bibliothèques qui ne sont pas des bibliothèques standard de Python), indiquez-les ci-dessous (noms séparés par des virgules). Exemple: numpy,pandas Remarque: ne déclarer que des bibliothèques tierces, pas des bibliothèques standard de Python. Par exemple, random est une bibliothèque standard, pas une bibliothèque tierce. DOCUMENTATION PYXEL
|