From 4fe23517637bac09f1b57b4cdb26c139941a447b Mon Sep 17 00:00:00 2001 From: dick Date: Fri, 3 May 2024 13:01:10 +0200 Subject: [PATCH] codeComplet --- Grilles/GrilMakeTest | Bin 36 -> 0 bytes Grilles/Grille1 | 9 -------- Grilles/Grille2 | 9 -------- Grilles/Grille3-fausse | 9 -------- Grilles/Grille4-dur | 9 -------- Grilles/GrillesTest.gri | Bin 36 -> 0 bytes Grilles/TestGrille2 | Bin 36 -> 0 bytes Grilles/exemplecomplet.gri | 1 + Grilles/info.txt | 1 - src/AutomatiqueActionListener.java | 36 ++++++++++++++++++----------- src/CaseMouseListener.java | 30 +++++++++++++++++++----- src/GrillePainter.java | 20 +++++++++++++++- src/ManuelActionListener.java | 22 +++++++++++++----- src/SaisieGrille.java | 24 ++++++++++++++++++- 14 files changed, 106 insertions(+), 64 deletions(-) delete mode 100644 Grilles/GrilMakeTest delete mode 100644 Grilles/Grille1 delete mode 100644 Grilles/Grille2 delete mode 100644 Grilles/Grille3-fausse delete mode 100644 Grilles/Grille4-dur delete mode 100644 Grilles/GrillesTest.gri delete mode 100644 Grilles/TestGrille2 create mode 100644 Grilles/exemplecomplet.gri delete mode 100644 Grilles/info.txt diff --git a/Grilles/GrilMakeTest b/Grilles/GrilMakeTest deleted file mode 100644 index dee2404d85fa3eec87aa92ca3da6300aa58ddc52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36 ScmZQzU|?YS^`QYs;RFClN&;;F diff --git a/Grilles/Grille1 b/Grilles/Grille1 deleted file mode 100644 index a0527ea..0000000 --- a/Grilles/Grille1 +++ /dev/null @@ -1,9 +0,0 @@ -000095004 -530408702 -000700603 -900034080 -040010070 -020570006 -409002000 -607903021 -200650000 \ No newline at end of file diff --git a/Grilles/Grille2 b/Grilles/Grille2 deleted file mode 100644 index a0077de..0000000 --- a/Grilles/Grille2 +++ /dev/null @@ -1,9 +0,0 @@ -062500090 -100029000 -059008602 -047190300 -906302104 -001087920 -604800510 -000940007 -090001480 \ No newline at end of file diff --git a/Grilles/Grille3-fausse b/Grilles/Grille3-fausse deleted file mode 100644 index 98569bc..0000000 --- a/Grilles/Grille3-fausse +++ /dev/null @@ -1,9 +0,0 @@ -062506090 -100029000 -059008602 -047190300 -906302104 -001087920 -604800510 -000940007 -090001480 \ No newline at end of file diff --git a/Grilles/Grille4-dur b/Grilles/Grille4-dur deleted file mode 100644 index a149970..0000000 --- a/Grilles/Grille4-dur +++ /dev/null @@ -1,9 +0,0 @@ -010400005 -460007000 -057020001 -000610000 -801000509 -000035000 -300060950 -000500048 -700004010 \ No newline at end of file diff --git a/Grilles/GrillesTest.gri b/Grilles/GrillesTest.gri deleted file mode 100644 index 6ebe5a7d92ecde3ab226f51a8375ac8641aa1ba9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36 OcmZQzKnJA;=pq0MjsT_r diff --git a/Grilles/TestGrille2 b/Grilles/TestGrille2 deleted file mode 100644 index 5564bbad36b75c4d617ef7c6dca70a075da1c52a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36 RcmZQzfC8VS4KOA;4FDrd0bc+B diff --git a/Grilles/exemplecomplet.gri b/Grilles/exemplecomplet.gri new file mode 100644 index 0000000..93c0a8c --- /dev/null +++ b/Grilles/exemplecomplet.gri @@ -0,0 +1 @@ +-q<¦­‘ř5T^u:0&ÉśĽ×©÷l^‘)/a Ľ)T \ No newline at end of file diff --git a/Grilles/info.txt b/Grilles/info.txt deleted file mode 100644 index bf8397d..0000000 --- a/Grilles/info.txt +++ /dev/null @@ -1 +0,0 @@ -grille 2 et 4 : https://la-conjugaison.nouvelobs.com/sudoku/ \ No newline at end of file diff --git a/src/AutomatiqueActionListener.java b/src/AutomatiqueActionListener.java index 6164e25..4168113 100644 --- a/src/AutomatiqueActionListener.java +++ b/src/AutomatiqueActionListener.java @@ -1,7 +1,6 @@ - import javax.swing.*; import java.awt.event.*; - +import java.io.File; public class AutomatiqueActionListener implements ActionListener { private JFrame choixFrame; @@ -14,19 +13,30 @@ public class AutomatiqueActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { choixFrame.dispose(); - int[][] grille = GenerateurSudoku.genererGrille(); - System.out.println("Grille Sudoku gĂ©nĂ©rĂ©e avec succès."); + int[][] grille = new int[9][9]; // CrĂ©ation d'une grille vide - long startTime = System.nanoTime(); - if (Resolveur.resoudreSudoku(grille)) { - long endTime = System.nanoTime(); - long duration = (endTime - startTime) / 1000000; + // Ouverture du sĂ©lecteur de fichiers pour que l'utilisateur choisisse un fichier de grille + JFileChooser fileChooser = new JFileChooser(); + int returnValue = fileChooser.showOpenDialog(null); - FenetrePrincipale fenetrePrincipale = new FenetrePrincipale(); - fenetrePrincipale.afficher(true, grille); - JOptionPane.showMessageDialog(null, "Grille rĂ©solue avec succès en " + duration + " millisecondes !"); - } else { - JOptionPane.showMessageDialog(null, "Impossible de rĂ©soudre la grille."); + if (returnValue == JFileChooser.APPROVE_OPTION) { + File selectedFile = fileChooser.getSelectedFile(); + + // Lecture de la grille Ă  partir du fichier sĂ©lectionnĂ© + Lecteur.lecture(selectedFile, grille); + + // RĂ©solution du Sudoku + long startTime = System.nanoTime(); + if (Resolveur.resoudreSudoku(grille)) { + long endTime = System.nanoTime(); + long duration = (endTime - startTime) / 1000000; + + FenetrePrincipale fenetrePrincipale = new FenetrePrincipale(); + fenetrePrincipale.afficher(true, grille); + JOptionPane.showMessageDialog(null, "Grille rĂ©solue avec succès en " + duration + " millisecondes !"); + } else { + JOptionPane.showMessageDialog(null, "Impossible de rĂ©soudre la grille."); + } } } } diff --git a/src/CaseMouseListener.java b/src/CaseMouseListener.java index e9bb759..fc4a43a 100644 --- a/src/CaseMouseListener.java +++ b/src/CaseMouseListener.java @@ -31,6 +31,9 @@ public class CaseMouseListener extends MouseAdapter { if (panel.validerChiffre(panel.getLigneSelectionnee(), panel.getColonneSelectionnee(), valeur)) { panel.getGrille()[panel.getLigneSelectionnee()][panel.getColonneSelectionnee()] = valeur; panel.repaint(); + if (panel.grilleComplete()) { + panel.afficherBravo(); + } } else { JOptionPane.showMessageDialog(null, "Ce chiffre ne respecte pas les contraintes du Sudoku. Veuillez choisir un autre chiffre."); } @@ -54,17 +57,32 @@ public class CaseMouseListener extends MouseAdapter { if (incertainOption == JOptionPane.OK_OPTION) { // VĂ©rifier que les valeurs obligatoires sont remplies if (!incertainFields[0].getText().isEmpty() && !incertainFields[1].getText().isEmpty()) { - // RĂ©cupĂ©rer les valeurs incertaines saisies par le joueur - int valeursIncertaines = 0; + // VĂ©rifier que les valeurs incertaines sont valides + boolean valeursValides = true; for (int i = 0; i < 4; i++) { if (!incertainFields[i].getText().isEmpty()) { int valeur = Integer.parseInt(incertainFields[i].getText()); - valeursIncertaines |= (valeur << (i * 4)); + if (valeur < 1 || valeur > 9) { + valeursValides = false; + break; + } } } - // Mettre Ă  jour la grille avec les valeurs incertaines - panel.getGrille()[panel.getLigneSelectionnee()][panel.getColonneSelectionnee()] = valeursIncertaines; - panel.repaint(); + if (valeursValides) { + // RĂ©cupĂ©rer les valeurs incertaines saisies par le joueur + int valeursIncertaines = 0; + for (int i = 0; i < 4; i++) { + if (!incertainFields[i].getText().isEmpty()) { + int valeur = Integer.parseInt(incertainFields[i].getText()); + valeursIncertaines |= (valeur << (i * 4)); + } + } + // Mettre Ă  jour la grille avec les valeurs incertaines + panel.getGrille()[panel.getLigneSelectionnee()][panel.getColonneSelectionnee()] = valeursIncertaines; + panel.repaint(); + } else { + JOptionPane.showMessageDialog(null, "Les valeurs incertaines doivent ĂŞtre des nombres entre 1 et 9."); + } } else { JOptionPane.showMessageDialog(null, "Les deux premières valeurs incertaines sont obligatoires."); } diff --git a/src/GrillePainter.java b/src/GrillePainter.java index 9742d80..f60250f 100644 --- a/src/GrillePainter.java +++ b/src/GrillePainter.java @@ -19,11 +19,29 @@ public class GrillePainter { for (int j = 0; j < panel.getTailleGrille() * panel.getTailleRegion(); j++) { g.setColor(Color.BLACK); g.drawRect(j * panel.getTailleCellule(), i * panel.getTailleCellule(), panel.getTailleCellule(), panel.getTailleCellule()); + int valeur = panel.getGrille()[i][j]; if (valeur != 0) { - g.drawString(String.valueOf(valeur), j * panel.getTailleCellule() + panel.getTailleCellule() / 2, i * panel.getTailleCellule() + panel.getTailleCellule() / 2); + if (valeur < 10) { + g.drawString(String.valueOf(valeur), j * panel.getTailleCellule() + panel.getTailleCellule() / 2, i * panel.getTailleCellule() + panel.getTailleCellule() / 2); + } else { + int[] valeurs = decomposerValeurs(valeur); + for (int k = 0; k < valeurs.length; k++) { + int xOffset = (k % 2) * panel.getTailleCellule() / 2; + int yOffset = (k / 2) * panel.getTailleCellule() / 2; + g.drawString(String.valueOf(valeurs[k]), j * panel.getTailleCellule() + xOffset + panel.getTailleCellule() / 4, i * panel.getTailleCellule() + yOffset + panel.getTailleCellule() / 4); + } + } } } } } + + private static int[] decomposerValeurs(int valeursIncertaines) { + int[] valeurs = new int[4]; + for (int i = 0; i < 4; i++) { + valeurs[i] = (valeursIncertaines >> (i * 4)) & 0xF; + } + return valeurs; + } } diff --git a/src/ManuelActionListener.java b/src/ManuelActionListener.java index 2d21105..6342f73 100644 --- a/src/ManuelActionListener.java +++ b/src/ManuelActionListener.java @@ -1,7 +1,6 @@ - import javax.swing.*; import java.awt.event.*; - +import java.io.File; public class ManuelActionListener implements ActionListener { private JFrame choixFrame; @@ -14,10 +13,21 @@ public class ManuelActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { choixFrame.dispose(); - int[][] grille = GenerateurSudoku.genererGrille(); - System.out.println("Grille Sudoku gĂ©nĂ©rĂ©e avec succès."); + int[][] grille = new int[9][9]; // CrĂ©ation d'une grille vide - FenetrePrincipale fenetrePrincipale = new FenetrePrincipale(); - fenetrePrincipale.afficher(false, grille); + // Ouverture du sĂ©lecteur de fichiers pour que l'utilisateur choisisse un fichier de grille + JFileChooser fileChooser = new JFileChooser(); + int returnValue = fileChooser.showOpenDialog(null); + + if (returnValue == JFileChooser.APPROVE_OPTION) { + File selectedFile = fileChooser.getSelectedFile(); + + // Lecture de la grille Ă  partir du fichier sĂ©lectionnĂ© + Lecteur.lecture(selectedFile, grille); + + // Affichage de la grille dans la fenĂŞtre principale en mode manuel + FenetrePrincipale fenetrePrincipale = new FenetrePrincipale(); + fenetrePrincipale.afficher(false, grille); + } } } diff --git a/src/SaisieGrille.java b/src/SaisieGrille.java index 79b889f..0174b9c 100644 --- a/src/SaisieGrille.java +++ b/src/SaisieGrille.java @@ -92,6 +92,26 @@ public class SaisieGrille extends JPanel { } } + // VĂ©rifier les valeurs incertaines dans la cellule + int valeursIncertaines = grille[ligne][colonne]; + for (int i = 0; i < 4; i++) { + int valeur = (valeursIncertaines >> (i * 4)) & 0xF; + if (valeur != 0 && valeur == chiffre) { + return false; + } + } + + return true; + } + + public boolean grilleComplete() { + for (int i = 0; i < grille.length; i++) { + for (int j = 0; j < grille[i].length; j++) { + if (grille[i][j] == 0) { + return false; + } + } + } return true; } @@ -101,5 +121,7 @@ public class SaisieGrille extends JPanel { GrillePainter.dessinerGrille(g, this); } - + public void afficherBravo() { + JOptionPane.showMessageDialog(this, "Bravo ! La grille est complĂ©tĂ©e avec succès."); + } }