From 12ae377ec01c1b7ab877dfe48af8769fc116a9e4 Mon Sep 17 00:00:00 2001
From: Vince <vi.teissier@gmail.com>
Date: Sat, 4 May 2024 14:59:38 +0200
Subject: [PATCH] =?UTF-8?q?Methodes=20en=20trop=20supprim=C3=A9e=20+=20net?=
 =?UTF-8?q?toyage=20git?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Grid.java                 | 24 +++++-----
 Sudoku.java               | 96 ++++-----------------------------------
 SudokuButtonListener.java | 40 ++++++++--------
 SudokuSolver.java         | 15 +++++-
 SudokuUI.java             | 27 ++++++++++-
 5 files changed, 81 insertions(+), 121 deletions(-)

diff --git a/Grid.java b/Grid.java
index 8500fc1..24a6e3c 100644
--- a/Grid.java
+++ b/Grid.java
@@ -3,22 +3,22 @@ import java.io.FileInputStream;
 import java.io.IOException;
 
 public class Grid {
-    private Cell[][] cells;
+    private Cell[][] cell;
 
     public Grid() {
-        cells = new Cell[9][9];
+        cell = new Cell[9][9];
         for (int i = 0; i < 9; i++) {
             for (int j = 0; j < 9; j++) {
-                cells[i][j] = new Cell();
+                cell[i][j] = new Cell();
             }
         }
     }
 
     public Grid(Grid grid) {
-        cells = new Cell[9][9];
+        cell = new Cell[9][9];
         for (int i = 0; i < 9; i++) {
             for (int j = 0; j < 9; j++) {
-                cells[i][j] = new Cell(grid.cells[i][j].getValue());
+                cell[i][j] = new Cell(grid.cell[i][j].getValue());
             }
         }
     }
@@ -32,9 +32,9 @@ public class Grid {
                     line = "000000000".substring(length) + line; // Ajoute les zéros au début si nécessaire
                 }
                 for (int column = 0; column < 9; column++) {
-                    char digit = line.charAt(column);
-                    int value = Character.getNumericValue(digit);
-                    cells[ligne][column].setValue(value);
+                    char number = line.charAt(column);
+                    int value = Character.getNumericValue(number);
+                    cell[ligne][column].setValue(value);
                 }
             }
             System.out.println("Success");
@@ -45,13 +45,13 @@ public class Grid {
     }
 
     public Cell getCell(int ligne, int col) {
-        return cells[ligne][col];
+        return cell[ligne][col];
     }
 
