update report
This commit is contained in:
parent
8e40b83851
commit
ec4d13dc94
1 changed files with 91 additions and 6 deletions
|
@ -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}
|
||||
|
|
Reference in a new issue