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
|
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
|
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}).
|
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
|
\centering
|
||||||
\begin{minipage}{0.15\textwidth}
|
\begin{minipage}{0.15\textwidth}
|
||||||
\begin{minted}[autogobble,frame=lines,rulecolor=gray]{mcf}
|
\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}
|
\label{tree:project}
|
||||||
\end{figure}
|
\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
|
\newpage
|
||||||
\subsection[Minimax]{Algorithme minimax}
|
\subsection[Minimax]{Algorithme minimax}
|
||||||
\subsubsection{Algorithme}
|
\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.
|
meilleur.
|
||||||
|
|
||||||
\subsubsection{Exemple d'utilisation}
|
\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}).
|
et elle jouera un coup (cf. \autoref{cod:minimax_def}).
|
||||||
\begin{figure}[h]
|
\begin{figure}[h]
|
||||||
\centering
|
\centering
|
||||||
|
@ -174,20 +176,66 @@ et elle jouera un coup (cf. \autoref{cod:minimax_def}).
|
||||||
/* Joue le tour d'après l'algorithme minimax */
|
/* Joue le tour d'après l'algorithme minimax */
|
||||||
void action_joueur_minimax(Jeu *jeu, const int couleur);
|
void action_joueur_minimax(Jeu *jeu, const int couleur);
|
||||||
\end{minted}
|
\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}
|
\end{minipage}
|
||||||
\caption{Déclaration de minimax, dans \texttt{minimax.h}}
|
\caption{Déclaration de minimax, dans \texttt{minimax.h}}
|
||||||
\label{cod:minimax_def}
|
\label{cod:minimax_def}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
Pour l'utiliser, il faut l'appeller dans la fonction qui s'occupe du déroulement
|
Pour l'utiliser, il faut l'appeler dans la fonction qui s'occupe du déroulement
|
||||||
du jeu.
|
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}
|
\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}
|
\subsection[Alpha-Bêta]{Élagage alpha-bêta}
|
||||||
\subsubsection{Algorithme}
|
\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}
|
\subsubsection{Exemple d'utilisation}
|
||||||
% TODO expliquer comment l'utiliser
|
% TODO expliquer comment l'utiliser
|
||||||
|
|
Reference in a new issue