labyrinthe.py
qui contiendra le travail réalisé dans cette partie.
Labyrinthe
qui contiendra les méthodes et les attributs suivants :
afin de modéliser des labyrinthes rectangulaires nous allons créer une classe respectant les conditions suivantes :
Labyrinthe
prenant deux arguments width
le nombre de colonnes de la grille et height
, le nombre de lignes. La classe devra comprendre :
__init__()
__init__(self, width, height)
self.width
et self.height
définis dans le constructeurself.cells
représentant les cellules du labyrinthe. Pour l'instant on lui affectera une liste vide. class NomClasse:
...
self
représentera l'instance de la classe Labyrinthe
. Ici un labyrinthe particulier.width
et height
doivent ĂȘtre affectĂ© aux attributs self.width
et self.height
.N
, Est E
, Sud S
et Ouest O
.
N
, E
, S
et O
et dont les valeurs sont des booléens : True
si on peut passer (pas de mur), False
sinon.
{'N':False, 'E':False, 'S':False, 'O':False}
__init__()
, Ă la suite de l'affectation des attributs, initialiser l'attribut cells
comme un tableau Ă height
lignes et width
colonnes contenant des cellules entiÚrement murées.
i
sur les lignes et j
sur les colonnes de la grille.a
Ă une liste L
avec la méthode L.append(a)
print()
Ă la classe Labyrinthe
:
âââââââŹââŹââââââŹââŹââââŹââââââŹââââ
ââ⎠â¶â†ââ⎠â¶ââ â” â¶ââŒâ⎠âââŒâ⎠â
â ââ⎠â â· â· â¶ââŹââ â· ââ⎠â â â· â
âââ â¶â†âââŒâ⎠â âââ ââ⎠â â” âââ€
â ââââ†â â” âââŽâââââ†ⷠ┠âââ â
â â” ââ†âââââ â¶ââŹâ⎠âââŒâ⎠┠â â
â â· â” â â¶ââ â· â¶â†â¶ââââŽââ â¶â†â
ââ†â¶ââŒâââ†âââââŒâ⎠â¶ââŹââŽââââŽââ€
â â” âââŽâ⎠┠ⷠⷠââ⎠ⷠâ âââ â· â
â â¶ââŽââ âââââ â âââ ââ†┠âââ â
ââ⎠â¶ââŒââŒââŹââââŽâ†â â¶â†â¶â†â¶ââ€
ââ⎠ⷠâ â” â âââââ ââ⎠ââ⎠âââ â
â â¶ââŒââŒââ â” ââââ⎠ⷠâââ â· âââ â
ââ⎠┠┠â âââ âââ âââ âââŽââŒâ⎠â
â â¶ââ â· â” â” â· â” âââ â¶ââ â· â â· â
âââââŽââŽââââââŽââââââŽââââŽââŽââŽââŽââ
Labyrinthe
peut maintenant ĂȘtre instanciĂ©e, c'est Ă dire construire des objets labyrinthes (seulement des labyrinthes murĂ©s pour l'instant).
Labyrinthe
de largeur 5 et de hauteur 4 il suffit d'utiliser la syntaxe :
mon_laby = Labyrinthe(5,4)
mon_laby.print()
mon_laby.nom_attribut = nouvelle_valeur
print()
un labyrinthe de taille 3×2 avec tous ses murs fermĂ©s.
cells
, construire un labyrinthe de cette forme :
ââââŹââââââ
â â â
â â â
âââââââŽâââ
Labyrinthe
. Pour dĂ©bugger, il pourra ĂȘtre utile de visualiser les objets avec la numĂ©rotation des zones de chaque cellule comme ceci :
âââââââââââŹâââââŹâââââŹâââââ
â 5 5 â 2 â 3 â 14 â
â ââââââŽâââââŽââââ†â
â 5 â 7 7 7 â 14 â
ââââââŒââââââââââââââ†â
â 10 â 16 16 16 â 14 â
ââââââ ââââââ ââââââ€
â 16 16 â 17 â 16 â 19 â
ââââââŹâââââŽâââââŒâââââŽâââââ€
â 20 â 22 22 â 24 24 â
ââââââŽââââââââââŽââââââââââ
mon_laby.print([5,5,2,3,14,...,22,24,24])
Labyrinthe
, de la maniĂšre suivante :
cells
ajouter une clé zone
ayant pour valeur le numéro de la zone à laquelle appartient la cellule :
{'N':False, 'E':False, 'S':False, 'O':False, 'zone':1}
fusionner(self, i, j, dir)
oĂč :
i
et j
sont les coordonnées dans la grille de la cellule concernée .
dir
est un caractĂšre parmi 'N'
, 'E'
, 'S'
, 'O'
indiquant le mur de la cellule Ă ouvrir.
False
.
Si la méthode ouvre le mur, elle devra modifier la zone de toutes les cellules de la deuxiÚme zone fusionnée à la premiÚre.
generer(self)
qui à partir de l'état de départ génÚre un labyrinthe parfait. Elle créer une pile de de tous les murs (fermés au départ) et les ouvrir un par un à l'aide de la méthode fusionner.
self.print(self.zones)
random
permet notamment d'utiliser :
méthode | description |
---|---|
randint(a,b)
|
Renvoie un entier aléatoire entre a et b inclus. |
choice(liste)
|
Renvoie un élément choisi aléatoirement dans la liste |
shuffle(liste)
|
Mélange de maniÚre aléatoire la liste (modification) |
(i,j,dir)
oĂč i,j
sont les coordonnées de la cellule et dir
une direction parmi N
,E
,S
,O
.
import matplotlib.pyplot as plt
plt.plot([x1,x2,...,xn],[y1,y2,...,yn])
plt.show()
print_plot()
qui permet d'afficher un objet Labyrinthe
tel que :
(0,0)
se trouve en haut Ă gauche
print()
:
âââââŹââââââ
â â· ââ⎠ⷠâ
â ââ†âââŽââ€
âââ â ââ⎠â
â â” â” â· â¶ââ€
âââââââŽââââ
3d-world.css
et 3d-world.js
de la librairie et le fichier exemple0.js
qui réalise la scÚne de l'exemple :
exemple0.js
réalise une scÚne basique comprenant un Rectangle
(pour le sol), un Cube
, deux Sprite
, une Skybox
pour le ciel et une Camera
. Le but de cette partie sera de modifier ce fichier pour modéliser un labyrinthe généré précédemment. Voici une courte descriptions des objets et de leur utilisation :
Objet | Description |
---|---|
Environment3d(div) |
Objet principal auquel on ajoutera tous les objets de la scÚne par la méthode addObject() . l'argument div est un élement HTML dans lequel sera visualisé la scÚne. |
Rectangle(x,y,z,w,h,texture) |
Rectangle vertical dont le coin bas-gauche est positionnĂ© Ă (x,y,z) de largeur w et longeur h . La texture peut ĂȘtre l'url d'une image ou un objet d'attributs-valeurs de CSS.
|
Box(x,y,z,w, h, d, texture) |
PavĂ© droit dont le point de rĂ©fĂ©rence est le coin en bas Ă droite de la face visible. d est la profondeur. La texture peut ĂȘtre la mĂȘme pour chaque face (mĂȘme syntaxe que pour le rectangle). |
Cube(x,y,z,h,texture) |
MĂȘme rĂ©sultat que Box(x,y,z,h,h,h,texture)
|
Sprite(x,y,z,w,h, img, |
img est l'url d'un image de type sprite organisée en motifs de largeur w_img et hauteur h_img sur m lignes et n colonnes. dt est l'intervalle de temps en ms entre deux frames. Pour un sprite non animé, ignorer les derniers arguments.
|
Camera(x,y,z,rx, ry,rz) |
CamĂ©ra fixe pouvant ĂȘtre activĂ©e via sa mĂ©thode activate() . x,y,z sont ses coordonnĂ©es et rx,ry,rz les angles de rotations pour l'orienter (facultatifs, la direction par dĂ©faut est l'axe z).
|
Perso(x,y,z,h,controls) |
Personnage à la premiÚre personne. C'est en fait une caméra mobile.x,y,z sont les coordonnées du point le plus bas. La hauteur h est la hauteur du point de vue. Les contrÎles par défaut sont les flÚches de directions et la souris.
|
obj
doit ĂȘtre ajoutĂ© Ă l'environnement via la mĂ©thode addObject(Object)
Rectangle
est son centre de gravité. Il est possible de la changer avec la méthode setTransformOrigin(xo, yo)
. Les arguments peuvent ĂȘtre des entiers (unitĂ© pixel) ou les mots-clĂ©s left, right, center
pour xo
et bottom, top, center
pour yo
.
Box
et Cube
. On peut ajouter un 3Ăšme argument zo
, un entier en pixels.
Camera
ou Perso
, pour ĂȘtre le point de vue principal, doit ĂȘtre activĂ© par la mĂ©thode activate()
Perso
se déplace sur un plan horizontal par défaut (mode 'fps'). Il peut se déplacer librement dans l'espace avec la méthode setMode('freecam')
.
Box
et Cube
, on peut préciser les textures de chaque face de la maniÚre suivante :
false
permet d'omettre une face.
cells
pour l'utiliser dans labyrinthe.js
Box
. Le choix est laissĂ© libre dans les textures utilisĂ©es. Les dimensions des couloirs et la hauteur des murs devront ĂȘtre en cohĂ©rence avec la hauteur de la camĂ©ra et les dimensions du sol.
cells
du labyrinthe généré en Python. Attention cependant, en Python les booléens sont True,False
et en JavaScript true, false
Box
pour modéliser les murs. Tenir compte de l'épaisseur des murs pour les positions
w_cell
, h_cell
, d_cell
, ep_mur
, x0_laby
, y0_laby
, z0_laby
) plutÎt que des valeurs calculées...