Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

documentation, refactor, optimisation dans les controleurs et l'ihm #2

Merged
merged 1 commit into from
Apr 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 61 additions & 5 deletions src/controleur/Controleur.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,36 +8,68 @@
import modele.Plateau;
import vue.Ihm;

/**
* Classe abstraite du contrôleur contenant les squelettes des méthodes, ainsi que les attributs
*/
public abstract class Controleur {
/** Numéro du joueur courant, x ∈ [0 ; 1]**/
protected int numeroJoueurCourant;

/** Nombre de parties jouées, incrémentée dans toursDeJeu()
* @see #toursDeJeu() */
protected int nombrePartie = 0;

/** Array contenant les objets Joueur représentant les joueurs
* @see Joueur*/
protected Joueur[] lesJoueurs;

/** Objet Plateau pouvant représenter ses sous-classes PlateauNim ou PlateauP4
* @see Plateau
* @see modele.PlateauNim
* @see modele.PlateauP4*/
protected Plateau plateau;

/**
* Objet Interface Humain Machine chargé de récupérer les commandes du joueur et d'afficher l'état de la partie
* @see Ihm
*/
protected Ihm ihm;

/**
* Méthode permettant d'initialiser un certain nombre de joueurs (pour l'instant, fixé à 2)
*/
protected void initJoueur() {
int nbJoueur = 2;
lesJoueurs = new Joueur[2];
int nbJoueur = 2; //Possiblité de demander à l'ihm un nombre de joueurs ou par le biais d'un futur paramètre
lesJoueurs = new Joueur[nbJoueur];
for (int i = 0; i < nbJoueur; i++) {
lesJoueurs[i] = new Joueur(ihm.demanderNomJoueur(i+1));
}
}


/**
* <p>Squelette du déroulement d'une partie appel des méthodes de ses sous-classes</p>
* <ul>
* <li>Incrémentation des variables et initialisation du plateau</li>
* <li>Demande du coup</li>
* <li>Vérification de la victoire</li>
* <li>Rappel de la méthode ou fin du programme</li>
* </ul>
*/
protected void toursDeJeu() {
nombrePartie+=1;
numeroJoueurCourant=1;
plateau.reset();
//plateau.steOption();
//setOption();
while (!plateau.verifierFin()){
tourSuivant();
boolean estCoupCorrect = false;
while (!estCoupCorrect){
try{
estCoupCorrect = true;
ihm.afficherPlateau(plateau.toString());
getCoup();
estCoupCorrect = true;
} catch (NombreBatonnetsInvalide | NumeroTasInvalide | ColonnePleine | FormatReponseInvalide exception){
estCoupCorrect = false;
ihm.afficherErreur(exception.getMessage());
}
}
Expand Down Expand Up @@ -103,7 +135,31 @@ protected String getNomJoueurCourant() {
}

//Déclaration des méthodes abstraite
/**
* <p>Méthode abstraite</p>
* <p>Doit demander le coup à l'ihm et demander au plateau de réaliser le coup</p>
*/
protected abstract void getCoup() throws FormatReponseInvalide, NombreBatonnetsInvalide, NumeroTasInvalide, ColonnePleine;

/**
* <p>Méthode abstraite</p>
* <p>Doit géré l'affichage du vainqueur,
* doit aussi prendre en compte la possibilité d'un ex aequo</p>
*/
protected abstract void victoire();

/**
* <p>Méthode abstraite</p>
* <p>Doit appeler initJoueur() pour initialiser les joueurs,
* doit aussi crée le plateau du jeu, ainsi que faire appel à toursDeJeu() pour lancer le jeu</p>
* @see Controleur#initJoueur()
* @see Controleur#toursDeJeu()
*/
public abstract void jouer();

/**
* <p>Méthode abstraite</p>
* <p>Doit demander l'activation de l'option à l'ihm et demander au plateau d'activer ou non l'option</p>
*/
protected abstract void setOption();
}
34 changes: 23 additions & 11 deletions src/controleur/ControleurJeuNim.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package controleur;

import exception.FormatReponseInvalide;
import exception.NombreBatonnetsInvalide;
import exception.NombreTasInvalides;
import exception.NumeroTasInvalide;
import modele.Joueur;
import exception.*;
import modele.PlateauNim;
import vue.Ihm;

/**
* Classe du contrôleur du jeu de Nim
* hérite de Controleur
* @see Controleur
*/
public class ControleurJeuNim extends Controleur{

Expand All @@ -20,26 +18,24 @@ public class ControleurJeuNim extends Controleur{
*/
public ControleurJeuNim (Ihm ihm) {
this.ihm = ihm;
this.lesJoueurs = new Joueur[2];
}

/**
* <p>Initialise une nouvelle partie en demandant le nombre de tas.</p>
* <p>Les noms des joueurs, et en créant le plateauNim de jeu.</p>
* Initialise une nouvelle partie en demandant le nombre de tas,
* les noms des joueurs, crée le PlateauNim de jeu et lance la partie.
*/
public void jouer() {
boolean isNbTasValide = false;

int nombreTas = 0;
while (!isNbTasValide) {
try {
isNbTasValide = true;
nombreTas = ihm.demanderNbTas();
if (nombreTas <1){
throw new NombreTasInvalides("Le nombre de tas ne peut pas être inférieur à 1");
}
isNbTasValide = true;
} catch (NombreTasInvalides exception) {
isNbTasValide = false;
ihm.afficherErreur(exception.getMessage());
}
}
Expand All @@ -49,15 +45,31 @@ public void jouer() {
initJoueur();
toursDeJeu();
}

/**
* Demande le coup à l'ihm et demander au plateau de réaliser le coup.
* @throws FormatReponseInvalide Si la réponse n'est pas au format `m n`.
* @throws NombreBatonnetsInvalide Si le nombre de bâtonnets dans le tas à inférieur au retrait demandé ou que la limite de bâtonnets par coup a été atteinte.
* @throws NumeroTasInvalide Si le tas demandé est inconnue.
*/
protected void getCoup() throws FormatReponseInvalide, NombreBatonnetsInvalide, NumeroTasInvalide {
int[] candidate = ihm.demanderCoupNim(getNomJoueurCourant());
plateau.retirerBatonnets(candidate[0], candidate[1]);
}

/**
* Incrément le nombre de victoires du joueur courant
* et gére l'affiche du vainqueur.
*/
protected void victoire(){
getJoueurCourant().incrementVictoires();
ihm.afficherVictoire(getNomJoueurCourant(), getJoueurCourant().getNbVictoires(), nombrePartie, false);
}

/**
* Demande à l'ihm si l'utilisateur veut activer ou non la limite de bâtonnets par coup,
* puis demande au plateau de l'activer.
*/
protected void setOption(){
//appel de l'ihm et transfère dans le plateau
}
}
26 changes: 21 additions & 5 deletions src/controleur/ControleurP4.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

import exception.ColonnePleine;
import exception.FormatReponseInvalide;
import modele.Joueur;
import modele.PlateauP4;
import vue.Ihm;

/**
* Classe du contrôleur du jeu de puissance 4
* Classe du contrôleur du jeu de puissance 4,
* hérite de Controleur
* @see Controleur
*/
public class ControleurP4 extends Controleur{

Expand All @@ -18,25 +19,32 @@ public class ControleurP4 extends Controleur{
*/
public ControleurP4(Ihm ihm) {
this.ihm = ihm;
this.lesJoueurs = new Joueur[2];
this.plateau = new PlateauP4();
}

/**
* Initialise une nouvelle partie en demandant les noms des joueurs,
* et en créant le plateauP4 de jeu.
* crée le PlateauP4 de jeu et lance la partie.
*/
public void jouer() {
initJoueur();
plateau = new PlateauP4();
toursDeJeu();
}

/**
* Demande le coup à l'ihm et demander au plateau de réaliser le coup.
* @throws FormatReponseInvalide Si la réponse n'est pas compris entre 1 et 7.
* @throws ColonnePleine Si la colonne est pleine.
*/
protected void getCoup() throws FormatReponseInvalide, ColonnePleine {
byte candidate = ihm.demanderCoupP4(getNomJoueurCourant());
plateau.placerJeton((byte) (candidate-1), (byte) (numeroJoueurCourant+1));
}

/**
* Incrément le nombre de victoires du joueur courant
* et gére l'affiche du vainqueur prendre aussi en compte la possibilité d'un ex aequo
*/
protected void victoire(){
if (!plateau.verifierVictoire()){
ihm.afficherVictoire(getNomJoueurCourant(), getJoueurCourant().getNbVictoires(), nombrePartie, true);
Expand All @@ -46,4 +54,12 @@ protected void victoire(){
}
ihm.afficherPlateau(plateau.toString());
}

/**
* Demande à l'ihm si l'utilisateur veut activer ou non la contrainte de rotation,
* puis demande au plateau de l'activer.
*/
protected void setOption(){
//appel de l'ihm et transfère dans le plateau
}
}
3 changes: 3 additions & 0 deletions src/modele/Plateau.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
import exception.NombreBatonnetsInvalide;
import exception.NumeroTasInvalide;

/**
* Classe abstraite du plateau, n'est pas une interface pour que dans le controleur
*/
public abstract class Plateau {
public abstract void reset();
public abstract boolean verifierFin();
Expand Down
Loading