makefile
This commit is contained in:
32
src/AutomatiqueActionListener.java
Normal file
32
src/AutomatiqueActionListener.java
Normal file
@@ -0,0 +1,32 @@
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
|
||||
public class AutomatiqueActionListener implements ActionListener {
|
||||
private JFrame choixFrame;
|
||||
|
||||
public AutomatiqueActionListener(JFrame choixFrame) {
|
||||
this.choixFrame = choixFrame;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
choixFrame.dispose();
|
||||
|
||||
int[][] grille = GenerateurSudoku.genererGrille();
|
||||
System.out.println("Grille Sudoku générée avec succès.");
|
||||
|
||||
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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
78
src/CaseMouseListener.java
Normal file
78
src/CaseMouseListener.java
Normal file
@@ -0,0 +1,78 @@
|
||||
import javax.swing.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
public class CaseMouseListener extends MouseAdapter {
|
||||
private SaisieGrille panel;
|
||||
|
||||
public CaseMouseListener(SaisieGrille panel) {
|
||||
this.panel = panel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
int x = e.getX() / panel.getTailleCellule();
|
||||
int y = e.getY() / panel.getTailleCellule();
|
||||
if (x >= 0 && x < panel.getTailleGrille() * panel.getTailleRegion() && y >= 0 && y < panel.getTailleGrille() * panel.getTailleRegion()) {
|
||||
panel.setLigneSelectionnee(y);
|
||||
panel.setColonneSelectionnee(x);
|
||||
System.out.println("Case sélectionnée : (" + panel.getLigneSelectionnee() + ", " + panel.getColonneSelectionnee() + ")");
|
||||
if (panel.getGrilleInitiale()[panel.getLigneSelectionnee()][panel.getColonneSelectionnee()] == 0) {
|
||||
String[] options = {"Incertain", "Valider"};
|
||||
JTextField textField = new JTextField();
|
||||
Object[] message = {
|
||||
"Entrez la valeur pour la cellule sélectionnée :",
|
||||
textField
|
||||
};
|
||||
int option = JOptionPane.showOptionDialog(null, message, "Entrez un nombre", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]);
|
||||
if (option == 1) {
|
||||
String valeurStr = textField.getText();
|
||||
try {
|
||||
int valeur = Integer.parseInt(valeurStr);
|
||||
if (panel.validerChiffre(panel.getLigneSelectionnee(), panel.getColonneSelectionnee(), valeur)) {
|
||||
panel.getGrille()[panel.getLigneSelectionnee()][panel.getColonneSelectionnee()] = valeur;
|
||||
panel.repaint();
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(null, "Ce chiffre ne respecte pas les contraintes du Sudoku. Veuillez choisir un autre chiffre.");
|
||||
}
|
||||
} catch (NumberFormatException ex) {
|
||||
JOptionPane.showMessageDialog(null, "Saisie invalide. Veuillez entrer un nombre.");
|
||||
}
|
||||
} else if (option == 0) {
|
||||
// Le joueur a choisi "Incertain"
|
||||
JTextField[] incertainFields = new JTextField[4];
|
||||
for (int i = 0; i < 4; i++) {
|
||||
incertainFields[i] = new JTextField();
|
||||
}
|
||||
Object[] incertainMessage = {
|
||||
"Entrez les valeurs incertaines pour la cellule sélectionnée :",
|
||||
"Valeur 1 (obligatoire):", incertainFields[0],
|
||||
"Valeur 2 (obligatoire):", incertainFields[1],
|
||||
"Valeur 3 (optionnelle):", incertainFields[2],
|
||||
"Valeur 4 (optionnelle):", incertainFields[3]
|
||||
};
|
||||
int incertainOption = JOptionPane.showOptionDialog(null, incertainMessage, "Entrez les valeurs incertaines", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null);
|
||||
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;
|
||||
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 deux premières valeurs incertaines sont obligatoires.");
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(null, "Vous ne pouvez pas modifier la valeur par défaut.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
31
src/FenetreChoix.java
Normal file
31
src/FenetreChoix.java
Normal file
@@ -0,0 +1,31 @@
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
|
||||
public class FenetreChoix {
|
||||
public void afficher() {
|
||||
JFrame choixFrame = new JFrame("Choix de résolution du Sudoku");
|
||||
choixFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
choixFrame.setSize(400, 200);
|
||||
choixFrame.setLayout(new BorderLayout());
|
||||
choixFrame.setLocationRelativeTo(null);
|
||||
|
||||
JLabel label = new JLabel("Choisissez le mode de résolution du Sudoku :");
|
||||
label.setHorizontalAlignment(JLabel.CENTER);
|
||||
|
||||
JButton automatiqueButton = new JButton("Automatique");
|
||||
JButton manuelButton = new JButton("Manuel");
|
||||
|
||||
JPanel boutonsPanel = new JPanel();
|
||||
boutonsPanel.setLayout(new FlowLayout());
|
||||
boutonsPanel.add(automatiqueButton);
|
||||
boutonsPanel.add(manuelButton);
|
||||
|
||||
choixFrame.add(label, BorderLayout.NORTH);
|
||||
choixFrame.add(boutonsPanel, BorderLayout.CENTER);
|
||||
choixFrame.setVisible(true);
|
||||
|
||||
automatiqueButton.addActionListener(new AutomatiqueActionListener(choixFrame));
|
||||
manuelButton.addActionListener(new ManuelActionListener(choixFrame));
|
||||
}
|
||||
}
|
||||
25
src/FenetrePrincipale.java
Normal file
25
src/FenetrePrincipale.java
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
|
||||
public class FenetrePrincipale {
|
||||
public void afficher(boolean modeAutomatique, int[][] grille) {
|
||||
JFrame frame = new JFrame("Sudoku");
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
SaisieGrille saisieGrille = new SaisieGrille(grille);
|
||||
|
||||
if (!modeAutomatique) {
|
||||
JButton reinitialiserButton = new JButton("Réinitialiser");
|
||||
reinitialiserButton.addActionListener(new ReinitialiserActionListener(grille, saisieGrille));
|
||||
frame.add(reinitialiserButton, BorderLayout.SOUTH);
|
||||
}
|
||||
|
||||
frame.add(saisieGrille, BorderLayout.CENTER);
|
||||
frame.pack();
|
||||
frame.setLocationRelativeTo(null);
|
||||
frame.setVisible(true);
|
||||
|
||||
System.out.println("La fenêtre Sudoku a été affichée.");
|
||||
}
|
||||
}
|
||||
20
src/GenerateurSudoku.java
Normal file
20
src/GenerateurSudoku.java
Normal file
@@ -0,0 +1,20 @@
|
||||
import javax.swing.*;
|
||||
|
||||
public class GenerateurSudoku {
|
||||
public static int[][] genererGrille() {
|
||||
// grille par défaut
|
||||
int[][] grille = {
|
||||
{0, 0, 0, 0, 9, 5, 0, 0, 4},
|
||||
{5, 3, 0, 4, 0, 8, 7, 0, 2},
|
||||
{0, 0, 0, 7, 0, 0, 6, 0, 3},
|
||||
{9, 0, 0, 0, 3, 4, 0, 8, 0},
|
||||
{0, 4, 0, 0, 1, 0, 0, 7, 0},
|
||||
{0, 2, 0, 5, 7, 0, 0, 0, 6},
|
||||
{4, 0, 9, 0, 0, 2, 0, 0, 0},
|
||||
{6, 0, 7, 9, 0, 3, 0, 2, 1},
|
||||
{2, 0, 0, 6, 5, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
return grille;
|
||||
}
|
||||
}
|
||||
29
src/GrillePainter.java
Normal file
29
src/GrillePainter.java
Normal file
@@ -0,0 +1,29 @@
|
||||
import java.awt.*;
|
||||
|
||||
public class GrillePainter {
|
||||
public static void dessinerGrille(Graphics g, SaisieGrille panel) {
|
||||
Graphics2D g2d = (Graphics2D) g;
|
||||
Stroke ancienStroke = g2d.getStroke();
|
||||
g2d.setStroke(new BasicStroke(4));
|
||||
|
||||
for (int i = 0; i <= panel.getTailleGrille() * panel.getTailleRegion(); i++) {
|
||||
if (i % panel.getTailleRegion() == 0) {
|
||||
g2d.drawLine(0, i * panel.getTailleCellule(), panel.getTailleGrille() * panel.getTailleRegion() * panel.getTailleCellule(), i * panel.getTailleCellule());
|
||||
g2d.drawLine(i * panel.getTailleCellule(), 0, i * panel.getTailleCellule(), panel.getTailleGrille() * panel.getTailleRegion() * panel.getTailleCellule());
|
||||
}
|
||||
}
|
||||
|
||||
g2d.setStroke(ancienStroke);
|
||||
|
||||
for (int i = 0; i < panel.getTailleGrille() * panel.getTailleRegion(); i++) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
46
src/GrilleSudokuDessin.java
Normal file
46
src/GrilleSudokuDessin.java
Normal file
@@ -0,0 +1,46 @@
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
public class GrilleSudokuDessin extends JPanel {
|
||||
private static final int TAILLE_GRILLE = 3;
|
||||
private static final int TAILLE_REGION = 3;
|
||||
private static final int TAILLE_CELLULE = 50;
|
||||
|
||||
private int[][] grille;
|
||||
|
||||
public GrilleSudokuDessin(int[][] grille) {
|
||||
this.grille = grille;
|
||||
setPreferredSize(new Dimension(TAILLE_GRILLE * TAILLE_REGION * TAILLE_CELLULE, TAILLE_GRILLE * TAILLE_REGION * TAILLE_CELLULE));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void paintComponent(Graphics g) {
|
||||
super.paintComponent(g);
|
||||
|
||||
Graphics2D g2d = (Graphics2D) g;
|
||||
// Définir l'épaisseur de la ligne
|
||||
g2d.setStroke(new BasicStroke(20)); // Épaisseur de ligne de 4 pixels
|
||||
|
||||
// Dessiner les lignes de la grille (en gras pour les contours)
|
||||
for (int i = 0; i <= TAILLE_GRILLE * TAILLE_REGION; i++) {
|
||||
if (i % TAILLE_REGION == 0) {
|
||||
g2d.drawRect(0, i * TAILLE_CELLULE - 2, TAILLE_GRILLE * TAILLE_REGION * TAILLE_CELLULE, 4);
|
||||
g2d.drawRect(i * TAILLE_CELLULE - 2, 0, 4, TAILLE_GRILLE * TAILLE_REGION * TAILLE_CELLULE);
|
||||
} else {
|
||||
g2d.drawRect(0, i * TAILLE_CELLULE - 1, TAILLE_GRILLE * TAILLE_REGION * TAILLE_CELLULE, 2);
|
||||
g2d.drawRect(i * TAILLE_CELLULE - 1, 0, 2, TAILLE_GRILLE * TAILLE_REGION * TAILLE_CELLULE);
|
||||
}
|
||||
}
|
||||
|
||||
// Dessiner les valeurs de la grille
|
||||
g.setColor(Color.BLACK);
|
||||
for (int i = 0; i < grille.length; i++) {
|
||||
for (int j = 0; j < grille[i].length; j++) {
|
||||
int valeur = grille[i][j];
|
||||
if (valeur != 0) {
|
||||
g.drawString(String.valueOf(valeur), j * TAILLE_CELLULE + TAILLE_CELLULE / 2, i * TAILLE_CELLULE + TAILLE_CELLULE / 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
58
src/Grilles.java
Normal file
58
src/Grilles.java
Normal file
@@ -0,0 +1,58 @@
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.io.*;
|
||||
import java.io.File;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.filechooser.FileNameExtensionFilter;
|
||||
|
||||
public class Grilles{
|
||||
public static void grilleExiste(String name) {
|
||||
|
||||
int valeur[] = new int[9];
|
||||
int valeur_en_fin[][]= new int[9][9];
|
||||
|
||||
int valeur_actuelle=0;
|
||||
int tabcase[][]= new int[9][9];
|
||||
try{
|
||||
FileInputStream fichier = new FileInputStream(name);
|
||||
DataInputStream flux = new DataInputStream(fichier);
|
||||
|
||||
try{
|
||||
for(int i=0; i<9; i++){
|
||||
valeur[i]=flux.readInt();
|
||||
}
|
||||
flux.close();
|
||||
}catch(IOException e){
|
||||
System.out.println("Lecture fichier impossible");
|
||||
}
|
||||
}catch(FileNotFoundException e){
|
||||
System.out.println("Fichier non trouvé");
|
||||
}
|
||||
for(int i=0; i<9; i++){
|
||||
for(int j=8; j>=0; j--){
|
||||
valeur_actuelle=valeur[i];
|
||||
|
||||
valeur_actuelle=valeur_actuelle%10;
|
||||
valeur[i]=(valeur[i]-valeur_actuelle)/10;
|
||||
|
||||
valeur_en_fin[i][j]=valeur_actuelle;
|
||||
System.out.print(valeur_actuelle);
|
||||
}
|
||||
valeur_actuelle=0;
|
||||
}
|
||||
}
|
||||
|
||||
public static void grilleVide(int [][] g) {
|
||||
int [][] remp = new int [9][9];
|
||||
for(int i = 0 ; i < 9 ; i++){
|
||||
for(int j = 0 ; j < 9 ; j++){
|
||||
remp[i][j] = 0;
|
||||
}
|
||||
}
|
||||
g = remp;
|
||||
}
|
||||
}
|
||||
45
src/Lecteur.java
Normal file
45
src/Lecteur.java
Normal file
@@ -0,0 +1,45 @@
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.io.*;
|
||||
import javax.swing.filechooser.FileNameExtensionFilter;
|
||||
|
||||
public class Lecteur{
|
||||
public static void lecture(String name, int [][] g) {
|
||||
|
||||
int valeur[] = new int[9];
|
||||
int valeur_en_fin[][]= new int[9][9];
|
||||
|
||||
int valeur_actuelle=0;
|
||||
|
||||
try{
|
||||
FileInputStream fichier = new FileInputStream(name);
|
||||
DataInputStream flux = new DataInputStream(fichier);
|
||||
|
||||
try{
|
||||
for(int i=0; i<9; i++){
|
||||
valeur[i]=flux.readInt();
|
||||
System.out.print(valeur[i]);
|
||||
}
|
||||
flux.close();
|
||||
}catch(IOException e){
|
||||
System.out.println("Lecture fichier impossible");
|
||||
}
|
||||
}catch(FileNotFoundException e){
|
||||
System.out.println("Fichier non trouvé");
|
||||
}
|
||||
|
||||
for(int i=0; i<9; i++){
|
||||
for(int j=8; j>=0; j--){
|
||||
valeur_actuelle=valeur[i];
|
||||
|
||||
valeur_actuelle=valeur_actuelle%10;
|
||||
valeur[i]=(valeur[i]-valeur_actuelle)/10;
|
||||
|
||||
valeur_en_fin[i][j]=valeur_actuelle;
|
||||
System.out.print(valeur_actuelle);
|
||||
g[i][j] = valeur_actuelle;
|
||||
}
|
||||
valeur_actuelle=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
98
src/MainCreation.java
Normal file
98
src/MainCreation.java
Normal file
@@ -0,0 +1,98 @@
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.io.*;
|
||||
import java.io.File;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.filechooser.FileNameExtensionFilter;
|
||||
|
||||
public class MainCreation {
|
||||
public static void main(String[] args) {
|
||||
int [][] grille = new int [9][9];
|
||||
//Création de la fenetre de selection + choix du dossier
|
||||
JFrame selF = new JFrame("Choix de résolution du Sudoku");
|
||||
selF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
selF.setSize(400, 200);
|
||||
selF.setLayout(new BorderLayout());
|
||||
selF.setLocationRelativeTo(null);
|
||||
JLabel sel = new JLabel("Quelle grilles souhaitez vous ?");
|
||||
//Création des boutons
|
||||
sel.setHorizontalAlignment(JLabel.CENTER);
|
||||
JButton grilleVide = new JButton("Grille vide");
|
||||
JButton grilleExiste = new JButton("Grille Existante");
|
||||
|
||||
JPanel boutonsSelect = new JPanel();
|
||||
boutonsSelect.setLayout(new FlowLayout());
|
||||
boutonsSelect.add(grilleVide);
|
||||
boutonsSelect.add(grilleExiste);
|
||||
|
||||
selF.add(sel, BorderLayout.NORTH);
|
||||
selF.add(boutonsSelect, BorderLayout.CENTER);
|
||||
selF.setVisible(true);
|
||||
//Action des bouton
|
||||
grilleVide.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
selF.dispose();
|
||||
Grilles.grilleVide(grille);
|
||||
fenetreModification(grille);
|
||||
}
|
||||
});
|
||||
grilleExiste.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
selF.dispose();
|
||||
JFileChooser fichier = new JFileChooser();
|
||||
|
||||
FileNameExtensionFilter filter = new FileNameExtensionFilter("File grille","gri");
|
||||
fichier.setFileFilter(filter);
|
||||
|
||||
File workingDirectory = new File(System.getProperty("user.dir"));
|
||||
fichier.setCurrentDirectory(workingDirectory);
|
||||
JPanel panneau = new JPanel();
|
||||
int valeur_de_retour = fichier.showOpenDialog(panneau);
|
||||
if(valeur_de_retour == JFileChooser.APPROVE_OPTION) {
|
||||
Lecteur.lecture(fichier.getSelectedFile().getName(), grille);
|
||||
fenetreModification(grille);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void fenetreModification(int[][] grille) {
|
||||
JFrame frame = new JFrame("Sudoku");
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
SaisieGrille saisieGrille = new SaisieGrille(grille); // Utilisation de la classe SaisieGrille pour permettre la saisie des valeurs
|
||||
JButton register = new JButton("Enregistrer");
|
||||
register.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e){
|
||||
JFileChooser fileChooser = new JFileChooser();
|
||||
|
||||
FileNameExtensionFilter filter = new FileNameExtensionFilter("File grille","gri");
|
||||
fileChooser.setFileFilter(filter);
|
||||
|
||||
File workingDirectory = new File(System.getProperty("user.dir"));
|
||||
fileChooser.setCurrentDirectory(workingDirectory);
|
||||
JPanel panneau = new JPanel();
|
||||
int valeur_de_retour = fileChooser.showOpenDialog(panneau);
|
||||
if(valeur_de_retour == JFileChooser.APPROVE_OPTION) {
|
||||
Register.sauvegarde(fileChooser.getSelectedFile().getName(), grille);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
frame.add(register, BorderLayout.SOUTH); // Ajouter le bouton "Enregistrer"
|
||||
|
||||
frame.add(saisieGrille, BorderLayout.CENTER); // Ajouter la grille à la fenêtre
|
||||
|
||||
frame.pack();
|
||||
frame.setLocationRelativeTo(null); // Centrer la fenêtre sur l'écran
|
||||
frame.setVisible(true);
|
||||
|
||||
System.out.println("La fenêtre de création a été affichée.");
|
||||
}
|
||||
}
|
||||
9
src/MainJeu.java
Normal file
9
src/MainJeu.java
Normal file
@@ -0,0 +1,9 @@
|
||||
|
||||
public class MainJeu {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Le programme Main a démarré.");
|
||||
|
||||
FenetreChoix fenetreChoix = new FenetreChoix();
|
||||
fenetreChoix.afficher();
|
||||
}
|
||||
}
|
||||
23
src/ManuelActionListener.java
Normal file
23
src/ManuelActionListener.java
Normal file
@@ -0,0 +1,23 @@
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
|
||||
public class ManuelActionListener implements ActionListener {
|
||||
private JFrame choixFrame;
|
||||
|
||||
public ManuelActionListener(JFrame choixFrame) {
|
||||
this.choixFrame = choixFrame;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
choixFrame.dispose();
|
||||
|
||||
int[][] grille = GenerateurSudoku.genererGrille();
|
||||
System.out.println("Grille Sudoku générée avec succès.");
|
||||
|
||||
FenetrePrincipale fenetrePrincipale = new FenetrePrincipale();
|
||||
fenetrePrincipale.afficher(false, grille);
|
||||
}
|
||||
}
|
||||
27
src/OuvertureFichier.java
Normal file
27
src/OuvertureFichier.java
Normal file
@@ -0,0 +1,27 @@
|
||||
import java.io.*;
|
||||
|
||||
public class OuvertureFichier {
|
||||
public static int[][] lireFichier(File fichier) {
|
||||
int[][] grille = new int[9][9];
|
||||
try (BufferedReader br = new BufferedReader(new FileReader(fichier))) {
|
||||
String ligne;
|
||||
int i = 0;
|
||||
while ((ligne = br.readLine()) != null && i < 9) {
|
||||
for (int j = 0; j < Math.min(ligne.length(), 9); j++) {
|
||||
char caractere = ligne.charAt(j);
|
||||
if (caractere != ' ') {
|
||||
// Convertir chaque caractère en valeur numérique
|
||||
int valeur = Integer.parseInt(String.valueOf(caractere), 16);
|
||||
grille[i][j] = valeur;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return grille;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
37
src/Register.java
Normal file
37
src/Register.java
Normal file
@@ -0,0 +1,37 @@
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.io.*;
|
||||
import javax.swing.filechooser.FileNameExtensionFilter;
|
||||
|
||||
public class Register{
|
||||
public static void sauvegarde(String name, int [][] g){
|
||||
int val[] = new int[9];
|
||||
|
||||
int actuVal=0;
|
||||
int v=0;
|
||||
|
||||
try{
|
||||
FileOutputStream fichier = new FileOutputStream(name);
|
||||
DataOutputStream flux = new DataOutputStream(fichier);
|
||||
|
||||
try{
|
||||
|
||||
|
||||
for(int i=0; i<9; i++){
|
||||
for(int j=0; j<9; j++){
|
||||
actuVal = g[i][j];
|
||||
v = (v*10) - actuVal;
|
||||
}
|
||||
flux.writeInt(-v);
|
||||
v=0;
|
||||
actuVal=0;
|
||||
}
|
||||
flux.close();
|
||||
}catch(IOException e){
|
||||
System.out.println("Lecture fichier imposible");
|
||||
}
|
||||
}catch(FileNotFoundException e){
|
||||
System.out.println("Fichier non trouvé");
|
||||
}
|
||||
}
|
||||
}
|
||||
22
src/Reinitialiser.java
Normal file
22
src/Reinitialiser.java
Normal file
@@ -0,0 +1,22 @@
|
||||
import javax.swing.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
public class Reinitialiser implements ActionListener {
|
||||
private int[][] grille;
|
||||
private SaisieGrille panneauSaisie;
|
||||
|
||||
public Reinitialiser(int[][] grille, SaisieGrille panneauSaisie) {
|
||||
this.grille = grille;
|
||||
this.panneauSaisie = panneauSaisie;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
// Réinitialiser la grille en copiant la grille initiale
|
||||
for (int i = 0; i < grille.length; i++) {
|
||||
System.arraycopy(panneauSaisie.getGrilleInitiale()[i], 0, grille[i], 0, grille[i].length);
|
||||
}
|
||||
// Redessiner le panneau
|
||||
panneauSaisie.repaint();
|
||||
}
|
||||
}
|
||||
20
src/ReinitialiserActionListener.java
Normal file
20
src/ReinitialiserActionListener.java
Normal file
@@ -0,0 +1,20 @@
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
|
||||
public class ReinitialiserActionListener implements ActionListener {
|
||||
private int[][] grille;
|
||||
private SaisieGrille saisieGrille;
|
||||
|
||||
public ReinitialiserActionListener(int[][] grille, SaisieGrille saisieGrille) {
|
||||
this.grille = grille;
|
||||
this.saisieGrille = saisieGrille;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
Reinitialiser reinitialiser = new Reinitialiser(grille, saisieGrille);
|
||||
reinitialiser.actionPerformed(e);
|
||||
}
|
||||
}
|
||||
74
src/Resolveur.java
Normal file
74
src/Resolveur.java
Normal file
@@ -0,0 +1,74 @@
|
||||
public class Resolveur {
|
||||
public static boolean resoudreSudoku(int[][] grille) {
|
||||
int row = -1;
|
||||
int col = -1;
|
||||
boolean estVide = true;
|
||||
|
||||
// Recherche d'une cellule vide dans la grille
|
||||
for (int i = 0; i < grille.length; i++) {
|
||||
for (int j = 0; j < grille[i].length; j++) {
|
||||
if (grille[i][j] == 0) {
|
||||
row = i;
|
||||
col = j;
|
||||
// Cellule vide trouvée
|
||||
estVide = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!estVide) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Si la grille est pleine, le Sudoku est résolu
|
||||
if (estVide) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Essayer de placer les chiffres de 1 à 9 dans la cellule vide
|
||||
for (int num = 1; num <= 9; num++) {
|
||||
if (estCoupValide(grille, row, col, num)) {
|
||||
grille[row][col] = num;
|
||||
// Résoudre récursivement le Sudoku
|
||||
if (resoudreSudoku(grille)) {
|
||||
return true;
|
||||
}
|
||||
// Annuler la valeur si la solution n'est pas possible
|
||||
grille[row][col] = 0;
|
||||
}
|
||||
}
|
||||
// Aucune solution n'est possible pour cette cellule
|
||||
return false;
|
||||
}
|
||||
|
||||
// Vérifie si un nombre peut être placé dans une cellule spécifique
|
||||
private static boolean estCoupValide(int[][] grille, int row, int col, int num) {
|
||||
// Vérifie la ligne
|
||||
for (int x = 0; x < 9; x++) {
|
||||
if (grille[row][x] == num) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Vérifie la colonne
|
||||
for (int y = 0; y < 9; y++) {
|
||||
if (grille[y][col] == num) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Vérifie la région 3x3
|
||||
int regionRowStart = row - row % 3;
|
||||
int regionColStart = col - col % 3;
|
||||
for (int i = 0; i < 3; i++) {
|
||||
for (int j = 0; j < 3; j++) {
|
||||
if (grille[i + regionRowStart][j + regionColStart] == num) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// La valeur peut être placée dans cette cellule
|
||||
return true;
|
||||
}
|
||||
}
|
||||
105
src/SaisieGrille.java
Normal file
105
src/SaisieGrille.java
Normal file
@@ -0,0 +1,105 @@
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
public class SaisieGrille extends JPanel {
|
||||
private static final int TAILLE_GRILLE = 3;
|
||||
private static final int TAILLE_REGION = 3;
|
||||
private static final int TAILLE_CELLULE = 50;
|
||||
private int[][] grille;
|
||||
private int[][] grilleInitiale;
|
||||
private int ligneSelectionnee = -1;
|
||||
private int colonneSelectionnee = -1;
|
||||
|
||||
public SaisieGrille(int[][] grille) {
|
||||
this.grille = grille;
|
||||
this.grilleInitiale = new int[grille.length][grille[0].length];
|
||||
for (int i = 0; i < grille.length; i++) {
|
||||
for (int j = 0; j < grille[i].length; j++) {
|
||||
this.grilleInitiale[i][j] = grille[i][j];
|
||||
}
|
||||
}
|
||||
setPreferredSize(new Dimension(TAILLE_GRILLE * TAILLE_REGION * TAILLE_CELLULE, TAILLE_GRILLE * TAILLE_REGION * TAILLE_CELLULE));
|
||||
setFocusable(true);
|
||||
|
||||
addMouseListener(new CaseMouseListener(this));
|
||||
}
|
||||
|
||||
public int[][] getGrilleInitiale() {
|
||||
return grilleInitiale;
|
||||
}
|
||||
|
||||
public int getTailleGrille() {
|
||||
return TAILLE_GRILLE;
|
||||
}
|
||||
|
||||
public int getTailleRegion() {
|
||||
return TAILLE_REGION;
|
||||
}
|
||||
|
||||
public int getTailleCellule() {
|
||||
return TAILLE_CELLULE;
|
||||
}
|
||||
|
||||
public void setLigneSelectionnee(int ligneSelectionnee) {
|
||||
this.ligneSelectionnee = ligneSelectionnee;
|
||||
}
|
||||
|
||||
public void setColonneSelectionnee(int colonneSelectionnee) {
|
||||
this.colonneSelectionnee = colonneSelectionnee;
|
||||
}
|
||||
|
||||
public int getLigneSelectionnee() {
|
||||
return ligneSelectionnee;
|
||||
}
|
||||
|
||||
public int getColonneSelectionnee() {
|
||||
return colonneSelectionnee;
|
||||
}
|
||||
|
||||
public int[][] getGrille() {
|
||||
return grille;
|
||||
}
|
||||
|
||||
public boolean validerChiffre(int ligne, int colonne, int chiffre) {
|
||||
// Vérifier si le chiffre est entre 1 et 9
|
||||
if (chiffre < 1 || chiffre > 9) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Vérifier la ligne
|
||||
for (int j = 0; j < grille.length; j++) {
|
||||
if (grille[ligne][j] == chiffre && j != colonne) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Vérifier la colonne
|
||||
for (int i = 0; i < grille.length; i++) {
|
||||
if (grille[i][colonne] == chiffre && i != ligne) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Vérifier la région
|
||||
int regionX = colonne / TAILLE_REGION;
|
||||
int regionY = ligne / TAILLE_REGION;
|
||||
for (int i = regionY * TAILLE_REGION; i < (regionY + 1) * TAILLE_REGION; i++) {
|
||||
for (int j = regionX * TAILLE_REGION; j < (regionX + 1) * TAILLE_REGION; j++) {
|
||||
if (grille[i][j] == chiffre && (i != ligne || j != colonne)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void paintComponent(Graphics g) {
|
||||
super.paintComponent(g);
|
||||
GrillePainter.dessinerGrille(g, this);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
114
src/SudokuGenerator.java
Normal file
114
src/SudokuGenerator.java
Normal file
@@ -0,0 +1,114 @@
|
||||
import javax.swing.*;
|
||||
import java.io.*;
|
||||
|
||||
public class SudokuGenerator {
|
||||
public static int[][] generateGrid() {
|
||||
// grille par défaut
|
||||
int[][] grid = {
|
||||
{0, 0, 0, 9, 0, 5, 0, 0, 4},
|
||||
{5, 0, 3, 0, 0, 4, 0, 8, 7},
|
||||
{0, 0, 0, 7, 0, 0, 6, 0, 3},
|
||||
{9, 0, 0, 0, 3, 4, 0, 8, 0},
|
||||
{0, 4, 0, 0, 1, 0, 0, 7, 0},
|
||||
{0, 2, 0, 5, 7, 0, 0, 0, 6},
|
||||
{4, 0, 9, 0, 0, 2, 0, 0, 0},
|
||||
{6, 0, 7, 9, 0, 3, 0, 2, 1},
|
||||
{2, 0, 0, 6, 5, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
return grid;
|
||||
}
|
||||
|
||||
public static int[][] readGridFromFile() {
|
||||
int[][] grid = new int[9][9];
|
||||
JFileChooser fileChooser = new JFileChooser();
|
||||
int result = fileChooser.showOpenDialog(null);
|
||||
if (result == JFileChooser.APPROVE_OPTION) {
|
||||
File selectedFile = fileChooser.getSelectedFile();
|
||||
try (BufferedReader reader = new BufferedReader(new FileReader(selectedFile))) {
|
||||
for (int i = 0; i < 9; i++) {
|
||||
String line = reader.readLine();
|
||||
// Vérifier la longueur de la ligne lue
|
||||
if (line.length() != 9) {
|
||||
JOptionPane.showMessageDialog(null, "Invalid file format. Please select a file with correct Sudoku grid format.");
|
||||
return generateGrid(); // Charger la grille par défaut en cas d'erreur
|
||||
}
|
||||
for (int j = 0; j < 9; j++) {
|
||||
char ch = line.charAt(j);
|
||||
if (ch >= '1' && ch <= '9') {
|
||||
grid[i][j] = Character.getNumericValue(ch);
|
||||
} else {
|
||||
grid[i][j] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!isGridValid(grid)) {
|
||||
JOptionPane.showMessageDialog(null, "Invalid Sudoku grid. Loading default grid.");
|
||||
return generateGrid(); // Charger la grille par défaut en cas de grille invalide
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return grid;
|
||||
}
|
||||
|
||||
// Méthode pour vérifier si la grille est valide
|
||||
private static boolean isGridValid(int[][] grid) {
|
||||
for (int i = 0; i < 9; i++) {
|
||||
if (!isRowValid(grid, i) || !isColumnValid(grid, i) || !isRegionValid(grid, i)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Méthode pour vérifier s'il n'y a pas de chiffres en double sur une ligne donnée
|
||||
private static boolean isRowValid(int[][] grid, int row) {
|
||||
boolean[] seen = new boolean[10]; // Tableau pour suivre les chiffres déjà rencontrés
|
||||
for (int i = 0; i < 9; i++) {
|
||||
int num = grid[row][i];
|
||||
if (num != 0) {
|
||||
if (seen[num]) {
|
||||
return false; // Le chiffre est déjà apparu sur cette ligne
|
||||
}
|
||||
seen[num] = true;
|
||||
}
|
||||
}
|
||||
return true; // Aucun chiffre en double sur la ligne
|
||||
}
|
||||
|
||||
// Méthode pour vérifier s'il n'y a pas de chiffres en double sur une colonne donnée
|
||||
private static boolean isColumnValid(int[][] grid, int col) {
|
||||
boolean[] seen = new boolean[10]; // Tableau pour suivre les chiffres déjà rencontrés
|
||||
for (int i = 0; i < 9; i++) {
|
||||
int num = grid[i][col];
|
||||
if (num != 0) {
|
||||
if (seen[num]) {
|
||||
return false; // Le chiffre est déjà apparu sur cette colonne
|
||||
}
|
||||
seen[num] = true;
|
||||
}
|
||||
}
|
||||
return true; // Aucun chiffre en double sur la colonne
|
||||
}
|
||||
|
||||
// Méthode pour vérifier s'il n'y a pas de chiffres en double dans une région donnée
|
||||
private static boolean isRegionValid(int[][] grid, int region) {
|
||||
int rowOffset = (region / 3) * 3;
|
||||
int colOffset = (region % 3) * 3;
|
||||
boolean[] seen = new boolean[10]; // Tableau pour suivre les chiffres déjà rencontrés
|
||||
for (int i = rowOffset; i < rowOffset + 3; i++) {
|
||||
for (int j = colOffset; j < colOffset + 3; j++) {
|
||||
int num = grid[i][j];
|
||||
if (num != 0) {
|
||||
if (seen[num]) {
|
||||
return false; // Le chiffre est déjà apparu dans cette région
|
||||
}
|
||||
seen[num] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true; // Aucun chiffre en double dans la région
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user