-    public void copyFrom(Grid other) {
+    public void copyFrom(Grid second_grid) {
         for (int row = 0; row < 9; row++) {
             for (int col = 0; col < 9; col++) {
-                this.cells[row][col].setValue(other.cells[row][col].getValue());
+                this.cell[row][col].setValue(second_grid.cell[row][col].getValue());
             }
         }
     }
@@ -59,7 +59,7 @@ public class Grid {
     public void printGrid() {
         for (int row = 0; row < 9; row++) {
             for (int col = 0; col < 9; col++) {
-                System.out.print(cells[row][col].getValue() + " ");
+                System.out.print(cell[row][col].getValue() + " ");
             }
             System.out.println();
         }
diff --git a/Sudoku.java b/Sudoku.java
index c2250ee..d3a0d59 100644
--- a/Sudoku.java
+++ b/Sudoku.java
@@ -6,9 +6,13 @@ public class Sudoku {
         this.grid = new Grid(); // Initialiser avec une grille vide
         this.solved = false;
     }
-    
-    
 
+    public static void main(String[] args) {
+        Sudoku sudoku = new Sudoku();
+        sudoku.printGrid(); // Afficher la grille non résolue dans la console
+        new SudokuUI(sudoku);
+    }
+    
     public Grid getGrid() {
         return grid;
     }
@@ -20,14 +24,10 @@ public class Sudoku {
     public boolean isSolved() {
         return solved;
     }
-
-    public static void main(String[] args) {
-        Sudoku sudoku = new Sudoku();
-        sudoku.printGrid(); // Afficher la grille non résolue dans la console
-        new SudokuUI(sudoku);
+    
+    public void loadGridFromFile(String fileName) {
+        this.grid.loadGridFromFile(fileName);
     }
-    
-    
 
     public void printGrid() {
         for (int row = 0; row < 9; row++) {
@@ -39,82 +39,4 @@ public class Sudoku {
         }
     }
 
-    public boolean generateSudoku() {
-        for (int i = 0; i < 9; i++) {
-            for (int j = 0; j < 9; j++) {
-                if (!solveSudoku(i, j)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    private boolean solveSudoku(int row, int col) {
-        if (row == 9 - 1 && col == 9) {
-            return true;
-        }
-
-        if (col == 9) {
-            row++;
-            col = 0;
-        }
-
-        if (grid.getCell(row, col).getValue() != 0) {
-            return solveSudoku(row, col + 1);
-        }
-
-        for (int num = 1; num <= 9; num++) {
-            if (isSafe(row, col, num)) {
-                grid.getCell(row, col).setValue(num);
-                if (solveSudoku(row, col + 1)) {
-                    return true;
-                }
-            }
-            grid.getCell(row, col).setValue(0);
-        }
-        return false;
-    }
-
-    private boolean isSafe(int row, int col, int num) {
-        // Vérifiez si nous trouvons le même numéro dans la même ligne,
-        // la même colonne ou la même sous-grille
-        return !findInRow(row, num) && !findInCol(col, num) && !findInBox(row - row % 3, col - col % 3, num);
-    }
-
-    // Méthodes findInRow, findInCol et findInBox ici
-    private boolean findInRow(int row, int num) {
-        for (int col = 0; col < 9; col++) {
-            if (grid.getCell(row, col).getValue() == num) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean findInCol(int col, int num) {
-        for (int row = 0; row < 9; row++) {
-            if (grid.getCell(row, col).getValue() == num) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean findInBox(int boxStartRow, int boxStartCol, int num) {
-        for (int row = 0; row < 3; row++) {
-            for (int col = 0; col < 3; col++) {
-                if (grid.getCell(row + boxStartRow, col + boxStartCol).getValue() == num) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-
-    public void loadGridFromFile(String fileName) {
-        this.grid.loadGridFromFile(fileName);
-    }
-
 }
diff --git a/SudokuButtonListener.java b/SudokuButtonListener.java
index 811b70e..d7e122b 100644
--- a/SudokuButtonListener.java
+++ b/SudokuButtonListener.java
@@ -4,16 +4,16 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 
 public class SudokuButtonListener implements ActionListener {
-    private int ligne;
+    private int row;
     private int col;
     private Sudoku sudoku;
-    private JButton[][] boutons;
+    private JButton[][] buttons;
 
-    public SudokuButtonListener(int ligne, int col, Sudoku sudoku, JButton[][] boutons) {
-        this.ligne = ligne;
+    public SudokuButtonListener(int row, int col, Sudoku sudoku, JButton[][] buttons) {
+        this.row = row;
         this.col = col;
         this.sudoku = sudoku;
-        this.boutons = boutons;
+        this.buttons = buttons;
     }
 
     @Override
@@ -22,16 +22,16 @@ public class SudokuButtonListener implements ActionListener {
         if (input != null && input.length() > 0) {
             try {
                 int num = Integer.parseInt(input);
-                sudoku.getGrid().getCell(ligne, col).setValue(num);
+                sudoku.getGrid().getCell(row, col).setValue(num);
                 if (num == 0) {
-                    boutons[ligne][col].setText(""); // Case vide si le nombre est 0
+                    buttons[row][col].setText(""); // Case vide si le nombre est 0
                 } else {
-                    boutons[ligne][col].setText(String.valueOf(num));
+                    buttons[row][col].setText(String.valueOf(num));
                 }
-                if (!isValidMove(num, ligne, col)) {
-                    boutons[ligne][col].setForeground(Color.RED); // Met le texte en rouge en cas de mouvement invalide
+                if (!isValid(num, row, col)) {
+                    buttons[row][col].setForeground(Color.RED); // Met le texte en rouge en cas de mouvement invalide
                 } else {
-                    boutons[ligne][col].setForeground(Color.BLACK); // Réinitialise la couleur du texte
+                    buttons[row][col].setForeground(Color.BLACK); // Réinitialise la couleur du texte
                 }
             } catch (NumberFormatException ex) {
                 JOptionPane.showMessageDialog(null, "Veuillez entrer un nombre valide.");
@@ -39,13 +39,13 @@ public class SudokuButtonListener implements ActionListener {
         }
     }
 
-    private boolean isValidMove(int num, int ligne, int col) {
-        return isValidRow(num, ligne) && isValidCol(num, col) && isValidBox(num, ligne - ligne % 3, col - col % 3);
+    private boolean isValid(int num, int row, int col) {
+        return isValidRow(num, row) && isValidCol(num, col) && isValidBox(num, row - row % 3, col - col % 3);
     }
 
-    private boolean isValidRow(int num, int ligne) {
+    private boolean isValidRow(int num, int row) {
         for (int i = 0; i < 9; i++) {
-            if (sudoku.getGrid().getCell(ligne, i).getValue() == num && i != col) {
+            if (sudoku.getGrid().getCell(row, i).getValue() == num && i != col) {
                 return false;
             }
         }
@@ -54,19 +54,19 @@ public class SudokuButtonListener implements ActionListener {
 
     private boolean isValidCol(int num, int col) {
         for (int i = 0; i < 9; i++) {
-            if (sudoku.getGrid().getCell(i, col).getValue() == num && i != ligne) {
+            if (sudoku.getGrid().getCell(i, col).getValue() == num && i != row) {
                 return false;
             }
         }
         return true;
     }
 
-    private boolean isValidBox(int num, int Row, int Col) {
+    private boolean isValidBox(int num, int boxStartRow, int boxStartCol) {
         for (int i = 0; i < 3; i++) {
             for (int j = 0; j < 3; j++) {
-                int ligne = i + Row;
-                int col = j + Col;
-                if (sudoku.getGrid().getCell(ligne, col).getValue() == num && (ligne != this.ligne || col != this.col)) {
+                int row = i + boxStartRow;
+                int col = j + boxStartCol;
+                if (sudoku.getGrid().getCell(row, col).getValue() == num && (row != this.row || col != this.col)) {
                     return false;
                 }
             }
diff --git a/SudokuSolver.java b/SudokuSolver.java
index fbdd8d8..6ac316b 100644
--- a/SudokuSolver.java
+++ b/SudokuSolver.java
@@ -1,6 +1,19 @@
 public class SudokuSolver {
     public boolean solve(Grid grid) {
-        return solveRecursive(grid);
+        long startTime = System.currentTimeMillis(); // Temps de début de la résolution
+        
+        boolean isSolved = solveRecursive(grid);
+        
+        long endTime = System.currentTimeMillis(); // Temps de fin de la résolution
+        long duration = endTime - startTime; // Calcul de la durée de résolution
+        
+        if (isSolved) {
+            System.out.println("La grille a été résolue en " + duration + " millisecondes.");
+        } else {
+            System.out.println("La grille est insoluble.");
+        }
+        
+        return isSolved;
     }
     
     private boolean solveRecursive(Grid grid) {
diff --git a/SudokuUI.java b/SudokuUI.java
index ca1d89f..af5bcb1 100644
--- a/SudokuUI.java
+++ b/SudokuUI.java
@@ -2,6 +2,8 @@ import javax.swing.*;
 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.io.File;
+import javax.swing.filechooser.FileNameExtensionFilter;
 
 public class SudokuUI extends JFrame {
     private Sudoku sudoku;
@@ -23,6 +25,8 @@ public class SudokuUI extends JFrame {
         // Création du bouton "Résoudre"
         createSolveButton();
 
+        // Création des boutons "Charger" et "Générer"
+        createLoadButton();
         createGenerateButton();
 
         // Calcul de la taille préférée de la fenêtre en fonction de la taille de la grille
@@ -80,6 +84,28 @@ public class SudokuUI extends JFrame {
         add(buttonPanel, BorderLayout.SOUTH);
     }
 
+    private void createLoadButton() {
+        JButton loadButton = new JButton("Charger");
+        loadButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                JFileChooser fileChooser = new JFileChooser();
+                FileNameExtensionFilter filter = new FileNameExtensionFilter("Fichiers de grille Sudoku (*.gri)", "gri");
+                fileChooser.setFileFilter(filter);
+                int returnValue = fileChooser.showOpenDialog(null);
+                if (returnValue == JFileChooser.APPROVE_OPTION) {
+                    File selectedFile = fileChooser.getSelectedFile();
+                    sudoku.loadGridFromFile(selectedFile.getAbsolutePath());
+                    updateGrid();
+                }
+            }
+        });
+
+        JPanel buttonPanel = new JPanel();
+        buttonPanel.add(loadButton);
+        add(buttonPanel, BorderLayout.NORTH);
+    }
+
     private void createGenerateButton() {
         JButton generateButton = new JButton("Générer");
         generateButton.addActionListener(new ActionListener() {
@@ -101,7 +127,6 @@ public class SudokuUI extends JFrame {
         add(buttonPanel, BorderLayout.EAST);
     }
     
-    
 
     private void updateGrid() {
         Grid grid = sudoku.getGrid();