L'objectif de ce TD est de continuer le morpion en y rajoutant des options et une stratégie de jeu contre l'ordinateur.
On abordera la notion de fonctions à nombre variable d'arguments,
l'utilisation de
pour analyser les arguments de la ligne de commande,
et les pointeurs sur fonction.
On va rajouter des options au programme du morpion que l'on gèrera à l'aide de la fonction
getopt_long.
Une liste non exhaustive des options que l'on souhaite pouvoir utiliser est :
-
-y n (ou --hauteur): fixe la hauteur du plateau à n cases ;
-
-x n (ou --largeur): fixe la largeur du plateau à n cases ;
-
-a n (ou --alignement): fixe à n le nombre de pions à aligner pour gagner ;
-
-h (ou --help) : affiche une aide et quitte le programme.
On gardera par défaut les valeurs de 8x8 pour les dimensions du plateau et de 4 pour le nombre de pions à aligner.
Le but de cet exercice est de donner la possibilité de jouer contre l'ordinateur.
Pour cela, on définit un type
Joueur qui correspondra à un joueur, humain ou ordinateur.
Cette structure comprendra un entier identifiant le joueur et un pointeur vers une fonction du type :
void placePion(Joueur * J, Grille * G, int * x, int * y);
qui étant donnés un joueur
J et une grille
G retourne les coordonnées
x et
y du prochain pion à placer.
Dans le cas d'un joueur humain, la fonction pointée se chargera de récupérer les coordonnées saisies au clavier par l'utilisateur.
Dans le cas d'un joueur ordinateur, la fonction correspondra à une stratégie.
Les stratégies suivantes devront être implémentées en premier lieu :
-
random : statégie inexistante, le joueur pose son pion sur une case libre au hasard ;
-
defense : stratégie défensive, le joueur pose son pion de façon à gêner au mieux le plus grand alignement de pions adverses ;
-
attack : stratégie offensive, le joueur pose son pion de façon à obtenir le plus grand alignement possible.
Pour chaque type de joueur, on écrira une fonction qui crée et initialise correctement une nouvelle structure
Joueur.
Par exemple :
Joueur * creerJoueurHumain(int id);
Joueur * creerJoueurRandom(int id);
etc.
On ajoutera les options
-1 (resp.
-2) pour permettre de fixer une stratégie pour le joueur 1 (resp. 2).
Vous réflechirez ensuite à l'écriture de stratégies plus efficaces.