PYXEL STUDIO
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 .pyxres) mises à votre disposition ou partir de zéro avec le fichier res.pyres.

LES RÈGLES
  • La taille de l'écran du jeu doit être de 128x128 pixels: pyxel.init(128, 128, title="Nuit du Code 2022").
  • Plusieurs ressources graphiques (fichiers .pyxres) seront proposées. Cependant, vous n'êtes pas obligés de les utiliser. Vous pouvez créer vos propres images avec l'éditeur Pyxel. Vous pouvez aussi créer un jeu sans images, en utilisant seulement les formes géométriques.
  • Il n'est pas autorisé de regarder ou copier/coller du code trouvé sur internet ou votre ordinateur.
  • Il n'est pas autorisé d'aller chercher des tutoriels (vidéos ou autres) durant l'épreuve. Le code doit venir de vous.
  • Vous devez écrire une courte description et documentation (ou mode d'emploi) de votre jeu (cliquer sur le bouton ). La documentation fait partie de l'évaluation du jeu.
  • Vous êtes totalement libre de créer le jeu que vous voulez. Soyez créatif!
  • Vous avez le droit de demander de l'aide aux professeurs qui encadrent l'épreuve. Ils ne vous donneront pas un code complet, mais certainement de bons conseils pour avancer. Soyez patients: lorsque vous avez travaillé pendant plusieurs heures sur un projet, il est très difficile pour quelqu'un qui le découvre de répondre rapidement à une question.
  • Vous avez le droit de demander de l'aide à vos camarades des autres équipes participantes. La Nuit du Code est un événement festif et l'entraide est fortement recommandée.
QUELQUES CONSEILS
  • Avant de vous lancer dans le code, prenez le temps d'imaginer votre jeu. Passez en revue les ressources. Prévoyez de réaliser rapidement une version simple, mais jouable de votre jeu. Puis, si vous en avez le temps, rajoutez au fur et à mesure des éléments de complexité: niveaux de difficulté, scores, son, etc.
  • Vous travaillez à deux ou trois: organisez-vous pour être les plus efficaces possible.
  • Pensez à télécharger régulièrement vos fichiers .py et .pyxres (si vous l'utilisez) en leur donnant des numéros de version (un problème technique peut toujours survenir)
  • N'oubliez pas de faire des pauses, d'aller voir ce que font les autres, de boire et de manger !
  • Et puis surtout, rappelez-vous: c'est un jeu ! Amusez-vous !
  • ndc.py
  • 2.pyxres
  • 3.pyxres
  • designmatcha.pyxres
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).
Voir la liste des bibliothèques tierces disponibles.

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.

cliquer sur pour lancer le jeu