update report
This commit is contained in:
parent
12c20f5805
commit
f4797f572b
1 changed files with 57 additions and 9 deletions
|
@ -118,8 +118,13 @@ la taille du plateau est complètement modulable, aussi les couleurs des joueurs
|
|||
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}).
|
||||
\\\\
|
||||
Grâce à ça, les fonctions relatives au jeu sont indifférentes par rapport à quelle
|
||||
fonction "joueur" est appelée. Autrement dit, 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.
|
||||
|
||||
\begin{figure}[h]
|
||||
\begin{figure}[ht]
|
||||
\centering
|
||||
\begin{minipage}{0.15\textwidth}
|
||||
\begin{minted}[autogobble,frame=lines,rulecolor=gray]{mcf}
|
||||
|
@ -144,9 +149,6 @@ est donc séparé en plusieurs fichiers/fonctions (cf. \autoref{tree:project}).
|
|||
\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}
|
||||
|
@ -165,7 +167,7 @@ décide si le coup est bien ou non, plus elle est précise plus le coup décidé
|
|||
meilleur.
|
||||
|
||||
\subsubsection{Exemple d'utilisation}
|
||||
L'utilisation de l'algorithme est simple. Il suffit d'appeller une seule fonction
|
||||
L'utilisation de l'algorithme est simple. Il suffit d'appeler une seule fonction
|
||||
et elle jouera un coup (cf. \autoref{cod:minimax_def}).
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
|
@ -174,20 +176,66 @@ et elle jouera un coup (cf. \autoref{cod:minimax_def}).
|
|||
/* Joue le tour d'après l'algorithme minimax */
|
||||
void action_joueur_minimax(Jeu *jeu, const int couleur);
|
||||
\end{minted}
|
||||
|
||||
\begin{minted}[autogobble,linenos,firstnumber=last]{c}
|
||||
/* Auxiliaire : Décide d'une case à jouer via l'algorithme minimax */
|
||||
void _action_joueur_minimax(Jeu *jeu, int profondeur, const int couleur,
|
||||
const int gagnant, int *ligne, int *colonne,
|
||||
int *score);
|
||||
\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.
|
||||
Pour l'utiliser, il faut l'appeler dans la fonction qui s'occupe du déroulement
|
||||
du jeu (cf. \autoref{cod:minimax_play}).
|
||||
|
||||
\begin{figure}[ht]
|
||||
\centering
|
||||
\begin{minipage}{0.8\textwidth}
|
||||
\begin{minted}[autogobble,linenos]{c}
|
||||
while (!partie_finie(jeu)) {
|
||||
Coups *possibilites =
|
||||
action_possible_joueur(jeu->plateau, tour->couleur);
|
||||
if (possibilites->taille_liste > 0) {
|
||||
// Si le joueur peut jouer
|
||||
if (tour->couleur == NOIR) {
|
||||
// Tour du joueur minimax
|
||||
action_joueur_minimax(jeu, tour->couleur);
|
||||
} else {
|
||||
// Tour du joueur humain
|
||||
action_joueur_humain(jeu, tour->couleur);
|
||||
}
|
||||
}
|
||||
|
||||
// On passe la main à l'autre joueur
|
||||
tour = jeu->j1->couleur == tour->couleur ? jeu->j2 : jeu->j1;
|
||||
}
|
||||
\end{minted}
|
||||
\end{minipage}
|
||||
\caption{Extrait modifié de \texttt{jeu.c}, avec minimax jouant les noirs et un humain les blancs}
|
||||
\label{cod:minimax_play}
|
||||
\end{figure}
|
||||
|
||||
\newpage
|
||||
\subsubsection{Problèmes rencontrés}
|
||||
% TODO avec code d'illustration
|
||||
Le plus dur était l'implémentation en elle-même et de pas s'emmêler entre les copies
|
||||
de plateau. La fonction \texttt{action\_joueur\_minimax} appelle une fonction auxiliaire
|
||||
\texttt{\_action\_joueur\_minimax} (cf. \autoref{cod:minimax_def}) qui fait implémente directement minimax. Elle se passe
|
||||
en paramètre récursivement :
|
||||
\begin{itemize}
|
||||
\item la ligne choisie
|
||||
\item la colonne choisie
|
||||
\item le meilleur score
|
||||
\item la profondeur actuellement évaluée
|
||||
\item la couleur du joueur (soit MIN, soit MAX)
|
||||
\end{itemize}
|
||||
|
||||
\subsection[Alpha-Bêta]{Élagage alpha-bêta}
|
||||
\subsubsection{Algorithme}
|
||||
% TODO expliquer fonctionnement alphabeta
|
||||
Les coupures $\alpha - \beta$ permettent de réduire la taille en mémoire de minimax
|
||||
en ne calculant pas certains scénarios.
|
||||
|
||||
\subsubsection{Exemple d'utilisation}
|
||||
% TODO expliquer comment l'utiliser
|
||||
|
|
Reference in a new issue