spellcheck
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing

This commit is contained in:
Debucquoy Anthony 2023-05-21 17:54:47 +02:00
parent 6d53865281
commit 7a5a4a093e
Signed by: tonitch
GPG Key ID: A78D6421F083D42E

View File

@ -20,10 +20,10 @@
\section*{Introduction} \section*{Introduction}
Lors de ce deuxième quadrimèstre, le projet Informatique proposé par notre université fut partie intégrante de notre emploi du temps. Lors de ce deuxième quadrimestre, le projet Informatique proposé par notre université fut partie intégrante de notre emploi du temps.
Régulièrement nous nous sommes rassemblés pour nous organiser et trouver une direction dans laquelle nous voulions voir notre projet évoluer. Régulièrement nous nous sommes rassemblés pour nous organiser et trouver une direction dans laquelle nous voulions voir notre projet évoluer.
Grâce aux objectifs fixés par nos enseignants, nous sommes - je le pense - maintenant plus apte à nous confronter à ce genre d'objectifs. Tant au niveau personel qu'en tant que groupe. Grâce aux objectifs fixés par nos enseignants, nous sommes - je le pense - maintenant plus apte à nous confronter à ce genre d'objectifs. Tant au niveau personnel qu'en tant que groupe.
Il va sans dire que comme pour tout projets, notre chemin a été semé d'embuches. En l'occurence, nous souhaitons faire part de l'abandon d'un de nos membre. Eddy Jiofak qui souhaite se réorienter. Il va sans dire que comme pour tout projets, notre chemin a été semé d'embuches. En l'occurrence, nous souhaitons faire part de l'abandon d'un de nos membre. Eddy Jiofak qui souhaite se réorienter.
Nous lui souhaitons une bonne reconversion. Nous lui souhaitons une bonne reconversion.
\section*{Objectifs} \section*{Objectifs}
@ -90,22 +90,22 @@ Ce parser est implémenté par la classe \verb|BinaryParser|.
\begin{description} \begin{description}
\item[Header/Footer]{ Les données du niveau commencent par les 3 \emph{caractères} 'S', 'M', 'S' (ou \verb|0x534D53|) et se terminent par les 3 \emph{caractères} 'S', 'M', 'E' (ou \verb|0x534D45|)} \item[Header/Footer]{ Les données du niveau commencent par les 3 \emph{caractères} 'S', 'M', 'S' (ou \verb|0x534D53|) et se terminent par les 3 \emph{caractères} 'S', 'M', 'E' (ou \verb|0x534D45|)}
\item[Taille de carte]{ Le premier octet des données représente la largeur de la carte, le second sa hauteur.} \item[Taille de carte]{ Le premier octet des données représente la largeur de la carte, le second sa hauteur.}
\item[Forme de la carte]{ Chaques cellules de la carte est représenté par un 1 ou un 0. le 1 représente un emplacement libre, un 0 une cellule vide. \item[Forme de la carte]{ Chaque cellules de la carte est représenté par un 1 ou un 0. Le 1 représente un emplacement libre, un 0 une cellule vide.
La forme de la carte peut alors être répartie sur un nombre indéterminé d'octets. La forme de la carte peut alors être répartie sur un nombre indéterminé d'octets.
Nous pouvons déterminer ce nombre grace à Nous pouvons déterminer ce nombre grace à
$$\frac{\text{largeur} * \text{hauteur } (+1 \text{ si multiple de } 8)}{8}$$ $$\frac{\text{largeur} * \text{hauteur } (+1 \text{ si multiple de } 8)}{8}$$
en division entière.} en division entière.}
\item[Nombre de pièce]{ L' (les) octet(s) qui forme(nt) la carte représente le nombre de pièce} \item[Nombre de pièce]{ L' (les) octet(s) qui forme(nt) la carte représente le nombre de pièce}
\item[Pour chaques pièces]{ \item[Pour chaque pièces]{
\ \
\begin{description} \begin{description}
\item[Taille de la pièce]{La taille est représentée sur un seul octet sous forme de nibble\footnote{https://en.wikipedia.org/wiki/Nibble}. La première partie du nibble est la largeur. La seconde partie du nibble est la hauteur } \item[Taille de la pièce]{La taille est représentée sur un seul octet sous forme de nibble\footnote{https://en.wikipedia.org/wiki/Nibble}. La première partie du nibble est la largeur. La seconde partie du nibble est la hauteur }
\item[Forme de la pièce]{ Chaques cellules de la pièce est représentée par un 1 ou un 0. la manière de le représenter et exactement la même que pour la forme de la carte } \item[Forme de la pièce]{ Chaque cellules de la pièce est représentée par un 1 ou un 0. La manière de le représenter et exactement la même que pour la forme de la carte }
\end{description} \end{description}
Dans le cas où le fichier sauvegarde l'état de la partie, à la fin, et pour chaques pièces dans le même ordre que l'apparition des pièces: Dans le cas où le fichier sauvegarde l'état de la partie, à la fin, et pour chaque pièces dans le même ordre que l'apparition des pièces:
\begin{description} \begin{description}
\item[Position de la pièce]{2 octets par pièces, 1 octet pour sa position en x et 1 octet pour sa position en y. \item[Position de la pièce]{2 octets par pièces, 1 octet pour sa position en x et 1 octet pour sa position en y.
Dans le cas où la pièce est flotante (n'est pas placée dans la carte.), les octets contenant les caractères F puis L (0x464C) remplacent les coordonées} Dans le cas où la pièce est flottante (n'est pas placée dans la carte.), les octets contenant les caractères F puis L (0x464C) remplacent les coordonnées}
\end{description} \end{description}
} }
\end{description} \end{description}
@ -119,14 +119,14 @@ Voici le 'hexdump' du niveau 11
b0 22 70 22 b0 11 80 53 4d 45 |."p"...SME| b0 22 70 22 b0 11 80 53 4d 45 |."p"...SME|
\end{verbatim} \end{verbatim}
représente une carte de la forme : Représente une carte de la forme :
\begin{tikzpicture} \begin{tikzpicture}
\filldraw[blue] (0,0) -- (0,5) -- (3,5) -- (3,4) -- (5,4) -- (5,0) -- cycle; \filldraw[blue] (0,0) -- (0,5) -- (3,5) -- (3,4) -- (5,4) -- (5,0) -- cycle;
\draw[step=1cm,gray] (0, 0) grid (5,5); \draw[step=1cm,gray] (0, 0) grid (5,5);
\end{tikzpicture} \end{tikzpicture}
avec les pièces : Avec les pièces :
\begin{tikzpicture} \begin{tikzpicture}
\fill[red] (1,1) rectangle (4,4); \fill[red] (1,1) rectangle (4,4);
@ -170,14 +170,14 @@ L'algorithme derrière est le même en voici le principe :
\subsubsection*{Gestion du plateau} \subsubsection*{Gestion du plateau}
Le joueur choisi une difficultée. En fonction de la difficultée choisie la grandeur du plateau de jeu sera différente. Le joueur choisit une difficulté. En fonction de la difficulté choisie, la grandeur du plateau de jeu sera différente.
Si la difficulté choisie est facile ou moyenne, alors un curseur parcour les extrémités du niveau. Si la difficulté choisie est facile ou moyenne, alors un curseur parcours les extrémités du niveau.
Ce curseur sélectionne aléatoirement les cellules qui seront gardés ou non. Ce curseur sélectionne aléatoirement les cellules qui seront gardés ou non.
Grâce à ça, la forme du plateau n'est pas trop carrée. Grâce à ça, la forme du plateau n'est pas trop carrée.
Nous nous sommes basé sur le même principe pour le niveau de difficulté difficile mais en plus d'une taille encore plus grande, Nous nous sommes basé sur le même principe pour le niveau de difficulté difficile mais en plus d'une taille encore plus grande,
le curseur parcours les extrémités avec une profondeur de 2 afin de faire varier la carte plus grande. le curseur parcours les extrémités avec une profondeur de 2 afin de faire varier la carte plus grande.
Cela introduit le problème des cases isolés. c'est pourquoi une boucle vérifie chaques cellules et la supprime si celle si est isolée. Cela introduit le problème des cases isolés. C'est pourquoi une boucle vérifie chaque cellules et la supprime si celle si est isolée.
\subsubsection*{Gestion des pièces} \subsubsection*{Gestion des pièces}
@ -185,14 +185,14 @@ Peu importe la difficulté du niveau voici le fonctionnement :
Une taille maximum des pièces a été fixée au préalable à 3x3. Une taille maximum des pièces a été fixée au préalable à 3x3.
Par la suite, un curseur parcours des cases de la carte préalablement conçue de manière aléatoire. Par la suite, un curseur parcours des cases de la carte préalablement conçue de manière aléatoire.
Pour chaques cases, l'algorithme teste pour chaques cases de la pièce, si l'espace est disponible. Pour chaque cases, l'algorithme teste pour chaque cases de la pièce, si l'espace est disponible.
Si ca n'est pas le cas, alors la pièce est modifiée afin de faire correspondre la pièce et la carte. Si ca n'est pas le cas, alors la pièce est modifiée afin de faire correspondre la pièce et la carte.
L'avantage de cette méthode est que les niveaux sont tous très différents. L'avantage de cette méthode est que les niveaux sont tous très différents.
Les désavantages sont que, par malchance, il est possible d'avoir énormément de piece 1x1. Les désavantages sont que, par malchance, il est possible d'avoir énormément de piece 1x1.
Ainsi qu'il est plus difficile d'appliquer des textures et dessins - à l'image du jeu de base - sur les pièces. Ainsi qu'il est plus difficile d'appliquer des textures et dessins - à l'image du jeu de base - sur les pièces.
Malgrés tout, avec nos nombreux test, ce générateur de niveaux nous satisfait vraiment bien et la difficultée des niveaux coorespond bien aux attentes. Malgré tout, avec nos nombreux test, ce générateur de niveaux nous satisfait vraiment bien et la difficulté des niveaux correspond bien aux attentes.
\subsection{Interface graphique} \subsection{Interface graphique}
L'interface graphique du jeu tient sur 5 classes différentes. L'interface graphique du jeu tient sur 5 classes différentes.
@ -200,12 +200,12 @@ L'interface graphique du jeu tient sur 5 classes différentes.
\subsubsection*{Controller} \subsubsection*{Controller}
Classe principale. Elle s'occupe de la gestion des autres classe, et de la cohérence entre elles. Classe principale. Elle s'occupe de la gestion des autres classe, et de la cohérence entre elles.
Toutes les autres classes (présentes dans le package \verb|Scenes|) sont des sous classe de Parents. Toutes les autres classes (présentes dans le package \verb|Scenes|) sont des sous classe de Parents.
Celà permet de les afficher grace à la méthode statique \verb|switchRoot|. Cela permet de les afficher grace à la méthode statique \verb|switchRoot|.
C'est aussi le point d'entrée du programme. C'est aussi le point d'entrée du programme.
\subsubsection*{MenuAccueil} \subsubsection*{MenuAccueil}
Classe s'occupant de générer la page d'accueil du jeu. Classe s'occupant de générer la page d'accueil du jeu.
C'est-à-dire la première page que vera l'utilisateur. C'est-à-dire la première page que verra l'utilisateur.
Cette page permet d'accéder aux niveaux du jeu de base, mais également de générer les niveaux aléatoires. Cette page permet d'accéder aux niveaux du jeu de base, mais également de générer les niveaux aléatoires.
De plus un dernier boutons "Load Game" permet de revenir sur la dernière partie en cours du joueur. De plus un dernier boutons "Load Game" permet de revenir sur la dernière partie en cours du joueur.
@ -219,12 +219,12 @@ Celle-ci propose également de réessayer le niveau ou de retourner au menu prin
\subsubsection*{GameUI} \subsubsection*{GameUI}
Classe s'occupant de l'affichage d'un niveau. Classe s'occupant de l'affichage d'un niveau.
S'occupe dans un premier temps d'afficher le plateau au milieu de l'écrant. S'occupe dans un premier temps d'afficher le plateau au milieu de l'écran.
Par la suite, les pièces sont dispérsées à la gauche de l'écrant et sont rendu disponible à l'utilisateurs. Par la suite, les pièces sont dispersées à la gauche de l'ocrant et sont rendu disponible à l'utilisateur.
Ces pièces sont déplacables à l'aide de la souris. Ces pièces sont déplaçables à l'aide de la souris.
Si elles sont lachées sur un emplacement disponible du plateau, alors elle vont s'alligner avec ses cellules. Si elles sont lâchées sur un emplacement disponible du plateau, alors elle vont s'aligner avec ses cellules.
Pour se faire, nous regardons si le centre d'une cellule (la plus en haut à gauche) est présente dans une cellule du plateau. Pour se faire, nous regardons si le centre d'une cellule (la plus en haut à gauche) est présente dans une cellule du plateau.
Ensuite, on vérifie que toutes les cellules de la pièces ont bien la place dans le plateau pour se poser. si c'est le cas, alors la pièce est posée. Ensuite, on vérifie que toutes les cellules de la pièces ont bien la place dans le plateau pour se poser. Si c'est le cas, alors la pièce est posée.
\section{Points Faibles} \section{Points Faibles}
@ -238,10 +238,10 @@ De plus suite à la perte de notre membre nous n'avons pas su gérer la partie d
\subsection{Anthony} \subsection{Anthony}
Personellement, ce projet m'a permis de me plonger dans la conception d'un format de fichier personnalisé. Personnellement, ce projet m'a permis de me plonger dans la conception d'un format de fichier personnalisé.
C'est une chôse que je n'avais pas encore fait jusqu'à maintenant. C'est une chose que je n'avais pas encore fait jusqu'à maintenant.
Et malgré mes efforts pour prévoir un maximum de choses à l'avance afin d'éviter de devoir Et malgré mes efforts pour prévoir un maximum de choses à l'avance afin d'éviter de devoir
modifier ma spécification pendant le dévelopement. Je me suis vite rendu compte que je n'avais pas pensé modifier ma spécification pendant le développement. Je me suis vite rendu compte que je n'avais pas pensé
à tout et que je devrais changer des choses pour pouvoir arriver à mes fins. à tout et que je devrais changer des choses pour pouvoir arriver à mes fins.
Je pense que ce parser de fichier est vraiment améliorable mais je suis relativement fier du résultat. Je pense que ce parser de fichier est vraiment améliorable mais je suis relativement fier du résultat.
@ -252,7 +252,7 @@ J'en prend bonne notes.
Il est clair que je peux tirer plusieurs enseignement grâce à la réalisation de notre projet. Il est clair que je peux tirer plusieurs enseignement grâce à la réalisation de notre projet.
Tout d'abord, j'ai pu en apprendre beaucoup plus concernant la P.O.O en java, mais aussi j'en ai appris Tout d'abord, j'ai pu en apprendre beaucoup plus concernant la P.O.O en java, mais aussi j'en ai appris
d'avantage sur l'utilisation de la bibliotheque JavaFx. d'avantage sur l'utilisation de la bibliothèque JavaFx.
De plus, durant la réalisation du projet, comme dit précédemment nous avons utilisé plusieurs outils et dont la plus grande découverte pour moi : De plus, durant la réalisation du projet, comme dit précédemment nous avons utilisé plusieurs outils et dont la plus grande découverte pour moi :
Git. Qui révèle son intérêt pour les travaux de groupes, et qui selon moi se révélera tout aussi essentiel pour mes futurs projets Git. Qui révèle son intérêt pour les travaux de groupes, et qui selon moi se révélera tout aussi essentiel pour mes futurs projets
@ -270,7 +270,7 @@ En conclusion nous pouvons séparer notre travail en trois partie différentes
Malgré notre travail concentré sur le bon fonctionnement du jeu avec un parser suivant nos objectifs, une utilisation de la P.O.O de manière très efficace, Malgré notre travail concentré sur le bon fonctionnement du jeu avec un parser suivant nos objectifs, une utilisation de la P.O.O de manière très efficace,
ainsi qu'une approche correcte de l'utilisation du framework Javafx, d'autre améliorations sont toujours possible ! ainsi qu'une approche correcte de l'utilisation du framework Javafx, d'autre améliorations sont toujours possible !
En effet l'idée de rajouter une histoire, des trophées, un easter egg, des pièces spéciales ou un encore un table de score basée sur le temps, En effet l'idée de rajouter une histoire, des trophées, un Easter egg, des pièces spéciales ou un encore un table de score basée sur le temps,
reste possible afin de rendre notre jeu encore plus complet. reste possible afin de rendre notre jeu encore plus complet.
En conclusion, notre jeu a encore plein de possibilité afin d'être encore plus complet et amusant! En conclusion, notre jeu a encore plein de possibilité afin d'être encore plus complet et amusant!