Modification dans le EtatJeu dans la logique apres quelque bug

This commit is contained in:
2026-03-19 10:21:13 +01:00
parent dbaa0deba5
commit 21c64eb487
+123 -18
View File
@@ -1,5 +1,7 @@
package sae.chuzzle; package sae.chuzzle;
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;
@@ -50,6 +52,47 @@ public class EtatJeu {
return partieTerminee; return partieTerminee;
} }
// -
// SAUVEGARDE ET RESTAURATION
public void sauvegarderEtat(Bundle bundle) {
int[] flatGrille = new int[NB_LIGNES * NB_COLONNES];
boolean[] flatVerrous = new boolean[NB_LIGNES * NB_COLONNES];
for (int l = 0; l < NB_LIGNES; l++) {
for (int c = 0; c < NB_COLONNES; c++) {
flatGrille[l * NB_COLONNES + c] = grille[l][c];
flatVerrous[l * NB_COLONNES + c] = verrous[l][c];
}
}
bundle.putIntArray("grille", flatGrille);
bundle.putBooleanArray("verrous", flatVerrous);
bundle.putInt("score", score);
bundle.putInt("nbCoups", nbCoups);
bundle.putBoolean("partieTerminee", partieTerminee);
}
public void restaurerEtat(Bundle bundle) {
if (!bundle.containsKey("grille")) return;
int[] flatGrille = bundle.getIntArray("grille");
boolean[] flatVerrous = bundle.getBooleanArray("verrous");
if (flatGrille != null && flatVerrous != null) {
for (int l = 0; l < NB_LIGNES; l++) {
for (int c = 0; c < NB_COLONNES; c++) {
grille[l][c] = flatGrille[l * NB_COLONNES + c];
verrous[l][c] = flatVerrous[l * NB_COLONNES + c];
}
}
}
score = bundle.getInt("score");
nbCoups = bundle.getInt("nbCoups");
partieTerminee = bundle.getBoolean("partieTerminee");
}
public int obtenirCase(int ligne, int colonne) { public int obtenirCase(int ligne, int colonne) {
return grille[ligne][colonne]; return grille[ligne][colonne];
} }
@@ -152,7 +195,8 @@ public class EtatJeu {
return false; return false;
} }
if (hardMode && estBloque(estLigne, index)) { // Les verrous bloquent toujours, quel que soit le mode
if (estBloque(estLigne, index)) {
return false; return false;
} }
@@ -172,6 +216,8 @@ public class EtatJeu {
nbCoups++; nbCoups++;
score += resoudreEtRemplir(); score += resoudreEtRemplir();
// Verrou après chaque coup ; 2 verrous en hard mode (plus difficile)
ajouterVerrou();
if (hardMode) { if (hardMode) {
ajouterVerrou(); ajouterVerrou();
} }
@@ -250,16 +296,16 @@ public class EtatJeu {
public int resoudreEtRemplir() { public int resoudreEtRemplir() {
int pointsTotal = 0; int baseTotal = 0;
int vague = 0; int nbSeries = 0;
List<int[]> series = trouverSeries(); List<int[]> series = trouverSeries();
while (!series.isEmpty()) { while (!series.isEmpty()) {
int pointsBase = calculerPointsBase(series); // Accumuler les points de base et le nombre de séries sur toutes les vagues
double multiplicateur = 1.0 + vague * 0.5; baseTotal += calculerPointsBase(series);
pointsTotal += (int) (pointsBase * multiplicateur); nbSeries += compterNbSeries(series);
boolean[][] aSupprimer = new boolean[NB_LIGNES][NB_COLONNES]; boolean[][] aSupprimer = new boolean[NB_LIGNES][NB_COLONNES];
@@ -293,11 +339,14 @@ public class EtatJeu {
} }
} }
vague++;
series = trouverSeries(); series = trouverSeries();
} }
return pointsTotal; if (nbSeries == 0) return 0;
// Bonus : +50% par série supplémentaire après la première (spec SAÉ)
double bonus = 1.0 + (nbSeries - 1) * 0.5;
return (int) (baseTotal * bonus);
} }
private int calculerPointsBase(List<int[]> series) { private int calculerPointsBase(List<int[]> series) {
@@ -350,6 +399,58 @@ public class EtatJeu {
return total; return total;
} }
private int compterNbSeries(List<int[]> series) {
boolean[][] masque = new boolean[NB_LIGNES][NB_COLONNES];
for (int[] pos : series) {
masque[pos[0]][pos[1]] = true;
}
int count = 0;
// Séries horizontales
for (int l = 0; l < NB_LIGNES; l++) {
int c = 0;
while (c < NB_COLONNES) {
if (masque[l][c]) {
int fin = c + 1;
while (fin < NB_COLONNES && masque[l][fin]) {
fin++;
}
count++;
c = fin;
} else {
c++;
}
}
}
// Séries verticales
for (int col = 0; col < NB_COLONNES; col++) {
int l = 0;
while (l < NB_LIGNES) {
if (masque[l][col]) {
int fin = l + 1;
while (fin < NB_LIGNES && masque[fin][col]) {
fin++;
}
count++;
l = fin;
} else {
l++;
}
}
}
return count;
}
private int pointsPourLongueur(int longueur) { private int pointsPourLongueur(int longueur) {
if (longueur == 3) { if (longueur == 3) {
return 8; return 8;
@@ -424,27 +525,31 @@ public class EtatJeu {
public boolean aUnCoupValide() { public boolean aUnCoupValide() {
// Teste tous les décalages possibles (1 à N-1) pour les lignes
for (int i = 0; i < NB_LIGNES; i++) { for (int i = 0; i < NB_LIGNES; i++) {
if (coupCreeSerie(true, i, +1)) { for (int s = 1; s < NB_COLONNES; s++) {
return true; if (coupCreeSerie(true, i, s)) {
} return true;
if (coupCreeSerie(true, i, -1)) { }
return true;
} }
} }
// Teste tous les décalages possibles (1 à N-1) pour les colonnes
for (int j = 0; j < NB_COLONNES; j++) { for (int j = 0; j < NB_COLONNES; j++) {
if (coupCreeSerie(false, j, +1)) { for (int s = 1; s < NB_LIGNES; s++) {
return true; if (coupCreeSerie(false, j, s)) {
} return true;
if (coupCreeSerie(false, j, -1)) { }
return true;
} }
} }
return false; return false;
} }
public void forcerFinDePartie() {
this.partieTerminee = true;
}
private boolean coupCreeSerie(boolean estLigne, int index, int sens) { private boolean coupCreeSerie(boolean estLigne, int index, int sens) {
int[][] sauvegarde = copierGrille(); int[][] sauvegarde = copierGrille();