feat: multidoku rendu seems to work
This commit is contained in:
31
app/src/main/java/sudoku/ContrainteCasePartagee.java
Normal file
31
app/src/main/java/sudoku/ContrainteCasePartagee.java
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package sudoku;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class ContrainteCasePartagee implements Contrainte {
|
||||||
|
private Set<Case> casesLiees;
|
||||||
|
|
||||||
|
public ContrainteCasePartagee(Collection<Case> cases) {
|
||||||
|
this.casesLiees = new HashSet<>(cases);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean estRespectee(Grille grille, Case caseActuelle) {
|
||||||
|
if (!casesLiees.contains(caseActuelle))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
Symbole reference = null;
|
||||||
|
for (Case c : casesLiees) {
|
||||||
|
if (c.getSymbole() == null)
|
||||||
|
continue;
|
||||||
|
if (reference == null) {
|
||||||
|
reference = c.getSymbole();
|
||||||
|
} else if (!c.getSymbole().equals(reference)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
118
app/src/main/java/sudoku/Multidoku.java
Normal file
118
app/src/main/java/sudoku/Multidoku.java
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
package sudoku;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Multidoku {
|
||||||
|
private List<Sudoku> sudokus;
|
||||||
|
private List<SudokuPlacement> placements = new ArrayList<>();
|
||||||
|
private List<List<Case>> casesPartagees;
|
||||||
|
private List<Contrainte> contraintesPartagees;
|
||||||
|
|
||||||
|
// Pour cet exemple, nous allons associer à chaque sudoku un offset [offsetY,
|
||||||
|
// offsetX].
|
||||||
|
// Par exemple, le premier sudoku est affiché à (0,0) et le second à (ligne,
|
||||||
|
// colonne) donnée.
|
||||||
|
|
||||||
|
public Multidoku() {
|
||||||
|
this.sudokus = new ArrayList<>();
|
||||||
|
this.casesPartagees = new ArrayList<>();
|
||||||
|
this.contraintesPartagees = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ajouterSudoku(Sudoku sudoku, int offsetLigne, int offsetColonne) {
|
||||||
|
placements.add(new SudokuPlacement(sudoku, offsetLigne, offsetColonne));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Méthode d’affichage combiné
|
||||||
|
public String toStringCombined() {
|
||||||
|
// 1. Déterminer la taille globale de l’affichage
|
||||||
|
int maxLigne = 0, maxColonne = 0;
|
||||||
|
for (SudokuPlacement sp : placements) {
|
||||||
|
int taille = sp.getSudoku().getGrille().getTaille();
|
||||||
|
maxLigne = Math.max(maxLigne, sp.getOffsetLigne() + taille);
|
||||||
|
maxColonne = Math.max(maxColonne, sp.getOffsetColonne() + taille);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Créer une matrice globale et l'initialiser (ici avec "-" pour une case
|
||||||
|
// vide)
|
||||||
|
String[][] global = new String[maxLigne][maxColonne];
|
||||||
|
for (int i = 0; i < maxLigne; i++) {
|
||||||
|
for (int j = 0; j < maxColonne; j++) {
|
||||||
|
global[i][j] = " "; // ou " " selon votre choix
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Pour chaque sudoku, placer l’affichage de ses cases dans la grille globale
|
||||||
|
for (SudokuPlacement sp : placements) {
|
||||||
|
Grille grille = sp.getSudoku().getGrille();
|
||||||
|
int taille = grille.getTaille();
|
||||||
|
for (int i = 0; i < taille; i++) {
|
||||||
|
for (int j = 0; j < taille; j++) {
|
||||||
|
// Calcul des coordonnées globales
|
||||||
|
int globalLigne = sp.getOffsetLigne() + i;
|
||||||
|
int globalColonne = sp.getOffsetColonne() + j;
|
||||||
|
// Ici, on récupère la représentation de la case via toString (possiblement avec
|
||||||
|
// la couleur)
|
||||||
|
global[globalLigne][globalColonne] = grille.getCase(i, j).toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. Construire la chaîne finale d’affichage ligne par ligne
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0; i < maxLigne; i++) {
|
||||||
|
for (int j = 0; j < maxColonne; j++) {
|
||||||
|
sb.append(global[i][j]).append(" ");
|
||||||
|
}
|
||||||
|
sb.append("\n");
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ajouterCasesPartagees(List<Case> cases) {
|
||||||
|
casesPartagees.add(new ArrayList<>(cases));
|
||||||
|
ajouterContraintePartagee(new ContrainteCasePartagee(cases));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ajouterContraintePartagee(Contrainte contrainte) {
|
||||||
|
contraintesPartagees.add(contrainte);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean verifierContraintesPartagees() {
|
||||||
|
return contraintesPartagees.stream()
|
||||||
|
.allMatch(c -> c.estRespectee(null, null)); // Adaptation nécessaire selon votre logique
|
||||||
|
}
|
||||||
|
|
||||||
|
// Classe interne pour la contrainte de cases partagées
|
||||||
|
public static class ContrainteCasePartagee implements Contrainte {
|
||||||
|
private List<Case> casesLiees;
|
||||||
|
|
||||||
|
public ContrainteCasePartagee(List<Case> cases) {
|
||||||
|
this.casesLiees = new ArrayList<>(cases);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean estRespectee(Grille grille, Case caseActuelle) {
|
||||||
|
Symbole reference = null;
|
||||||
|
for (Case c : casesLiees) {
|
||||||
|
if (c.getSymbole() != null) {
|
||||||
|
if (reference == null) {
|
||||||
|
reference = c.getSymbole();
|
||||||
|
} else if (!c.getSymbole().equals(reference)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Sudoku> getSudokus() {
|
||||||
|
return sudokus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<List<Case>> getCasesPartagees() {
|
||||||
|
return casesPartagees;
|
||||||
|
}
|
||||||
|
}
|
||||||
25
app/src/main/java/sudoku/SudokuPlacement.java
Normal file
25
app/src/main/java/sudoku/SudokuPlacement.java
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package sudoku;
|
||||||
|
|
||||||
|
public class SudokuPlacement {
|
||||||
|
private Sudoku sudoku;
|
||||||
|
private int offsetLigne;
|
||||||
|
private int offsetColonne;
|
||||||
|
|
||||||
|
public SudokuPlacement(Sudoku sudoku, int offsetLigne, int offsetColonne) {
|
||||||
|
this.sudoku = sudoku;
|
||||||
|
this.offsetLigne = offsetLigne;
|
||||||
|
this.offsetColonne = offsetColonne;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Sudoku getSudoku() {
|
||||||
|
return sudoku;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getOffsetLigne() {
|
||||||
|
return offsetLigne;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getOffsetColonne() {
|
||||||
|
return offsetColonne;
|
||||||
|
}
|
||||||
|
}
|
||||||
54
app/src/test/java/sudoku/TestMultidoku.java
Normal file
54
app/src/test/java/sudoku/TestMultidoku.java
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package sudoku;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class TestMultidoku {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultidoku() {
|
||||||
|
Multidoku multidoku = new Multidoku();
|
||||||
|
Sudoku s1 = new Sudoku(9);
|
||||||
|
Sudoku s2 = new Sudoku(9);
|
||||||
|
|
||||||
|
// Placer sudoku1 en haut à gauche (offset (0,0))
|
||||||
|
multidoku.ajouterSudoku(s1, 0, 0);
|
||||||
|
// Placer sudoku2 de façon à ce que sa case (0,0) se retrouve en (8,8) de la
|
||||||
|
// grille globale
|
||||||
|
multidoku.ajouterSudoku(s2, 8, 8);
|
||||||
|
|
||||||
|
// Créer un lien entre la case (8,8) de s1 et (0,0) de s2
|
||||||
|
List<Case> casesPartagees = Arrays.asList(
|
||||||
|
s1.getGrille().getCase(8, 8),
|
||||||
|
s2.getGrille().getCase(0, 0));
|
||||||
|
multidoku.ajouterCasesPartagees(casesPartagees);
|
||||||
|
|
||||||
|
ArrayList<Symbole> symboles = new ArrayList<>();
|
||||||
|
for (int i = 1; i <= 9; i++) {
|
||||||
|
symboles.add(Symbole.of(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
s1.getGrille().setSymbolesPossibles(symboles);
|
||||||
|
List<Sudoku> sudokus = Arrays.asList(s1, s2);
|
||||||
|
for (Sudoku sudoku : sudokus) {
|
||||||
|
sudoku.getGrille().setSymbolesPossibles(symboles);
|
||||||
|
sudoku.ajouterContrainte(new ContrainteLigne());
|
||||||
|
sudoku.ajouterContrainte(new ContrainteColonne());
|
||||||
|
sudoku.ajouterContrainte(new ContrainteBloc());
|
||||||
|
sudoku.getGrille().creerBlocCarre();
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("Sudoku 1 :");
|
||||||
|
System.out.println(s1.getGrille().toString());
|
||||||
|
|
||||||
|
System.out.println("Sudoku 2 :");
|
||||||
|
System.out.println(s2.getGrille().toString());
|
||||||
|
|
||||||
|
System.out.println("\nAffichage Multidoku combiné :");
|
||||||
|
// TODO: Afficher le Multidoku combiné
|
||||||
|
System.out.println(multidoku.toStringCombined());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user