Défi stratégie : Wall-e
1°/ Le principe
- Créer une stratégie pour le jeu Wall-e (dont les règles sont données dans l'autre article) consiste à écrire une classe Java dans un fichier que vous nommerez IATeamXX.java, avec XX le numéro de votre équipe.
- Par exemple, si vous êtes l'équipe 06, vos créez un fichier IATeam06.java
- Pour que votre stratégie s'intègre correctement à l'environnement de test, il faut que votre fichier suive un canevas bien précis, donné ci-dessous :
class IATeamXX extends DeciderData {
/* cette classe hérite de :
idInParty : le numero de joueur de l'IA dans la partie, 0 = 1er joueur, 1 = 2ème joueur
numTurn : le numéro du tour du joueur, 0 = 1er tour, donc placement initial
*/
WalleBoard board;
public IATeamXX() {
super();
}
public String decidePlay() {
board = (WalleBoard)gameState;
// VOTRE CODE COMMENCE ICI
}
// VOUS POUVEZ AJOUTER D'AUTRES METHODES ICI
}
// VOUS POUVEZ AJOUTER D'AUTRES CLASSES ICI
- Bien entendu, vous devez remplacer dans ce code le XX par votre numéro d'équipe.
- Ecrire une stratgié revient à remplir la méthode decidePlay() qui décide quoi jouer en fonction de l'état du jeu, qui se trouve dans l'objet board.
2°/ Mise en place
- La classe WalleBoard contient toutes les informations nécessaires pour décider quoi jouer.
- Cette classe décrit l'état du plateau grâce à un tableau de 11 lignes par 9 colonnes. Chaque case contient une valeur entre 0 et 15 selon le nombre de murs qu'elle possède.
- 0 = pas de mur,
- 1 = un seul mur à l'est,
- 2 = un seul mur au nord,
- 4 = un seul mur à l'ouest,
- 8 = un seul mur au sud.
- S'il y a plusieurs murs, la valeur est simplement l'addition des valeurs des murs ci-dessous. Par exemple, une case avec des murs sud et ouest a comme valeur 12 (8 + 4).
- Par ailleurs, cette classe stocke la position de chaque joueur ainsi que le nombre de murs qu'ils peuvent encore poser.
- Pour les méthodes, vous avez notamment accès à :
- getBoardState() qui vous retourne l'état du plateau sous la forme d'un tableau d'in à deux dimensions.
- currentPosition() qui renvoie la position d'un joueur (le 0 ou le 1) dans une tableau de 2 int, le premier étant la ligne, le second la colonne.
- isNorthWall(), isSouthWall(), isWestWall(), isEastWall() qui permettent de savoir s'il y a un mur pour une case donnée.
- canMovePawn() pour savoir s'il est possible de déplacer le pion d'un joueur sur une case donnée.
- canPutWall() pour savoir s'il est possible de poser un mur une case et avec une orientation donnée.
- possiblePawnMoves() qui permet d'avoir tous les déplacements possible d'un pion.
- Il existe d'autres méthodes (notamment pour réellement placer un mur ou déplacer un pion) mais elles sont plutôt utiles à la gestion du jeu.
- Grâce à ces fonctions et aux attributs hérités de DeciderData, vous êtes normalement à même de décider quoi jouer.
- Cette décision doit être codée sous forme d'un objet String, renvoyé par decidePlay().
- Cette String, suit un format bien précis :
- pour mettre un pion à sa position initale : i,l,c. Par exemple, pour placer initialement un pion en ligne 0 et colonne 4, la méthode doit renvoyer i,0,4.
- pour déplacer un pion : d,l,c. Par exemple, pour déplacer un pion en ligne 3 et colonne 6, la méthode doit renvoyer d,3,6
- pour poser un mur : b,l,c,ori. ori doit être égal à N ou S ou W ou E (selon l'orientation du mur). Par exemple, pour placer un mur nord sur la case en ligne 6 colonne 7, la méthode doit renvoyer b,6,7,N
ATTENTION ! Si vous renvoyez une chaîne mal formée ou bien avec des indications qui ne respectent par les règles, vous perdez automatiquement. |
- Pour vous donner un petit aperçu des possibilités liées à ces méthodes, vous pouvez regarder la classe DumbIA fournie avec l'environnement de test (cf. ci-dessous).
- Cette classe contient une stratégie particulièrement stupide qui avance tout droit sans chercher son chemin. Il est assez facile de la faire tourner en rond à l'infini.
- Comme indiqué dans le canevas, vous n'êtes pas obligé de mettre tout le code dans la méthode decidePlay(). Vous pouvez créer d'autres méthodes, et même d'autres classes, pourvu qu'elles soient dans le même fichier.
3°/ Tester
- Pour tester votre stratégie :
- vous créez un répertoire dédié, par exemple : defiWalle,
- vous téléchargez dans ce répertoire l'environnement de test [ download walle.tgz ],
- vous décompactez l'archive : tar zxf walle.tgz
- Dans l'archive, vous avez essentiellement des .class plus deux fichiers source : WalleBoard.java et DumbIA.java
- Le premier contient les méthodes mentionnées plus haut dont vous pourrez examiner le code. Vous pouvez notamment voir l'organsiation du tableau que renvoie la méthode possiblePawnMoves(). vous avez également accès au code des méthodes fondamentales du jeu, à savoir déplacer un pion et poser des barrières. Vous n'avez pas besoin d'appeler ces méthodes (en principe) mais elles peuvent vous inspirer pour créer votre stratégie.
- Le second fichier contient une stratégie "stupide". Elle illustre comment utiliser le retour de la méthode possiblePawnMoves().
- L'archive contient une deuxième stratégie, plus intelligente, dont le code se trouve dans la classe BasicIA. Bien entendu, vous n'avez pas accès au source de celle-ci, mais vous pouvez l'utiliser pour jouer contre votre stratgéie.
- L'archive contient également un fichier players.txt qui permet de lancer le challenge avec autant de stratégie que l'on veut.
- A part la première ligne que VOUS NE DEVEZ PAS MODIFIER, chaque ligne suivante contient le pseudo d'un joueur suivi du nom de la classe de stratégie qu'il a créée.
- Pour tester votre propre classe d'IA (nommée par exemple IATeam01), vous pouvez par exemple éditer le fichier en mettant :
WallePartyManager
player1,BasicIA
player2,IATeam01
player1,BasicIA
player2,IATeam01
- en supposant que vous soyez dans le répertoire defiWalle, pour lancer un challenge :
- vous compilez votre stratégie et le projet : javac *.java
- vous lancez le challenge : java IATester players.txt 2 100 1
- Les deux derniers paramètres de IATester permettent de régler :
- le temps maximum en milliscondes pour décider quoi jouer. Dans le cas présent, c'est 100ms.
- le nombre d'affrontements. Dans le cas présent, c'est 1.
- Le résultat s'affiche, désignant le vainqueur, ou bien s'il y a partie nulle.
4°/ L'évaluation
- Vendredi vers 15h30, les classes écrites par les différentes équipes vont être récupérées et utilisées pour lancer un challenge.
- Chaque stratégie va être testée contre toutes les autres, et cela 10 fois.
- ATTENTION : le temps de décision maximal sera réglé sur 500ms et le nombre maximal de tour de jeu pour une partie sera de 112 (soit 56 par joueur). Une stratégie qui met plus de 500ms perd la partie et l'autre gagne. Si la limite de tours est atteinte, il n'y a pas de gagnant (la partie est nulle).
- Chaque victoire compte pour 1, ce qui permet d'établir un classement entre les stratégies.
- Le classement du vendredi soir sera purement indicatif. Seul celui du samedi comptera pour le hackathon.
- Le premier du défi peut obtenir jusqu'à 8 points, selon la performance de sa stratégie. Les suivants recevront également des points, en fonction du classement de leur stratégie.
- Tout participant proposant une stratégie fonctionnelle aura au moins 1 point.