diff --git a/Sudoku/grille.java b/Sudoku/grille.java new file mode 100644 index 0000000..d399e45 --- /dev/null +++ b/Sudoku/grille.java @@ -0,0 +1,85 @@ +import javax.swing.*; +import java.awt.*; +import java.io.*; + +public class grille extends JComponent{ + + /*tableau de valeurs de la grille de sudoku*/ + public static int[][] grid_values = null; + + /*fonction pour afficher graphiquement la grille*/ + public static void AfficherGrille (int[][] grille) { + /*paramètre de base de la fenetre*/ + JFrame fenetre = new JFrame(); + fenetre.setSize(900, 900); + fenetre.setLocationRelativeTo(null); + fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + /*creation grille*/ + GridLayout gestionnaire = new GridLayout(9, 9); + fenetre.setLayout(gestionnaire); + + + /*affichage de la grille*/ + JTextField[][] case_modifiable = null; + JLabel[][] case_depart = null; + case_depart = new JLabel[9][9]; + case_modifiable = new JTextField[9][9]; + + for (int i = 0; i < 9; i++) { + for (int j = 0; j < 9; j++) { + if ((grid_values[i][j]) == 0) { + case_modifiable[i][j] = new JTextField("", 1); + case_modifiable[i][j].setFont(new Font("Arial", Font.PLAIN, 30)); + case_modifiable[i][j].setHorizontalAlignment(JTextField.CENTER); + fenetre.add(case_modifiable[i][j]); + } else { + case_depart[i][j] = new JLabel(String.valueOf(grid_values[i][j])); + case_depart[i][j].setFont(new Font("Arial", Font.PLAIN, 30)); + case_depart[i][j].setHorizontalAlignment(JTextField.CENTER); + fenetre.add(case_depart[i][j]); + } + } + } + /*affichage fenetre*/ + fenetre.setVisible(true); + + /*System.out.println(grid[0][0].getText());*/ + } + + /*fonction pour passer d'un fichier.gri à un tableau de valeur*/ + public static int[][] ChargerGrille(String cheminFichier){ + try { + FileInputStream fs = new FileInputStream(cheminFichier); + DataInputStream fichier = new DataInputStream(fs); + + grid_values = new int[9][9]; + String string_values = ""; + int index = 0; + + for (int a = 0; a < 9 ; a++ ) { + String ligne = String.valueOf(fichier.readInt()); + while (ligne.length() < 9){ + ligne = "0" + ligne; + } + string_values = string_values + ligne; + } + + for (int i = 0; i < 9; i++) { + for (int j = 0; j < 9; j++) { + grid_values[i][j] = Character.getNumericValue(string_values.charAt(index)); + index++; + } + } + try { + fs.close(); + return grid_values; + }catch(IOException e){ + System.err.println("erreur fermeture du fichier"); + } + }catch(IOException e) { + System.err.println("erreur ouverture du fichier"); + } + + return null; + } +} \ No newline at end of file diff --git a/Sudoku/grille/exemple.gri b/Sudoku/grille/exemple.gri new file mode 100644 index 0000000..5637e4d Binary files /dev/null and b/Sudoku/grille/exemple.gri differ diff --git a/Sudoku/img/grille_sudoku.png b/Sudoku/img/grille_sudoku.png new file mode 100644 index 0000000..42b6820 Binary files /dev/null and b/Sudoku/img/grille_sudoku.png differ diff --git a/Sudoku/img/grille_sudoku.psd b/Sudoku/img/grille_sudoku.psd new file mode 100644 index 0000000..185b982 Binary files /dev/null and b/Sudoku/img/grille_sudoku.psd differ diff --git a/Sudoku/main.java b/Sudoku/main.java new file mode 100644 index 0000000..2d980b6 --- /dev/null +++ b/Sudoku/main.java @@ -0,0 +1,8 @@ +import javax.swing.*; +import java.awt.*; + +public class main { + public static void main(String[] args) { + menu.menuFenetre(); + } +} \ No newline at end of file diff --git a/Sudoku/menu.java b/Sudoku/menu.java new file mode 100644 index 0000000..0395916 --- /dev/null +++ b/Sudoku/menu.java @@ -0,0 +1,119 @@ +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.io.*; + +public class menu { + + private static String cheminFichier = null; + private static boolean ResolutionManuel = true; + + public static void menuFenetre() { + /*fenetre*/ + JFrame fenetre = new JFrame(); + fenetre.setSize(500, 250); + fenetre.setTitle("Sudoku Resolver (By Wilfried BRIGITTE)"); + fenetre.setResizable(false); + fenetre.setLocationRelativeTo(null); + fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + GridLayout gestionnaire = new GridLayout(5,1); + fenetre.setLayout(gestionnaire); + + /*composants G*/ + + JLabel titre = new JLabel("Sudoku Resolver"); + titre.setHorizontalAlignment(JLabel.CENTER); + titre.setFont(new Font("Arial", Font.PLAIN, 25)); + fenetre.add(titre, BorderLayout.CENTER); + + JPanel ligne2 = new JPanel(); + ButtonGroup groupModeResolution = new ButtonGroup(); + JRadioButton manuel = new JRadioButton("manuel"); + JRadioButton auto = new JRadioButton("auto"); + groupModeResolution.add(manuel); + groupModeResolution.add(auto); + ligne2.add(manuel); + ligne2.add(auto); + manuel.setSelected(true); + fenetre.add(ligne2, BorderLayout.CENTER); + + + JPanel ligne3 = new JPanel(); + JButton ouvrir = new JButton("Ouvrir"); + JLabel nomFichier = new JLabel("Fichier ouvert : "); + ligne3.add(ouvrir); + ligne3.add(nomFichier); + fenetre.add(ligne3, BorderLayout.CENTER); + + JPanel ligne4 = new JPanel(); + JButton lancer = new JButton("Lancer"); + JButton quitter = new JButton("Quitter"); + ligne4.add(lancer); + ligne4.add(quitter); + fenetre.add(ligne4, BorderLayout.CENTER); + + JLabel InfoLogiciel = new JLabel(" Info : Tout est normal"); + InfoLogiciel.setHorizontalAlignment(JLabel.LEFT); + InfoLogiciel.setFont(new Font("Arial", Font.PLAIN, 11)); + fenetre.add(InfoLogiciel); + + /*affichage*/ + fenetre.setVisible(true); + + /*evenements*/ + ouvrir.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + JFileChooser filechooser = new JFileChooser(); + filechooser.setCurrentDirectory(new File("./grille")); + int result = filechooser.showOpenDialog(null); + if (result == JFileChooser.APPROVE_OPTION) { + File selectedFile = filechooser.getSelectedFile(); + nomFichier.setText("Fichier ouvert : " + selectedFile.getName()); + cheminFichier = selectedFile.getAbsolutePath(); + InfoLogiciel.setText(" Info : Tout est normal"); + InfoLogiciel.setForeground(Color.BLACK); + } + } catch (Exception ex) { + System.err.println("Erreur selection du fichier"); + } + } + }); + + lancer.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e2) { + if(cheminFichier != null){ + if (ResolutionManuel == true) { + fenetre.dispose(); + grille.AfficherGrille(grille.ChargerGrille(cheminFichier)); + } else { + grille.AfficherGrille(resolveurGrille.resoudreGrille(grille.ChargerGrille(cheminFichier))); + } + } else { + InfoLogiciel.setText(" Info : Erreur : Veuillez selectionner un fichier .gri"); + InfoLogiciel.setForeground(Color.RED); + } + } + }); + + quitter.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e3) { + System.exit(0); + } + }); + + manuel.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + ResolutionManuel = true; + } + }); + + auto.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + ResolutionManuel = false; + } + }); + } +} diff --git a/Sudoku/resolveurGrille.java b/Sudoku/resolveurGrille.java new file mode 100644 index 0000000..b5bec76 --- /dev/null +++ b/Sudoku/resolveurGrille.java @@ -0,0 +1,77 @@ +public class resolveurGrille { + + private static int[][] solution = new int[9][9]; + private static boolean stop = false; + + public static int[][] resoudreGrille(int[][] grille) { + /*remise à zéro de la solution*/ + for (int i = 0; i < 9; i++) { + for (int j = 0; j < 9; j++) { + solution[i][j] = 0; + } + } + + /* Réinitialiser la valeur de stop à chaque début de résolution*/ + stop = false; + resoudreSudoku(grille); + return solution; + } + + private static void resoudreSudoku(int[][] grille) { + /*parcourage la grille*/ + for (int row = 0; row < 9; row++) { + for (int col = 0; col < 9; col++) { + if (grille[row][col] == 0) { + /*essayer les chiffres de 1 a 9 pour la case vide*/ + for (int num = 1; num <= 9; num++) { + if (isValid(grille, row, col, num)) { + grille[row][col] = num; + resoudreSudoku(grille); + if (stop) { + return; + } + grille[row][col] = 0; /*réinitialiser la case si la solution n'est pas trouvée*/ + } + } + return; /* Si aucune solution trouvée à cette étape on s'arrêtee*/ + } + } + } + + /*copier la grille résolue dans la solution*/ + for (int i = 0; i < 9; i++) { + System.arraycopy(grille[i], 0, solution[i], 0, 9); + } + stop = true; + } + + /*Méthode pour vérifier la validité d'un chiffre dans une case donnée*/ + private static boolean isValid(int[][] grille, int row, int col, int num) { + /*Vérifier la ligne*/ + for (int x = 0; x < 9; x++) { + if (grille[row][x] == num) { + return false; + } + } + + /*Vérifier la colonne*/ + for (int x = 0; x < 9; x++) { + if (grille[x][col] == num) { + return false; + } + } + + /*Vérifier la sous-grille 3x3*/ + int startRow = row - row % 3; + int startCol = col - col % 3; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (grille[i + startRow][j + startCol] == num) { + return false; + } + } + } + + return true; + } +}