Équilibrage du hardMode

This commit is contained in:
2026-03-29 18:14:15 +02:00
parent e3830a5c9f
commit 75650d7062
20 changed files with 103 additions and 23 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
Binary file not shown.
@@ -1,2 +0,0 @@
#Sun Mar 29 14:38:47 CEST 2026
gradle.version=9.2.0
View File
+25 -8
View File
@@ -1,7 +1,6 @@
package sae.chuzzle;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
@@ -54,7 +53,7 @@ public class Controleur {
if (tvNbObjectifs != null) tvNbObjectifs.setVisibility(View.VISIBLE);
if (layoutCles != null) layoutCles.setVisibility(View.VISIBLE);
// Listener du bouton de réinitialisation
if (btnReinitialisationObjectif != null) {
btnReinitialisationObjectif.setOnClickListener(v -> reinitialiserObjectif());
}
@@ -106,7 +105,7 @@ public class Controleur {
gestionnaireObjectifs.incrementerReussites();
objectifActuel = gestionnaireObjectifs.genererObjectif();
} else if (objectifActuel.estEchoue()) {
// Plus de coups disponibles et objectif non réussi fin de partie immédiate
// Plus de coups disponibles et objectif non réussi -> fin de partie immédiate
Toast.makeText(activite, "Objectif échoué !",
Toast.LENGTH_SHORT
).show();
@@ -140,14 +139,28 @@ public class Controleur {
* Lancer l'écran de fin.
*/
public void verifierFinDePartie() {
int nbARetenir;
if (hardMode) {
nbARetenir = gestionnaireObjectifs.getNbObjectifsRealises();
} else {
nbARetenir = 0;
}
String description;
if (hardMode == true && objectifActuel != null) {
description = objectifActuel.getDescription();
} else {
description = null;
}
if (etatJeu.estTerminee()) {
FinPartieActivity.demarrer(
activite,
etatJeu.obtenirScore(),
etatJeu.obtenirNbCoups(),
graine,
hardMode ? gestionnaireObjectifs.getNbObjectifsRealises() : 0,
(hardMode && objectifActuel != null) ? objectifActuel.getDescription() : null,
nbARetenir,
description,
etatJeu.obtenirGrille(),
etatJeu.obtenirVerrous()
);
@@ -161,12 +174,16 @@ public class Controleur {
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 (tvObjectif != null){
tvObjectif.setText(objectifActuel.getDescription());
}
if (tvNbObjectifs != null){
tvNbObjectifs.setText("Objectifs réussis : " + gestionnaireObjectifs.getNbObjectifsRealises());
}
int nbCles = gestionnaireObjectifs.getNbCles();
if (tvCles != null) {
tvCles.setText("🗝️ Clés : " + nbCles);
tvCles.setText("🗝️ Clés : " + nbCles + " (Max 1)");
}
if (btnReinitialisationObjectif != null) {
// Grisé si 0 clé
@@ -8,6 +8,9 @@ import android.widget.TextView;
public class FinPartieActivity extends Activity {
private FinPartieControleur controleur;
private Button btnMenu;
/**
* Méthode statique pour démarrer l'activité avec toutes les données nécessaires.
*/
@@ -97,18 +100,18 @@ public class FinPartieActivity extends Activity {
vueGrilleFinale.definirVerrous(verrous);
}
// Bouton retour au menu
Button btnMenu = findViewById(R.id.btnFinMenu);
btnMenu.setOnClickListener(v -> {
Intent intent = new Intent(this, MenuActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
});
controleur = new FinPartieControleur(this);
btnMenu = findViewById(R.id.btnFinMenu);
btnMenu.setOnClickListener(controleur);
}
@Override
public void onBackPressed() {
retourMenu();
}
public void retourMenu() {
Intent intent = new Intent(this, MenuActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
@@ -0,0 +1,25 @@
package sae.chuzzle;
import android.app.Activity;
import android.view.View;
/**
* Contrôleur pour l'écran de fin de partie.
* Gère les interactions utilisateur
*/
public class FinPartieControleur implements View.OnClickListener {
private final Activity activity;
public FinPartieControleur(Activity activity) {
this.activity = activity;
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btnFinMenu) {
((FinPartieActivity) activity).retourMenu();
}
}
}
@@ -11,6 +11,7 @@ import java.util.Random;
public class GestionnaireObjectifs {
private final Random random;
private int nbObjectifsRealises = 0;
private int nbCles = 0;
public GestionnaireObjectifs(long graine) {
@@ -54,8 +55,31 @@ public class GestionnaireObjectifs {
}
public void incrementerReussites() {
nbObjectifsRealises++;
// 1 clé gagnée tous les 2 objectifs réussis, maximum 1 clés en stock
if (nbObjectifsRealises % 2 == 0) {
ajouterCle();
}
}
public int getNbCles() {
return nbCles;
}
public void ajouterCle() {
// Ajoute une clé maximum 1 en stock
nbCles = Math.min(nbCles + 1, 1);
}
/**
* Consomme 1 clé pour réinitialiser l'objectif.
*/
public boolean consommerCles() {
if (nbCles >= 1) {
nbCles -= 1;
return true;
}
return false;
}
public int getNbObjectifsRealises() {
@@ -65,11 +89,13 @@ public class GestionnaireObjectifs {
public void sauvegarder(Bundle out) {
out.putInt("nb_objectifs_total", nbObjectifsRealises);
out.putInt("nb_cles", nbCles);
}
public void restaurer(Bundle in) {
if (in != null) {
nbObjectifsRealises = in.getInt("nb_objectifs_total", 0);
nbCles = in.getInt("nb_cles", 0);
}
}
}
+1 -1
View File
@@ -8,7 +8,7 @@ import android.os.Bundle;
public class Objectif {
private final int couleur; // Index de la couleur cible (0-6)
private final int nbSeriesCible; // Nombre de séries à réaliser
private final int nbCoupsMax; // Limite de coups initiale
private final int nbCoupsMax; // Limite de coups à faire
private final int poids; // Probabilité d'apparition (poids pour le tirage)
private int seriesRealisees = 0;
+1 -1
View File
@@ -60,7 +60,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="🗝️ Clés : 0"
android:text="🗝️ Clés : 0 (Max 1)"
android:textColor="#E2C94E"
android:textSize="14sp"/>
+13 -2
View File
@@ -3,7 +3,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="48dp"
android:padding="32dp"
android:background="#1A1A2E">
<TextView
@@ -14,7 +14,7 @@
android:textStyle="bold"
android:textColor="#E94560"
android:gravity="center"
android:layout_marginBottom="64dp"/>
android:layout_marginBottom="32dp"/>
<LinearLayout
android:layout_width="match_parent"
@@ -43,6 +43,17 @@
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="En mode difficile, vous devez remplir des objectifs avant la fin d'un nombre indiqué de coups. \n\ \n\2 Objectifs réussis vous rapporte une Clé 🗝️. \n\4 Coups réussis vous rapporte une Clé 🗝️.\n\ \n\Cette clé vous permet de changer votre objectif si vous êtes bloqué. Attention, vous ne pouvez en porter qu'une seule à la fois !"
android:textColor="#AAAACC"
android:textSize="14sp"
android:background="#16213E"
android:padding="16dp"
android:lineSpacingExtra="4dp" />
<Button
android:id="@+id/btnBack"
android:layout_width="wrap_content"