Le jeu de Hex

CSC_41011 · TD3

 Login :  Mot de passe :

Pour commencer :

1 Hex

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.

Coordonnées cartésiennes

2 Le code

Certaines fonctionalités de l’interface sont accessibles avec les touches du clavier :

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)

2.1 État des cases

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.

Le nom du fichier à déposer
Il faut se connecter avant de pouvoir déposer

Exécutez Hex et appuyez sur la touche P pour vérifier l’initialisation du plateau.

Un plateau correctement initialisé.

Initialisation

2.2 Les tours de jeu

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.

Le nom du fichier à déposer
Il faut se connecter avant de pouvoir déposer

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.

2.3 Victoire

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.

Le nom du fichier à déposer
Il faut se connecter avant de pouvoir déposer

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.

Union-find

2.4 S’il reste du temps

Défiez vos camarades.