diff --git a/report/document.tex b/report/document.tex index 8d9fede..aa0cb8b 100644 --- a/report/document.tex +++ b/report/document.tex @@ -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}