update report

This commit is contained in:
Mylloon 2022-12-01 18:54:33 +01:00
parent 8e40b83851
commit ec4d13dc94
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

View file

@ -85,21 +85,102 @@ choisir un autre coup.
\subsubsection{Problèmes rencontrés}
Mon enjeu numéro 1 était d'éviter tout problème de mémoire. Pour cela dans le
Makefile il y a un label \texttt{dev} qui permet d'ajouter plein de flags pour
\texttt{gcc}, notamment \texttt{fanalyzer} et \texttt{fsanitize=undefined} qui
\texttt{Makefile} il y a un label \texttt{dev} qui permet d'ajouter plein de flags
pour \texttt{gcc}, notamment \texttt{fanalyzer} et \texttt{fsanitize=undefined} qui
permettent de trouver plein de problèmes relatifs à la mémoire. Aussi j'ai utilisé
\texttt{Valgrind} (avec les flags \texttt{g} et \texttt{Og} pour \texttt{gcc} et
les flags \texttt{leak-check=full} \texttt{show-leak-kinds=all}
\texttt{track-origins=yes} \texttt{s} pour \texttt{Valgrind}) me permettant
les flags \texttt{leak-check=full}, \texttt{show-leak-kinds=all},
\texttt{track-origins=yes} et \texttt{s} pour \texttt{Valgrind}) me permettant
d'avoir un maximum d'avertissements et d'informations me permettant de débugger
tous les problèmes.
\\\\
Aussi, je voulais rendre mon code modulable, pour tester plus facilement. Ainsi
la taille du plateau est complètement modulable, aussi les couleurs des joueurs
(cf. \autoref{cod:plateau}).
\begin{figure}[h]
\centering
\begin{minipage}{0.8\textwidth}
\begin{minted}[autogobble,linenos]{c}
/* Une case est soit vide, soit occupé par un des joueurs, noir ou blanc */
enum CASE { VIDE = ' ', BLANC = 'B', NOIR = 'N' };
\end{minted}
\begin{minted}[autogobble,linenos,firstnumber=last]{c}
/* Propriété globale du jeu */
enum PLATEAU { LONGEUR = 8, LARGEUR = 8 };
\end{minted}
\end{minipage}
\caption{Début de \texttt{jeu.h}}
\label{cod:plateau}
\end{figure}
Enfin, sachant qu'il faut aussi implémenter des IAs, j'ai fait en sorte que le jeu
du joueur humain ne soit pas complètement lié au fonctionnement du jeu. Le projet
est donc séparé en plusieurs fichiers/fonctions (cf. \autoref{tree:project}).
\begin{figure}[h]
\centering
\begin{minipage}{0.15\textwidth}
\begin{minted}[autogobble,frame=lines,rulecolor=gray]{mcf}
- includes
|-- humain.h
|-- jeu.h
|-- joueur.h
|-- liste.h
|-- plateau.h
\-- utils.h
- src
|-- humain.c
|-- jeu.c
|-- joueur.c
|-- liste.c
|-- main.c
|-- plateau.c
\-- utils.c
\end{minted}
\end{minipage}
\caption{Arborescence du projet sans l'implémentation des IA}
\label{tree:project}
\end{figure}
Tout ce qui est relatif à un joueur humain est dans \texttt{humain.h}. Le fichier
\texttt{joueur.h} ne contient rien spécifique à un joueur humain.
\newpage
\subsection[Minimax]{Algorithme minimax}
\subsubsection{Algorithme}
% TODO expliquer fonctionnement minimax
L'idée de l'algorithme minimax est de calculer tous les coups possibles pour
chaque coup possible et d'aller le plus loin possible dans les "et si" pour faire
le coup qui nous rapportera le plus de points dans le futur.
Le problème de cet algorithme c'est qu'il est difficilement réalisable. En mémoire,
on doit copier le plateau plusieurs fois (pour chaque "et si"). La complexité est
de $\Theta(c^{n})$ avec $c$ les coups légaux et $n$ la profondeur de jeu, donc
lorsque l'on utilise cet algorithme on doit garder notre profondeur de test
relativement basse.
Aussi, l'algorithme est dépendant d'une fonction d'évaluation, c'est elle qui
décide si le coup est bien ou non, plus elle est précise plus le coup décidé sera
meilleur.
\subsubsection{Exemple d'utilisation}
% TODO expliquer comment l'utiliser
L'utilisation de l'algorithme est simple. Il suffit d'appeller une seule fonction
et elle jouera un coup (cf. \autoref{cod:minimax_def}).
\begin{figure}[h]
\centering
\begin{minipage}{0.8\textwidth}
\begin{minted}[autogobble,linenos]{c}
/* Joue le tour d'après l'algorithme minimax */
void action_joueur_minimax(Jeu *jeu, const int couleur);
\end{minted}
\end{minipage}
\caption{Déclaration de minimax, dans \texttt{minimax.h}}
\label{cod:minimax_def}
\end{figure}
Pour l'utiliser, il faut l'appeller dans la fonction qui s'occupe du déroulement
du jeu.
\subsubsection{Problèmes rencontrés}
% TODO avec code d'illustration
@ -120,4 +201,8 @@ tous les problèmes.
\section{Discussion}
% TODO
\newpage
\appendix
\listoffigures
\end{document}