diff --git a/src/main/java/sae/chuzzle/Controleur.java b/src/main/java/sae/chuzzle/Controleur.java index 62d5650..7ea90e2 100644 --- a/src/main/java/sae/chuzzle/Controleur.java +++ b/src/main/java/sae/chuzzle/Controleur.java @@ -3,6 +3,7 @@ package sae.chuzzle; import android.app.Activity; import android.content.Intent; import android.os.Bundle; +import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.RadioButton; @@ -10,8 +11,6 @@ import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; -import java.util.List; - public class Controleur { private final Activity activite; @@ -26,12 +25,12 @@ public class Controleur { private final Spinner spinnerIndex; private final Button btnJouer; - // Hard Mode + // Hard Mode logic private final boolean hardMode; - - // - - // CONSTRUCTEUR - + private GestionnaireObjectifs gestionnaireObjectifs; + private Objectif objectifActuel; + private TextView tvObjectif; + private TextView tvNbObjectifs; public Controleur(Activity activite, EtatJeu etatJeu, VueGrille vueGrille, long graine, @@ -52,14 +51,19 @@ public class Controleur { this.btnJouer = btnJouer; this.hardMode = hardMode; + if (hardMode) { + this.gestionnaireObjectifs = new GestionnaireObjectifs(graine); + this.tvObjectif = activite.findViewById(R.id.tvObjectif); + this.tvNbObjectifs = activite.findViewById(R.id.tvNbObjectifs); + + if (tvObjectif != null) tvObjectif.setVisibility(View.VISIBLE); + if (tvNbObjectifs != null) tvNbObjectifs.setVisibility(View.VISIBLE); + } + initialiserSpinner(); rafraichirAffichage(); } - // - - // INITIALISATION - - private void initialiserSpinner() { String[] indices = {"0", "1", "2", "3", "4", "5"}; ArrayAdapter adaptateur = new ArrayAdapter<>( @@ -71,20 +75,54 @@ public class Controleur { spinnerIndex.setAdapter(adaptateur); } - // - - // GESTION DU COUP + /** + * Initialise l'objectif au début de la partie ou lors de la restauration. + */ + public void initialiserObjectif(Bundle savedState) { + if (!hardMode) return; + + gestionnaireObjectifs.restaurer(savedState); + objectifActuel = Objectif.restaurer(savedState); + + if (objectifActuel == null) { + objectifActuel = gestionnaireObjectifs.genererObjectif(); + } + rafraichirAffichage(); + } + /** + * Gère la validation d'un coup réussi (mise à jour objectif, score, affichage). + * Centralise la logique pour être appelé par le bouton ET par le tactile. + */ + public void gererFinDeCoup() { + // --- Logique Hard Mode --- + if (hardMode && objectifActuel != null) { + // 1. Décrémenter les coups de l'objectif + objectifActuel.decrementerCoups(); + + // 2. Compter les séries de la couleur cible + int[] series = etatJeu.getSeriesParCouleurDernierCoup(); + objectifActuel.ajouterSeries(series[objectifActuel.getCouleur()]); + + // 3. Vérifier réussite ou échec + if (objectifActuel.estReussi()) { + Toast.makeText(activite, "Objectif réussi !", Toast.LENGTH_SHORT).show(); + gestionnaireObjectifs.incrementerReussites(); + objectifActuel = gestionnaireObjectifs.genererObjectif(); + } else if (objectifActuel.estEchoue()) { + Toast.makeText(activite, "Objectif échoué ! Fin de partie.", Toast.LENGTH_LONG).show(); + etatJeu.forcerFinDePartie(); + } + } + + rafraichirAffichage(); + verifierFinDePartie(); + } public void gererCoupJoueur() { boolean estLigne = rbLigne.isChecked(); int index = spinnerIndex.getSelectedItemPosition(); - - int sens; - if (rbDroite.isChecked()) { - sens = +1; - } else { - sens = -1; - } + int sens = rbDroite.isChecked() ? 1 : -1; boolean accepte = etatJeu.appliquerCoup(estLigne, index, sens); @@ -93,41 +131,42 @@ public class Controleur { return; } - Toast.makeText(activite, "Coup valide !", Toast.LENGTH_SHORT).show(); - rafraichirAffichage(); - verifierFinDePartie(); + gererFinDeCoup(); } - // - - // FIN DE PARTIE - - public void verifierFinDePartie() { if (etatJeu.estTerminee()) { Intent intent = new Intent(activite, FinPartieActivity.class); intent.putExtra("score", etatJeu.obtenirScore()); intent.putExtra("nbCoups", etatJeu.obtenirNbCoups()); intent.putExtra("graine", graine); + intent.putExtra("objectifsReussis", hardMode ? gestionnaireObjectifs.getNbObjectifsRealises() : 0); activite.startActivity(intent); } } - // - - // MISE A JOUR DE LA VUE - - public void rafraichirAffichage() { tvScore.setText("Score : " + etatJeu.obtenirScore()); tvCoups.setText("Coups : " + etatJeu.obtenirNbCoups()); vueGrille.definirGrille(etatJeu.obtenirGrille()); vueGrille.definirVerrous(etatJeu.obtenirVerrous()); + if (hardMode && objectifActuel != null) { + if (tvObjectif != null) tvObjectif.setText(objectifActuel.getDescription()); + if (tvNbObjectifs != null) tvNbObjectifs.setText("Objectifs réussis : " + gestionnaireObjectifs.getNbObjectifsRealises()); + } + if (etatJeu.estTerminee()) { btnJouer.setEnabled(false); } } public void sauvegarderEtat(Bundle out) { - // Nettoyé de la logique d'objectifs + if (hardMode) { + gestionnaireObjectifs.sauvegarder(out); + if (objectifActuel != null) { + objectifActuel.sauvegarder(out); + } + } } } \ No newline at end of file