Teaching - 2i002 - (TME: sujets)


2i002 : Introduction à la programmation Objet

Jeu de l'Awele

L'awélé est un jeu à deux joueurs qui se joue avec un plateau formé de 12 cases et de 48 billes réparties au début du jeu à raison de 4 par case (voir figure).

Chaque joueur possède les 6 cases Nord ou les 6 cases Sud du jeu. Les cases sont attribuées au joueur en début de la partie. Les cases du plateau sont toujours parcourues dans le sens indiqué sur la figure (sens des aiguilles d'une montre sur la figure).

Le jeu se joue de la façon suivante :

  • Un joueur choisit l'une de ses propres cases, puis répartit son contenu en déposant une bille et une seule dans chacune des cases consécutives. Par exemple, si le joueur 1 choisit la case 5 (deuxième case en partant de la gauche des cases au Sud) pour jouer, cela donne le résultat suivant :
  • Un joueur marque un coup gagnant lorsqu'il dépose sa dernière bille (du coup en cours) dans une case adverse qui ne contient qu'une seule bille. Dans cette situation, le joueur gagne alors ces deux billes et les retire du plateau. Situation avant le coup gagnant :
  • Le joueur 1 choisit de jouer sa case 6, on obtient alors :
  • Le joueur 1 retire alors deux billes du plateau (il gagne deux billes) qui devient :
  • Le joueur peut aussi cumuler des gains si la case précédente a aussi deux billes à la fin du coup. Il en gagne alors deux de plus. Les joueurs jouent tour à tour jusqu'à ce que le nombre total de billes sur le plateau soit inférieur à 12. Le gagnant est le joueur qui a remporté le plus de billes.

Le jeu électronique :

Le jeu électronique de l'Awélé se joue lui aussi à deux joueurs. Le plateau est affiché à l'écran. Pour manipuler les billes, les joueurs désignent les cases du plateau soit en donnant le numéro de la case, soit en cliquant à la souris. Le jeu électronique contrôle le bon déroulement du jeu. Au début du jeu, il affecte les cases du plateau aux joueurs. Il fait jouer les deux joueurs à tour de rôle, comptabilise les points de chacun et désigne le gagnant. Pour jouer, un joueur désigne la case dont il veut répartir les billes. Le jeu répartit automatiquement ses billes dans les cases suivantes et gère les gains en attribuant les billes au joueur gagnant.

Question 1 :

Déterminer les classes nécessaires à la modélisation du jeu électronique en précisant les attributs et les méthodes de chacune des classes.

Question 2 :

Définir une classe Case caratérisée par un nombre de billes (int nbBilles), et son propriétaire (prop de type Joueur ). Écrire un constructeur sans paramètre et un constructeur ayant comme paramètre un Joueur, ainsi qu'une méthode toString() .

Question 3 :

Définir la classe Joueur qui se caractérise par le numéro et le gain (total) du joueur. Écrire un constructeur sans paramètre et un constructeur ayant comme paramètre le numéro du joueur. Ajouter des accesseurs et une méthode de mise à jour du gain.

Question 4 :

Définir une classe Jeu caractérisée par un plateau de cases, un tableau de joueurs et un indicateur pour savoir qui a la main (on utilisera une variable de type Joueur pointant vers le joueur qui a la main). Écrire un constructeur qui initialise la partie comme indiquée sur la première figure (Création des 2 joueurs en interne) et la méthode toString() pour visualiser le plateau.

Question 5 :

Compléter la classe Jeu pour, dans le constructeur, définir le joueur qui a la main. Écrire la méthode changeJoueur() qui donne la main à l'autre joueur et une méthode choisirCase() qui demande au joueur qui à la main de choisir ue case et qui valide ce choix. Ecrire une méthode unCoup(int i) qui réalise le coup à partir de la case numéro i.

NB: unCoup(int i) est une méthode longue qui réalise les opérations suivantes:

  • Récupération des billes d'une case non vide
  • Distribution des billes dans les cases suivantes
  • Vérification du nombre de billes dans la dernière case de la distribution
    • retrait des billes s'il y en a 2
    • mise à jour du gain
    • vérification de la case précédente
Question 6 :

Compléter la classe Jeu en y ajouter une méthode finDePartie() qui affiche si on est en fin de partie et une méthode boolean jouer() qui assure le bon déroulement de la partie tant que la partie n'est pas finie.

Question 7 :

Définir la classe Awele qui lance une nouvelle partie et qui gère la fin de partie.