CSC_41011 · TD3
Pour commencer :
Ce sujet aborde la programmation du jeu de Hex.
Hex est un jeu pour deux joueurs, que l’on appelle Rouge et Bleu. Il se joue sur un plateau en losange pavé par des cases hexagonales, de taille libre, mais typiquement 11×11. Chaque joueur possède deux bords opposés du plateau. Rouge joue en premier. Les joueurs s’emparent tour à tour des cases vides du plateau en les marquant de leurs couleurs. Le premier joueur qui parvient à relier ses deux bords par une suite de cases adjacentes de sa couleur gagne la partie.
Si l’on joue sur un plateau n × n, on peut identifier les cases par des coordonnées (i, j) avec i et j des entiers entre 1 et n inclus. On convient que Rouge possède les bords haut et bas, tandis que Bleu possède les bords gauche et droit.
Certaines fonctionalités de l’interface sont accessibles avec les touches du clavier :
R
réinitialise le plateauSpace
joue un coup aléatoireL
affiche sur chacune des cases le résultat delabel(i, j)
C
affiche les coordonnéesP
affiche les couleurs des cases (utile pour vérifier que les bords sont bien initialisés)A
joue une partie complète aléatoire
HexGUI
implémente une interface graphique, qui repose
sur la classe Hex
pour représenter un état du jeu et
implémenter les règles. Vous pouvez déjà lancer Hex
, et
cliquer sur les cases, mais il ne se passe rien car c’est à vous de
coder la classe Hex
. (Notez toutefois que la touche
C
permet d’afficher les coordonnées.) Au fur et à mesure
des questions, il vous faudra, au besoin, ajouter des champs et des
méthodes, et compléter le constructeur Hex(int n)
Implémenter la méthode Player get(int i, int j)
qui
renvoie le joueur possédant la case (i, j)
(Player.RED
ou Player.BLUE
), ou
Player.NOONE
si cette case n’a pas encore été jouée. Pour
représenter les bords, on permettra à i et j de prendre les valeurs 0 ou n + 1.
On pourra introduire un champ Player grid[][]
correctement initialisé.
Déposez Hex.java
.
Exécutez Hex
et appuyez sur la touche P
pour vérifier l’initialisation du plateau.
Un plateau correctement initialisé.
Implémenter la méthode boolean click(int i, int j)
dont
l’appel signale que le joueur avec le trait joue la case (i, j). Si c’est un coup
légal, la méthode met à jour l’état du plateau et renvoie
true
. Sinon elle ne fait rien et renvoie
false
.
Implémenter la méthode Player currentPlayer()
qui
renvoie le joueur avec le trait.
Déposez Hex.java
.
Vous devriez pouvoir jouer à Hex en éxecutant Hex
. La
touche R
permet de réinitialiser l’état du plateau. La
barre d’espace (que vous pouvez maintenir appuyée) permet de jouer des
coups aléatoires. La touche A
permet de jouer aléatoirement
une partie complète.
On aimerait maintenant que l’interface signale quand l’un des joueurs remporte la partie.
Implémenter la méthode Player winner()
qui renvoie le
joueur dont la position est gagnante, ou Player.NOONE
si
aucun des deux n’a encore gagné. On pourra mettre à profit une structure
de données union-find et associer l’entier i + (n + 2)j à la
case (i, j).
Modifier la méthode currentPlayer()
pour qu’elle renvoie
Player.NOONE
lorsque l’un des joueurs a gagné la
partie.
Déposez Hex.java
.
Pour faciliter le débogage, vous pouvez modifier la methode
int label(int i, int j)
pour, par exemple, qu’elle renvoie
l’identifiant de composante connexe de la case (i, j). Ces identifiants
peuvent être affichés dans l’interface graphique en tapant sur la touche
L
.
Exemple (stratégiquement peu inspiré) d’un plateau avec l’affichage des identifiants des composantes connexes.
Défiez vos camarades.