From a060cde5b27d50cc8ce62b764d02ec1ef5a49af2 Mon Sep 17 00:00:00 2001 From: Morph01 Date: Sun, 9 Feb 2025 10:09:32 +0100 Subject: [PATCH] feat: implement main menu for Sudoku and Multidoku selection (basic for multidoku) --- app/src/main/java/sudoku/App.java | 2 +- app/src/main/java/sudoku/Sudoku.java | 167 +++++++++++++++++++++++++++ 2 files changed, 168 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/sudoku/App.java b/app/src/main/java/sudoku/App.java index 5abc671..aead3f5 100644 --- a/app/src/main/java/sudoku/App.java +++ b/app/src/main/java/sudoku/App.java @@ -9,7 +9,7 @@ public class App { System.out.println(new App().getGreeting()); try{ - Sudoku.menuGrille(); + Sudoku.menu(); } catch (Exception e){ System.err.println("Une erreur fatale est survenue : " + e.getMessage()); e.printStackTrace(); diff --git a/app/src/main/java/sudoku/Sudoku.java b/app/src/main/java/sudoku/Sudoku.java index d67610a..5413e98 100644 --- a/app/src/main/java/sudoku/Sudoku.java +++ b/app/src/main/java/sudoku/Sudoku.java @@ -1,6 +1,7 @@ package sudoku; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Scanner; @@ -59,6 +60,172 @@ public class Sudoku { return grille; } + public static void menu() { + Scanner scanner = new Scanner(System.in); + System.out.println("BIENVENUE DANS LE JEU DE SUDOKU"); + + while (true) { + System.out.println("\nChoisissez le type de jeu :"); + System.out.println("1 : Sudoku classique"); + System.out.println("2 : Multidoku (prérempli)"); + System.out.println("0 : Quitter"); + + try { + int choix = Integer.parseInt(scanner.nextLine()); + + switch (choix) { + case 0: + System.out.println("Au revoir !"); + return; + case 1: + menuGrille(); + break; + case 2: + menuMultidoku(); + break; + default: + System.out.println("Choix invalide. Veuillez réessayer."); + } + } catch (NumberFormatException e) { + System.out.println("Entrée invalide. Veuillez entrer un nombre."); + } + } + } + + private static void menuMultidoku() { + final int PAUSE_TIME = 3000; // 3 seconds + + System.out.println("MULTIDOKU"); + System.out.println("\nChoisissez un type de Multidoku :"); + System.out.println("1 : Multidoku avec cases partagées"); + System.out.println("2 : Multidoku avec bloc partagé"); + System.out.println("3 : Multidoku avec ligne partagée"); + System.out.println("4 : Multidoku avec colonne partagée"); + + Scanner scanner = new Scanner(System.in); + try { + int choix = Integer.parseInt(scanner.nextLine()); + Multidoku multidoku = creerMultidoku(choix); + if (multidoku != null) { + System.out.println("\nMultidoku initial :"); + System.out.println(multidoku.toStringCombined()); + + System.out.println("\nDébut de la résolution dans 3 secondes..."); + try { + Thread.sleep(PAUSE_TIME); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + System.out.println("\nRésolution du Multidoku..."); + + if (multidoku.resoudreMultidoku(true)) { + System.out.println("\nMultidoku résolu :"); + System.out.println(multidoku.toStringCombined()); + } else { + System.out.println("Ce Multidoku n'a pas de solution."); + } + } + } catch (NumberFormatException e) { + System.out.println("Entrée invalide. Veuillez entrer un nombre."); + } + } + + private static Multidoku creerMultidoku(int type) { + Multidoku multidoku = new Multidoku(); + Sudoku s1 = new Sudoku(9); + Sudoku s2 = new Sudoku(9); + s1.setNom("Sudoku 1"); + s2.setNom("Sudoku 2"); + + // Configuration commune + ArrayList symboles = new ArrayList<>(); + for (int i = 1; i <= 9; i++) { + symboles.add(Symbole.of(i)); + } + + for (Sudoku s : Arrays.asList(s1, s2)) { + s.getGrille().setSymbolesPossibles(symboles); + s.ajouterContrainte(new ContrainteLigne()); + s.ajouterContrainte(new ContrainteColonne()); + s.ajouterContrainte(new ContrainteBloc()); + s.getGrille().creerBlocCarre(); + } + + switch (type) { + case 1: // Cases partagées + multidoku.ajouterSudoku(s1, 0, 0); + multidoku.ajouterSudoku(s2, 8, 8); + multidoku.ajouterCasesPartagees(Arrays.asList( + s1.getGrille().getCase(8, 8), + s2.getGrille().getCase(0, 0))); + break; + case 2: // Bloc partagé + multidoku.ajouterSudoku(s1, 0, 0); + multidoku.ajouterSudoku(s2, 6, 6); + List casesBloc = new ArrayList<>(); + for (int i = 6; i < 9; i++) { + for (int j = 6; j < 9; j++) { + casesBloc.add(s1.getGrille().getCase(i, j)); + } + } + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + casesBloc.add(s2.getGrille().getCase(i, j)); + } + } + multidoku.ajouterCasesPartagees(casesBloc); + break; + case 3: // Ligne partagée + multidoku.ajouterSudoku(s1, 0, 0); + multidoku.ajouterSudoku(s2, 8, 1); + multidoku.ajouterCasesPartagees(Arrays.asList(s1.getGrille().getCase(8, 1), + s1.getGrille().getCase(8, 2), + s1.getGrille().getCase(8, 3), + s1.getGrille().getCase(8, 4), + s1.getGrille().getCase(8, 5), + s1.getGrille().getCase(8, 6), + s1.getGrille().getCase(8, 7), + s1.getGrille().getCase(8, 8), + + s2.getGrille().getCase(0, 0), + s2.getGrille().getCase(0, 1), + s2.getGrille().getCase(0, 2), + s2.getGrille().getCase(0, 3), + s2.getGrille().getCase(0, 4), + s2.getGrille().getCase(0, 5), + s2.getGrille().getCase(0, 6), + s2.getGrille().getCase(0, 7))); + break; + case 4: // Colonne partagée + multidoku.ajouterSudoku(s1, 0, 0); + multidoku.ajouterSudoku(s2, 1, 8); + multidoku.ajouterCasesPartagees(Arrays.asList( + s1.getGrille().getCase(1, 8), + s1.getGrille().getCase(2, 8), + s1.getGrille().getCase(3, 8), + s1.getGrille().getCase(4, 8), + s1.getGrille().getCase(5, 8), + s1.getGrille().getCase(6, 8), + s1.getGrille().getCase(7, 8), + s1.getGrille().getCase(8, 8), + + s2.getGrille().getCase(0, 0), + s2.getGrille().getCase(1, 0), + s2.getGrille().getCase(2, 0), + s2.getGrille().getCase(3, 0), + s2.getGrille().getCase(4, 0), + s2.getGrille().getCase(5, 0), + s2.getGrille().getCase(6, 0), + s2.getGrille().getCase(7, 0))); + break; + default: + System.out.println("Type de Multidoku non valide"); + return null; + } + + return multidoku; + } + public static void menuGrille() { Scanner scanner = new Scanner(System.in); // ETAPE 1 : TAILLE GRILLE