codeComplet

This commit is contained in:
Adrien DICK 2024-05-03 13:01:10 +02:00
parent 7435b4c329
commit 4fe2351763
14 changed files with 106 additions and 64 deletions

Binary file not shown.

View File

@ -1,9 +0,0 @@
000095004
530408702
000700603
900034080
040010070
020570006
409002000
607903021
200650000

View File

@ -1,9 +0,0 @@
062500090
100029000
059008602
047190300
906302104
001087920
604800510
000940007
090001480

View File

@ -1,9 +0,0 @@
062506090
100029000
059008602
047190300
906302104
001087920
604800510
000940007
090001480

View File

@ -1,9 +0,0 @@
010400005
460007000
057020001
000610000
801000509
000035000
300060950
000500048
700004010

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@
-q<╕╜▒Ь5T^u:0&и°╪вВl^▒)/a ╪)T

View File

@ -1 +0,0 @@
grille 2 et 4 : https://la-conjugaison.nouvelobs.com/sudoku/

View File

@ -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.");
}
}
}
}

View File

@ -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.");
}

View File

@ -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;
}
}

View File

@ -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);
}
}
}

View File

@ -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.");
}
}