Réorganisation du dossier
@@ -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
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Real Chuzzle
|
||||||
@@ -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>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CompilerConfiguration">
|
||||||
|
<bytecodeTargetLevel target="21" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/build
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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 |