Réorganisation du dossier

This commit is contained in:
2026-03-29 18:17:36 +02:00
parent 75650d7062
commit 8283bc0475
69 changed files with 1423 additions and 1035 deletions
+15 -1
View File
@@ -1 +1,15 @@
/build *.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
+3
View File
@@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml
Generated
+1
View File
@@ -0,0 +1 @@
Real Chuzzle
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
</component>
</project>
+26
View File
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2026-03-27T18:49:55.757608200Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="LocalEmulator" identifier="path=C:\Users\tayzi\.android\avd\Medium_Phone.avd" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection>
<targets>
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="LocalEmulator" identifier="path=C:\Users\tayzi\.android\avd\Medium_Phone.avd" />
</handle>
</Target>
</targets>
</DialogSelection>
</SelectionState>
</selectionStates>
</component>
</project>
+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeviceTable">
<option name="columnSorters">
<list>
<ColumnSorterState>
<option name="column" value="Name" />
<option name="order" value="ASCENDING" />
</ColumnSorterState>
</list>
</option>
</component>
</project>
+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>
+10
View File
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>
+9
View File
@@ -0,0 +1,9 @@
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
+17
View File
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>
+1
View File
@@ -0,0 +1 @@
/build
+42
View File
@@ -0,0 +1,42 @@
plugins {
alias(libs.plugins.android.application)
}
android {
namespace = "sae.chuzzle"
compileSdk {
version = release(36)
}
defaultConfig {
applicationId = "sae.chuzzle"
minSdk = 24
targetSdk = 36
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
dependencies {
implementation(libs.activity)
testImplementation(libs.junit)
androidTestImplementation(libs.ext.junit)
androidTestImplementation(libs.espresso.core)
}
View File
@@ -1,41 +1,41 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="sae.chuzzle"> package="sae.chuzzle">
<application <application
android:allowBackup="true" android:allowBackup="true"
android:label="Chuzzle" android:label="Chuzzle"
android:theme="@android:style/Theme.Light.NoTitleBar"> android:theme="@android:style/Theme.Light.NoTitleBar">
<!-- Point d'entrée : le menu principal --> <!-- Point d'entrée : le menu principal -->
<activity android:name=".MenuActivity" <activity android:name=".MenuActivity"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter> </intent-filter>
</activity> </activity>
<!-- Partie avec graine : retour arrière = MenuActivity --> <!-- Partie avec graine : retour arrière = MenuActivity -->
<activity <activity
android:name=".SeedActivity" android:name=".SeedActivity"
android:parentActivityName=".MenuActivity"/> android:parentActivityName=".MenuActivity"/>
<!-- Options : retour arrière = MenuActivity --> <!-- Options : retour arrière = MenuActivity -->
<activity <activity
android:name=".OptionsActivity" android:name=".OptionsActivity"
android:parentActivityName=".MenuActivity"/> android:parentActivityName=".MenuActivity"/>
<!-- Jeu : retour arrière = MenuActivity --> <!-- Jeu : retour arrière = MenuActivity -->
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:parentActivityName=".MenuActivity"/> android:parentActivityName=".MenuActivity"/>
<!-- Fin de partie : retour arrière = MenuActivity --> <!-- Fin de partie : retour arrière = MenuActivity -->
<activity <activity
android:name=".FinPartieActivity" android:name=".FinPartieActivity"
android:parentActivityName=".MenuActivity"/> android:parentActivityName=".MenuActivity"/>
</application> </application>
</manifest> </manifest>
@@ -1,209 +1,209 @@
package sae.chuzzle; package sae.chuzzle;
import android.app.Activity; import android.app.Activity;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
public class Controleur { public class Controleur {
private final Activity activite; private final Activity activite;
private final EtatJeu etatJeu; private final EtatJeu etatJeu;
private final VueGrille vueGrille; private final VueGrille vueGrille;
private final long graine; private final long graine;
private final TextView tvScore; private final TextView tvScore;
private final TextView tvCoups; private final TextView tvCoups;
// Hard Mode logic // Hard Mode logic
private final boolean hardMode; private final boolean hardMode;
private GestionnaireObjectifs gestionnaireObjectifs; private GestionnaireObjectifs gestionnaireObjectifs;
private Objectif objectifActuel; private Objectif objectifActuel;
private TextView tvObjectif; private TextView tvObjectif;
private TextView tvNbObjectifs; private TextView tvNbObjectifs;
private TextView tvCles; private TextView tvCles;
private Button btnReinitialisationObjectif; private Button btnReinitialisationObjectif;
private View layoutCles; private View layoutCles;
public Controleur(Activity activite, EtatJeu etatJeu, VueGrille vueGrille, public Controleur(Activity activite, EtatJeu etatJeu, VueGrille vueGrille,
long graine, TextView tvScore, TextView tvCoups, long graine, TextView tvScore, TextView tvCoups,
boolean hardMode) { boolean hardMode) {
this.activite = activite; this.activite = activite;
this.etatJeu = etatJeu; this.etatJeu = etatJeu;
this.vueGrille = vueGrille; this.vueGrille = vueGrille;
this.graine = graine; this.graine = graine;
this.tvScore = tvScore; this.tvScore = tvScore;
this.tvCoups = tvCoups; this.tvCoups = tvCoups;
this.hardMode = hardMode; this.hardMode = hardMode;
if (hardMode) { if (hardMode) {
this.gestionnaireObjectifs = new GestionnaireObjectifs(graine); this.gestionnaireObjectifs = new GestionnaireObjectifs(graine);
this.tvObjectif = activite.findViewById(R.id.tvObjectif); this.tvObjectif = activite.findViewById(R.id.tvObjectif);
this.tvNbObjectifs = activite.findViewById(R.id.tvNbObjectifs); this.tvNbObjectifs = activite.findViewById(R.id.tvNbObjectifs);
this.tvCles = activite.findViewById(R.id.tvCles); this.tvCles = activite.findViewById(R.id.tvCles);
this.layoutCles = activite.findViewById(R.id.layoutCles); this.layoutCles = activite.findViewById(R.id.layoutCles);
this.btnReinitialisationObjectif = activite.findViewById(R.id.btnReinitialisationObjectif); this.btnReinitialisationObjectif = activite.findViewById(R.id.btnReinitialisationObjectif);
if (tvObjectif != null) tvObjectif.setVisibility(View.VISIBLE); if (tvObjectif != null) tvObjectif.setVisibility(View.VISIBLE);
if (tvNbObjectifs != null) tvNbObjectifs.setVisibility(View.VISIBLE); if (tvNbObjectifs != null) tvNbObjectifs.setVisibility(View.VISIBLE);
if (layoutCles != null) layoutCles.setVisibility(View.VISIBLE); if (layoutCles != null) layoutCles.setVisibility(View.VISIBLE);
if (btnReinitialisationObjectif != null) { if (btnReinitialisationObjectif != null) {
btnReinitialisationObjectif.setOnClickListener(v -> reinitialiserObjectif()); btnReinitialisationObjectif.setOnClickListener(v -> reinitialiserObjectif());
} }
} }
rafraichirAffichage(); rafraichirAffichage();
} }
/** /**
* Initialise l'objectif au début de la partie ou lors de la restauration. * Initialise l'objectif au début de la partie ou lors de la restauration.
*/ */
public void initialiserObjectif(Bundle savedState) { public void initialiserObjectif(Bundle savedState) {
if (!hardMode) return; if (!hardMode) return;
gestionnaireObjectifs.restaurer(savedState); gestionnaireObjectifs.restaurer(savedState);
objectifActuel = Objectif.restaurer(savedState); objectifActuel = Objectif.restaurer(savedState);
if (objectifActuel == null) { if (objectifActuel == null) {
objectifActuel = gestionnaireObjectifs.genererObjectif(); objectifActuel = gestionnaireObjectifs.genererObjectif();
} }
rafraichirAffichage(); rafraichirAffichage();
} }
/** /**
* Gère la validation d'un coup réussi (mise à jour objectif, score, affichage). * 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. * Centralise la logique pour être appelé par le bouton ET par le tactile.
*/ */
public void gererFinDeCoup() { public void gererFinDeCoup() {
// 1 clé tous les 5 coups // 1 clé tous les 5 coups
if (hardMode && etatJeu.obtenirNbCoups() % 5 == 0) { if (hardMode && etatJeu.obtenirNbCoups() % 5 == 0) {
gestionnaireObjectifs.ajouterCle(); gestionnaireObjectifs.ajouterCle();
} }
// --- Logique Hard Mode // --- Logique Hard Mode
if (hardMode && objectifActuel != null) { if (hardMode && objectifActuel != null) {
// 1. Décrémenter les coups de l'objectif // 1. Décrémenter les coups de l'objectif
objectifActuel.decrementerCoups(); objectifActuel.decrementerCoups();
// 2. Compter les séries de la couleur cible // 2. Compter les séries de la couleur cible
int[] series = etatJeu.getSeriesParCouleurDernierCoup(); int[] series = etatJeu.getSeriesParCouleurDernierCoup();
objectifActuel.ajouterSeries(series[objectifActuel.getCouleur()]); objectifActuel.ajouterSeries(series[objectifActuel.getCouleur()]);
// 3. Vérifier réussite ou échec // 3. Vérifier réussite ou échec
if (objectifActuel.estReussi()) { if (objectifActuel.estReussi()) {
gestionnaireObjectifs.incrementerReussites(); gestionnaireObjectifs.incrementerReussites();
objectifActuel = gestionnaireObjectifs.genererObjectif(); objectifActuel = gestionnaireObjectifs.genererObjectif();
} else if (objectifActuel.estEchoue()) { } 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.makeText(activite, "Objectif échoué !",
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show(); ).show();
etatJeu.forcerFinDePartie(); etatJeu.forcerFinDePartie();
} }
} }
rafraichirAffichage(); rafraichirAffichage();
verifierFinDePartie(); verifierFinDePartie();
} }
/** /**
* Tente de réinitialiser l'objectif en cours en consommant 3 clés. * Tente de réinitialiser l'objectif en cours en consommant 3 clés.
* Affiche un Toast si le joueur n'a pas assez de clés. * Affiche un Toast si le joueur n'a pas assez de clés.
*/ */
public void reinitialiserObjectif() { public void reinitialiserObjectif() {
if (!hardMode || gestionnaireObjectifs == null) return; if (!hardMode || gestionnaireObjectifs == null) return;
if (gestionnaireObjectifs.consommerCles()) { if (gestionnaireObjectifs.consommerCles()) {
objectifActuel = gestionnaireObjectifs.genererObjectif(); objectifActuel = gestionnaireObjectifs.genererObjectif();
rafraichirAffichage(); rafraichirAffichage();
} else { } else {
Toast.makeText(activite, "Pas assez de clés !", Toast.LENGTH_SHORT).show(); Toast.makeText(activite, "Pas assez de clés !", Toast.LENGTH_SHORT).show();
} }
} }
/** /**
* Lancer l'écran de fin. * Lancer l'écran de fin.
*/ */
public void verifierFinDePartie() { public void verifierFinDePartie() {
int nbARetenir; int nbARetenir;
if (hardMode) { if (hardMode) {
nbARetenir = gestionnaireObjectifs.getNbObjectifsRealises(); nbARetenir = gestionnaireObjectifs.getNbObjectifsRealises();
} else { } else {
nbARetenir = 0; nbARetenir = 0;
} }
String description; String description;
if (hardMode == true && objectifActuel != null) { if (hardMode == true && objectifActuel != null) {
description = objectifActuel.getDescription(); description = objectifActuel.getDescription();
} else { } else {
description = null; description = null;
} }
if (etatJeu.estTerminee()) { if (etatJeu.estTerminee()) {
FinPartieActivity.demarrer( FinPartieActivity.demarrer(
activite, activite,
etatJeu.obtenirScore(), etatJeu.obtenirScore(),
etatJeu.obtenirNbCoups(), etatJeu.obtenirNbCoups(),
graine, graine,
nbARetenir, nbARetenir,
description, description,
etatJeu.obtenirGrille(), etatJeu.obtenirGrille(),
etatJeu.obtenirVerrous() etatJeu.obtenirVerrous()
); );
} }
} }
public void rafraichirAffichage() { public void rafraichirAffichage() {
tvScore.setText("Score : " + etatJeu.obtenirScore()); tvScore.setText("Score : " + etatJeu.obtenirScore());
tvCoups.setText("Coups : " + etatJeu.obtenirNbCoups()); tvCoups.setText("Coups : " + etatJeu.obtenirNbCoups());
vueGrille.definirGrille(etatJeu.obtenirGrille()); vueGrille.definirGrille(etatJeu.obtenirGrille());
vueGrille.definirVerrous(etatJeu.obtenirVerrous()); vueGrille.definirVerrous(etatJeu.obtenirVerrous());
if (hardMode && objectifActuel != null) { if (hardMode && objectifActuel != null) {
if (tvObjectif != null){ if (tvObjectif != null){
tvObjectif.setText(objectifActuel.getDescription()); tvObjectif.setText(objectifActuel.getDescription());
} }
if (tvNbObjectifs != null){ if (tvNbObjectifs != null){
tvNbObjectifs.setText("Objectifs réussis : " + gestionnaireObjectifs.getNbObjectifsRealises()); tvNbObjectifs.setText("Objectifs réussis : " + gestionnaireObjectifs.getNbObjectifsRealises());
} }
int nbCles = gestionnaireObjectifs.getNbCles(); int nbCles = gestionnaireObjectifs.getNbCles();
if (tvCles != null) { if (tvCles != null) {
tvCles.setText("🗝️ Clés : " + nbCles + " (Max 1)"); tvCles.setText("🗝️ Clés : " + nbCles + " (Max 1)");
} }
if (btnReinitialisationObjectif != null) { if (btnReinitialisationObjectif != null) {
// Grisé si 0 clé // Grisé si 0 clé
float alpha; float alpha;
if (nbCles >= 1) { if (nbCles >= 1) {
alpha = 1f; // visible alpha = 1f; // visible
} else { } else {
alpha = 0.4f; // grisé alpha = 0.4f; // grisé
} }
btnReinitialisationObjectif.setAlpha(alpha); btnReinitialisationObjectif.setAlpha(alpha);
} }
} }
} }
public void sauvegarderEtat(Bundle out) { public void sauvegarderEtat(Bundle out) {
if (hardMode) { if (hardMode) {
gestionnaireObjectifs.sauvegarder(out); gestionnaireObjectifs.sauvegarder(out);
if (objectifActuel != null) { if (objectifActuel != null) {
objectifActuel.sauvegarder(out); objectifActuel.sauvegarder(out);
} }
} }
} }
} }
File diff suppressed because it is too large Load Diff
@@ -1,102 +1,102 @@
package sae.chuzzle; package sae.chuzzle;
import android.os.Bundle; import android.os.Bundle;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
/** /**
* Gère la génération aléatoire et le comptage des objectifs. * Gère la génération aléatoire et le comptage des objectifs.
*/ */
public class GestionnaireObjectifs { public class GestionnaireObjectifs {
private final Random random; private final Random random;
private int nbObjectifsRealises = 0; private int nbObjectifsRealises = 0;
private int nbCles = 0; private int nbCles = 0;
public GestionnaireObjectifs(long graine) { public GestionnaireObjectifs(long graine) {
this.random = new Random(graine); this.random = new Random(graine);
} }
/** /**
* Génère un nouvel objectif en respectant les probabilités de difficulté. * Génère un nouvel objectif en respectant les probabilités de difficulté.
*/ */
public Objectif genererObjectif() { public Objectif genererObjectif() {
List<Objectif> pool = new ArrayList<>(); List<Objectif> pool = new ArrayList<>();
int totalPoids = 0; int totalPoids = 0;
// M (nbCoupsMax) entre 2 et 5. // M (nbCoupsMax) entre 2 et 5.
// N (nbSeriesCible) tel que M - N >= 1 et N <= 3. // N (nbSeriesCible) tel que M - N >= 1 et N <= 3.
for (int m = 2; m <= 5; m++) { for (int m = 2; m <= 5; m++) {
for (int n = 1; n <= m - 1 && n <= 3; n++) { for (int n = 1; n <= m - 1 && n <= 3; n++) {
// Probabilité inversement proportionnelle à la facilité (M-N). // Probabilité inversement proportionnelle à la facilité (M-N).
// Plus (M-N) est petit, plus c'est dur. // Plus (M-N) est petit, plus c'est dur.
int diff = m - n; int diff = m - n;
int poids = diff * diff; // On utilise le carré pour accentuer la différence de probabilité int poids = diff * diff; // On utilise le carré pour accentuer la différence de probabilité
for (int color = 0; color < 7; color++) { for (int color = 0; color < 7; color++) {
pool.add(new Objectif(color, n, m, poids)); pool.add(new Objectif(color, n, m, poids));
totalPoids += poids; totalPoids += poids;
} }
} }
} }
if (totalPoids == 0) return null; if (totalPoids == 0) return null;
int tirage = random.nextInt(totalPoids); int tirage = random.nextInt(totalPoids);
int cumul = 0; int cumul = 0;
for (Objectif obj : pool) { for (Objectif obj : pool) {
cumul += obj.getPoids(); cumul += obj.getPoids();
if (tirage < cumul) { if (tirage < cumul) {
return new Objectif(obj.getCouleur(), obj.getNbSeriesCible(), obj.getNbCoupsMax(), obj.getPoids()); return new Objectif(obj.getCouleur(), obj.getNbSeriesCible(), obj.getNbCoupsMax(), obj.getPoids());
} }
} }
return pool.get(0); return pool.get(0);
} }
public void incrementerReussites() { public void incrementerReussites() {
nbObjectifsRealises++; nbObjectifsRealises++;
// 1 clé gagnée tous les 2 objectifs réussis, maximum 1 clés en stock // 1 clé gagnée tous les 2 objectifs réussis, maximum 1 clés en stock
if (nbObjectifsRealises % 2 == 0) { if (nbObjectifsRealises % 2 == 0) {
ajouterCle(); ajouterCle();
} }
} }
public int getNbCles() { public int getNbCles() {
return nbCles; return nbCles;
} }
public void ajouterCle() { public void ajouterCle() {
// Ajoute une clé maximum 1 en stock // Ajoute une clé maximum 1 en stock
nbCles = Math.min(nbCles + 1, 1); nbCles = Math.min(nbCles + 1, 1);
} }
/** /**
* Consomme 1 clé pour réinitialiser l'objectif. * Consomme 1 clé pour réinitialiser l'objectif.
*/ */
public boolean consommerCles() { public boolean consommerCles() {
if (nbCles >= 1) { if (nbCles >= 1) {
nbCles -= 1; nbCles -= 1;
return true; return true;
} }
return false; return false;
} }
public int getNbObjectifsRealises() { public int getNbObjectifsRealises() {
return nbObjectifsRealises; return nbObjectifsRealises;
} }
public void sauvegarder(Bundle out) { public void sauvegarder(Bundle out) {
out.putInt("nb_objectifs_total", nbObjectifsRealises); out.putInt("nb_objectifs_total", nbObjectifsRealises);
out.putInt("nb_cles", nbCles); out.putInt("nb_cles", nbCles);
} }
public void restaurer(Bundle in) { public void restaurer(Bundle in) {
if (in != null) { if (in != null) {
nbObjectifsRealises = in.getInt("nb_objectifs_total", 0); nbObjectifsRealises = in.getInt("nb_objectifs_total", 0);
nbCles = in.getInt("nb_cles", 0); nbCles = in.getInt("nb_cles", 0);
} }
} }
} }
@@ -1,108 +1,108 @@
package sae.chuzzle; package sae.chuzzle;
import android.os.Bundle; import android.os.Bundle;
/** /**
* Représente un objectif dynamique pour le mode Hard. * Représente un objectif dynamique pour le mode Hard.
*/ */
public class Objectif { public class Objectif {
private final int couleur; // Index de la couleur cible (0-6) private final int couleur; // Index de la couleur cible (0-6)
private final int nbSeriesCible; // Nombre de séries à réaliser private final int nbSeriesCible; // Nombre de séries à réaliser
private final int nbCoupsMax; // Limite de coups à faire private final int nbCoupsMax; // Limite de coups à faire
private final int poids; // Probabilité d'apparition (poids pour le tirage) private final int poids; // Probabilité d'apparition (poids pour le tirage)
private int seriesRealisees = 0; private int seriesRealisees = 0;
private int coupsRestants; private int coupsRestants;
public Objectif(int couleur, int nbSeries, int nbCoupsMax, int poids) { public Objectif(int couleur, int nbSeries, int nbCoupsMax, int poids) {
this.couleur = couleur; this.couleur = couleur;
this.nbSeriesCible = nbSeries; this.nbSeriesCible = nbSeries;
this.nbCoupsMax = nbCoupsMax; this.nbCoupsMax = nbCoupsMax;
this.coupsRestants = nbCoupsMax; this.coupsRestants = nbCoupsMax;
this.poids = poids; this.poids = poids;
} }
// Getters // Getters
public int getCouleur() { public int getCouleur() {
return couleur; return couleur;
} }
public int getNbSeriesCible() { public int getNbSeriesCible() {
return nbSeriesCible; return nbSeriesCible;
} }
public int getNbCoupsMax() { public int getNbCoupsMax() {
return nbCoupsMax; return nbCoupsMax;
} }
public int getCoupsRestants() { public int getCoupsRestants() {
return coupsRestants; return coupsRestants;
} }
public int getPoids() { public int getPoids() {
return poids; return poids;
} }
public void decrementerCoups() { public void decrementerCoups() {
if (coupsRestants > 0) coupsRestants--; if (coupsRestants > 0) coupsRestants--;
} }
public void ajouterSeries(int n) { public void ajouterSeries(int n) {
this.seriesRealisees += n; this.seriesRealisees += n;
} }
public boolean estReussi() { public boolean estReussi() {
return seriesRealisees >= nbSeriesCible; return seriesRealisees >= nbSeriesCible;
} }
public boolean estEchoue() { public boolean estEchoue() {
return coupsRestants <= 0 && !estReussi(); return coupsRestants <= 0 && !estReussi();
} }
public String getDescription() { public String getDescription() {
String nomCouleur = obtenirNomCouleur(couleur); String nomCouleur = obtenirNomCouleur(couleur);
return "Éclatez " + nbSeriesCible + " fois des Chuzzle " + nomCouleur + return "Éclatez " + nbSeriesCible + " fois des Chuzzle " + nomCouleur +
" en moins de " + nbCoupsMax + " coups (" + seriesRealisees + "/" + nbSeriesCible + " en moins de " + nbCoupsMax + " coups (" + seriesRealisees + "/" + nbSeriesCible +
").\nCoups restants : " + coupsRestants; ").\nCoups restants : " + coupsRestants;
} }
private String obtenirNomCouleur(int c) { private String obtenirNomCouleur(int c) {
switch (c) { switch (c) {
case 0: return "Gris"; case 0: return "Gris";
case 1: return "Rose"; case 1: return "Rose";
case 2: return "Vert"; case 2: return "Vert";
case 3: return "Bleu"; case 3: return "Bleu";
case 4: return "Jaune"; case 4: return "Jaune";
case 5: return "Orange"; case 5: return "Orange";
case 6: return "Rouge"; case 6: return "Rouge";
default: return "Inconnue"; default: return "Inconnue";
} }
} }
// Persistance pour la rotation d'écran // Persistance pour la rotation d'écran
public void sauvegarder(Bundle out) { public void sauvegarder(Bundle out) {
out.putInt("obj_couleur", couleur); out.putInt("obj_couleur", couleur);
out.putInt("obj_cible", nbSeriesCible); out.putInt("obj_cible", nbSeriesCible);
out.putInt("obj_max", nbCoupsMax); out.putInt("obj_max", nbCoupsMax);
out.putInt("obj_restants", coupsRestants); out.putInt("obj_restants", coupsRestants);
out.putInt("obj_realise", seriesRealisees); out.putInt("obj_realise", seriesRealisees);
out.putInt("obj_poids", poids); out.putInt("obj_poids", poids);
} }
public static Objectif restaurer(Bundle in) { public static Objectif restaurer(Bundle in) {
if (in == null || !in.containsKey("obj_couleur")) return null; if (in == null || !in.containsKey("obj_couleur")) return null;
Objectif obj = new Objectif( Objectif obj = new Objectif(
in.getInt("obj_couleur"), in.getInt("obj_couleur"),
in.getInt("obj_cible"), in.getInt("obj_cible"),
in.getInt("obj_max"), in.getInt("obj_max"),
in.getInt("obj_poids") in.getInt("obj_poids")
); );
obj.coupsRestants = in.getInt("obj_restants"); obj.coupsRestants = in.getInt("obj_restants");
obj.seriesRealisees = in.getInt("obj_realise"); obj.seriesRealisees = in.getInt("obj_realise");
return obj; return obj;
} }
} }
@@ -1,31 +1,31 @@
package sae.chuzzle; package sae.chuzzle;
import android.app.Activity; import android.app.Activity;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.widget.Button; import android.widget.Button;
import android.widget.CheckBox; import android.widget.CheckBox;
public class OptionsActivity extends Activity { public class OptionsActivity extends Activity {
private SharedPreferences prefs; private SharedPreferences prefs;
private CheckBox checkHard; private CheckBox checkHard;
private Button btnRetour; private Button btnRetour;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_options); setContentView(R.layout.activity_options);
prefs = getSharedPreferences("chuzzle_prefs", MODE_PRIVATE); prefs = getSharedPreferences("chuzzle_prefs", MODE_PRIVATE);
checkHard = findViewById(R.id.checkHard); checkHard = findViewById(R.id.checkHard);
btnRetour = findViewById(R.id.btnBack); btnRetour = findViewById(R.id.btnBack);
checkHard.setChecked(prefs.getBoolean("hard_mode", false)); checkHard.setChecked(prefs.getBoolean("hard_mode", false));
OptionsController controller = new OptionsController(this, prefs); OptionsController controller = new OptionsController(this, prefs);
checkHard.setOnCheckedChangeListener(controller); checkHard.setOnCheckedChangeListener(controller);
btnRetour.setOnClickListener(controller); btnRetour.setOnClickListener(controller);
} }
} }
@@ -1,65 +1,65 @@
package sae.chuzzle; package sae.chuzzle;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Toast; import android.widget.Toast;
public class SeedActivity extends Activity implements View.OnClickListener { public class SeedActivity extends Activity implements View.OnClickListener {
private EditText etGraine; private EditText etGraine;
private Button btnJouer; private Button btnJouer;
private Button btnRetour; private Button btnRetour;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_seed); setContentView(R.layout.activity_seed);
etGraine = findViewById(R.id.etGraine); etGraine = findViewById(R.id.etGraine);
btnJouer = findViewById(R.id.btnJouer); btnJouer = findViewById(R.id.btnJouer);
btnRetour = findViewById(R.id.btnBack); btnRetour = findViewById(R.id.btnBack);
btnRetour.setOnClickListener(this); btnRetour.setOnClickListener(this);
btnJouer.setOnClickListener(this); btnJouer.setOnClickListener(this);
} }
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (v == btnJouer) { if (v == btnJouer) {
lancerPartieAvecGraine(); lancerPartieAvecGraine();
} }
if (v == btnRetour) { if (v == btnRetour) {
Intent intent = new Intent(this, MenuActivity.class); Intent intent = new Intent(this, MenuActivity.class);
startActivity(intent); startActivity(intent);
} }
} }
private void lancerPartieAvecGraine() { private void lancerPartieAvecGraine() {
String texte = etGraine.getText().toString().trim(); String texte = etGraine.getText().toString().trim();
if (texte.isEmpty()) { if (texte.isEmpty()) {
Toast.makeText(this, "Veuillez entrer une graine.", Toast.makeText(this, "Veuillez entrer une graine.",
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show(); ).show();
return; return;
} }
long graine; long graine;
try { try {
graine = Long.parseLong(texte); graine = Long.parseLong(texte);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
graine = texte.hashCode(); graine = texte.hashCode();
} }
Intent intent = new Intent(this, MainActivity.class); Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("graine", graine); intent.putExtra("graine", graine);
startActivity(intent); startActivity(intent);
} }
} }

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Before

Width:  |  Height:  |  Size: 982 B

After

Width:  |  Height:  |  Size: 982 B

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Some files were not shown because too many files have changed in this diff Show More