\documentclass[12pt,a4paper]{article}

\usepackage{amsmath}
\usepackage{listings}
\usepackage{tikz}
\usepackage{csquotes}

\begin{document}

\title{Rapport du projet informatique 2023 \\ "Road to Master"}
\author{Debucquoy Anthony \and Matteo Di Leto}
\date{May 2023}

\maketitle
\newpage

\tableofcontents
\newpage


\section*{Introduction}

Lors de ce deuxième quadrimèstre, le projet Informatique proposé par notre université fut une 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.
Grace 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.
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.
Nous lui souhaitons une bonne reconversion.

\section*{Objectifs}

Voici l'objectif fixé par nos enseignants. (document de consignes)

\begin{displayquote}

Le but final de ce projet est de réaliser une application graphique en Java permettant de
jouer au jeu "Cats Organized Neatly". Ce jeu est un jeu de type "puzzle" où le joueur doit
placer des pièces de formes différentes pour combler l'aire de jeu. L'application devra permettre
de sauvegarder et charger une partie et de créer des niveaux automatiquement.

\end{displayquote}

\newpage

\section{Organisation}

Lors de nos rasemblement pour le projet, toutes les idées émises se sont retrouvés sur un blog afin de pouvoir y accéder de manière efficace.
Ce blog nous sert également à garder une trace de l'évolution du projet.

\subsection{Choix}

\begin{itemize}
	\item{le VCS git pour garder une trace de l'avancement du projet. Avec comme remote une instance privée de gitea nous permettant de vérifier les MR/PR plus efficacement.}
	\item{Une instance de DroneCI permettant de vérifier que le projet soit toujour compilable et que les tests ne soient pas ratés sans que nous nous en rendions compte.}
	\item{Javafx, comme recommendé par nos enseignants.}
	\item{Les pieces et niveaux sont stockées sous forme de matrice de booléen}
	\item{Un parser de fichiers efficace et donnant des fichier légers.}
\end{itemize}

\subsubsection*{Shapes}

Les pieces ainsi que la carte sont représentés par une matrice de booléen \verb|boolean[][]|.
Nous avons donc une classe \verb|shape|, parent de \verb|Map| et de \verb|Piece| dans lequel nous stockons notre matrice.
Ensuite, \verb|Map| Contient une liste de \verb|Piece|. Ces pièces contiennent une position représentée par la classe\verb|Vec2|.
Cette position est la position du caré supérieur gauche dans la \verb|Map|.
Avec toutes ces informations nous avons le nécéssaire pour le moteur du jeu.

Il est facilement possible de manipuler la carte et les pièces. Il nous suffit alors de faire corespondre l'affichage avec 
ces différentes classe. Ce qui est entrepris par la classe \verb|GameUI|.

Le tout est géré par la classe \verb|Controller| qui permet de choisir entre l'affichage d'un menu ou d'une partie en cours.

\subsection{Difficultés}

\section{Points Forts}

\subsection{Parser de fichiers}

Pour la rétention des niveaux, plusieurs possibilités s'offraient à nous. Nous avons alors décidés d'accomplir une série d'objectifs propre à notre projet avec un parser de fichiers dédié.
Nous voulions que ce parser accomplisse les objectifs suivants:
\begin{itemize}
	\item{Les données du niveau seront encapsulées dans un header/footer pour laisser la possibilité d'enregistrer plus d'informations (images/musiques) dans un seul fichier dans le futur.}
	\item{La taille du fichier devra être aussi petite que possible, tout en gardant les informations nécéssaire au bon fonctionnement du jeu.}
	\item{Il sera possible d'enregistrer l'état d'une partie en cours.}
\end{itemize}

Ce parser est implémenté par la classe \verb|BinaryParser|.

\subsubsection*{spécification}

\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[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.
		La forme de la carte peut alors être répartie sur un nombre indéterminé d'octets.
		Nous pouvons déterminer ce nombre grace à
		$$\frac{\text{largeur} * \text{hauteur } (+1 \text{ si multiple de } 8)}{8}$$ 
		en division entière.}
	\item[Nombre de pièces]{ L'octet suivant l' (les) octet(s) qui forme(nt) la carte represente le nombre de pièces}
	\item[Pour chaques pieces]{
			\
			\begin{description}
				\item[Taille de la piece]{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 piece est représenté 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}
			Dans le cas où le fichier sauvegarde l'état de la partie, à la fin, et pour chaques pieces dans le même ordre que l'apparition des pièces:
			\begin{description}
				\item[Position de la pièce]{2 octets par pieces, 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}
			\end{description}
		}
\end{description}

\subsubsection*{Exemple}

Voici le 'hexdump' du niveau 11

\begin{verbatim}
53 4d 53 05 05 e7 ff ff  80 06 33 ff 80 22 f0 22  |SMS.......3.."."|
b0 22 70 22 b0 11 80 53  4d 45                    |."p"...SME|
\end{verbatim}

représente une carte de la forme 

\begin{tikzpicture}
	\filldraw[blue] (0,0) -- (0,5) -- (3,5) -- (3,4) -- (5,4) -- (5,0) -- cycle;
	\draw[step=1cm,gray] (0, 0) grid (5,5);
\end{tikzpicture}

avec les pieces

\begin{tikzpicture}
	\fill[red] (1,1) rectangle (4,4);
	\fill[red] (5,1) rectangle (7,3);
	\fill[red] (8,1) -- (8,3) -- (9,3) -- (9,2) -- (10,2) -- (10,1) -- cycle;
	\fill[red] (11,1) -- (11,2) -- (12,2) -- (12,3) -- (13,3) -- (13,1) -- cycle;
	\fill[red] (1,-2) -- (1,0) -- (2,0) -- (2,-1) -- (3,-1) -- (3,-2) -- cycle;
	\fill[red] (4, -2) rectangle (5, -1);
	\draw[step=1cm,gray] (0.5, -2.5) grid (13.5, 4.5);
\end{tikzpicture}

En plus de ce parser, et dans le cas où ce premier parser ne serait pas capable de stocker certaine carte (par exemple si une piece mesure plus de 15x15).
Nous avons également implémenté un parser trés simple en utilisant l'interface \verb|Serialize| de java. Ce parser est implémenté et fonctionnel,
mais n'est pas utilisé dans le projet à l'heure actuelle.

ces deux parseurs implémentent l'interface \verb|FileParser| affin de pouvoir utiliser l'un où l'autre parser.

Finalement, La classe \verb|FileParserFactory| permet une utilisation simple des parseurs. Celle-ci contient deux fonction statique.
\begin{itemize}
	\item{Map loadMapFromFile(File)}
		permet de retourner la Map d'un fichier chargé.
	\item{void saveFileFromMap(File, Map)}
		permet de sauvegarder une map dans un fichier.
\end{itemize}

Dans le cas d'une sauvegarde ou d'un chargement, le parser est choisi en fonction de l'extension de fichier ('.level', '.slevel', .'serialized', '.sserialized').

L'avantage de ce system est que nous pouvons facilement ajouter d'autres parser de fichier dans le futurs.

\subsection{generateur de niveaux}

Le generateur de niveau permet 3 niveaux de difficultés différents.

\section{Points Faibles}

\section{Apports Positifs et négatifs}

\subsection{Anthony}

Personellement, 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'a maintenant.
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é
à 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.

J'ai pu présenter ce parser à Dr Quoitin qui a pu me conseiller sur différentes approches à ce problème.
J'en prend bonne notes.

\subsection{Matteo}

\section{conclusion}

\end{document}
