diff --git a/Concepteur.java b/Concepteur.java index b613c83..7ac280d 100644 --- a/Concepteur.java +++ b/Concepteur.java @@ -1,15 +1,28 @@ +/* +La classe <code>Concepteur</code> est utilisée pour permettre l'affichage de la fenêtre du programme Concepteur. +@version 1.1 +@author Thomas Follea, Yann Keraudren +*/ + import javax.swing.*; +import java.awt.*; public class Concepteur { - public static void main(String[] args) { // affichage et création de la fenetre - SudokuGridConcepteur sudokuGrid = new SudokuGridConcepteur(); sudokuGrid.setSize(700,600); sudokuGrid.setLocation(100, 100); sudokuGrid.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); sudokuGrid.setVisible(true); + + // Définir des dimensions maximales et minimales + Dimension minSize = new Dimension(600, 500); + Dimension maxSize = new Dimension(800, 700); + + // Appliquer les dimensions maximales et minimales à la fenêtre + sudokuGrid.setMinimumSize(minSize); + sudokuGrid.setMaximumSize(maxSize); } -} +} \ No newline at end of file diff --git a/Joueur.java b/Joueur.java index f20f848..0a530db 100644 --- a/Joueur.java +++ b/Joueur.java @@ -1,15 +1,28 @@ +/* +La classe <code>Joueur</code> est utilisée pour permettre l'affichage de la fenêtre du programme Joueur. +@version 1.1 +@author Thomas Follea, Yann Keraudren +*/ + import javax.swing.*; +import java.awt.*; public class Joueur { - public static void main(String[] args) { // affichage et création de la fenetre - SudokuGridJoueur sudokuGrid = new SudokuGridJoueur(); sudokuGrid.setSize(700,600); sudokuGrid.setLocation(100, 100); sudokuGrid.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); sudokuGrid.setVisible(true); + + // Définir des dimensions maximales et minimales + Dimension minSize = new Dimension(600, 500); + Dimension maxSize = new Dimension(800, 700); + + // Appliquer les dimensions maximales et minimales à la fenêtre + sudokuGrid.setMinimumSize(minSize); + sudokuGrid.setMaximumSize(maxSize); } } diff --git a/LoadButton.java b/LoadButton.java index e8d8bab..b69be9b 100644 --- a/LoadButton.java +++ b/LoadButton.java @@ -1,3 +1,9 @@ +/* +La classe <code>LoadButton</code> est utilisée pour de charger un fichier au format .gri en fonction du programme lancé (le status). +@version 1.1 +@author Thomas Follea, Yann Keraudren +*/ + import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.event.*; @@ -6,28 +12,32 @@ import java.io.*; public class LoadButton implements ActionListener { + // Attributs private int GRID_SIZE; private JTextField[][] grid; private int status; private JFrame parent; + // Constructeur public LoadButton( int GRID_SIZE, JTextField[][] grid, int status) { - this.GRID_SIZE = GRID_SIZE; this.grid = grid; this.status = status; } + // Méthode pour gérer l'action du bouton @Override - public void actionPerformed(ActionEvent e) { + // Execute l'action chargerFichier si le programme Concepteur est lancé if (status == 1) { chargerFichier(); + // Execute l'action chargerFichierNonEditable si le programme Joueur est lancé } else if(status == 2){ chargerFichierNonEditable(); } } + // Méthode pour charger un fichier dans la grille private void chargerFichier() { JFileChooser choix = new JFileChooser(System.getProperty("user.dir")); // ce placer dans le repertoire ou se situe le code pour JFIleChooser choix.setDialogTitle("Choisir un fichier"); @@ -37,7 +47,8 @@ public class LoadButton implements ActionListener { if (choixValide != JFileChooser.APPROVE_OPTION) return; File Selection = choix.getSelectedFile(); - effacerGrille(); // efface que si l'utilisateur choisit un fichier + // efface que si l'utilisateur choisit un fichier + effacerGrille(); try { FileInputStream fich = new FileInputStream(Selection); // permet de réecrire le fichier dans la grille DataInputStream file = new DataInputStream(fich); @@ -63,6 +74,7 @@ public class LoadButton implements ActionListener { } } + // Méthode pour charger un fichier dans la grille private void chargerFichierNonEditable() { JFileChooser choix = new JFileChooser(System.getProperty("user.dir")); choix.setDialogTitle("Choisir un fichier"); @@ -72,6 +84,7 @@ public class LoadButton implements ActionListener { if (choixValide != JFileChooser.APPROVE_OPTION) return; File Selection = choix.getSelectedFile(); + // efface que si l'utilisateur choisit un fichier effacerGrille(); try { FileInputStream fich = new FileInputStream(Selection); @@ -106,7 +119,7 @@ public class LoadButton implements ActionListener { } } - // Effacer le contenu de la grille + // Effacer le contenu de la grille public void effacerGrille() { for (int i = 0; i < GRID_SIZE; i++) { for (int j = 0; j < GRID_SIZE; j++) { @@ -114,5 +127,4 @@ public class LoadButton implements ActionListener { } } } - -} +} \ No newline at end of file diff --git a/Resolver.java b/Resolver.java index cfdf5f7..e380221 100644 --- a/Resolver.java +++ b/Resolver.java @@ -1,106 +1,98 @@ +/* +La classe <code>Resolver</code> est utilisée pour permettre la résolution automatique de la grille avec le temps qu'il faut pour sa résolution automatique. +@version 1.1 +@author Thomas Follea, Yann Keraudren +*/ + import java.util.ArrayList; import javax.swing.*; import java.awt.event.*; -import java.lang.Math.*; import java.text.DecimalFormat; public class Resolver implements ActionListener { + // Attributs private JTextField[][] grid; private int GRID_SIZE; + // Constructeur public Resolver(JTextField[][] grid, int GRID_SIZE) { - this.grid = grid; this.GRID_SIZE = GRID_SIZE; } + // Lorsque l'utilisateur appuie sur le bouton, il exécute l'action resolution(); @Override - public void actionPerformed(ActionEvent e) { - resolution(); } - + // Méthode resolution pour résoudre la grille automatiquement private void resolution() { - long depart = System.nanoTime(); + // Mesurer le temps de départ + long depart = System.nanoTime(); - ArrayList<JTextField> case_vide = new ArrayList<JTextField>(); + // Liste pour stocker les cases vides + ArrayList<JTextField> case_vide = new ArrayList<JTextField>(); - do { + // Boucle pour résoudre la grille + do { + for (int row = 0; row < this.GRID_SIZE; row++) { + for (int col = 0; col < this.GRID_SIZE; col++) { + if (grid[row][col].getText().isEmpty()) { + if (!case_vide.contains(grid[row][col])) { + case_vide.add(grid[row][col]); + } - for (int row = 0; row < this.GRID_SIZE; row++) { - for (int col = 0; col < this.GRID_SIZE; col++) { + // Création de la liste de chiffre possible + ArrayList<String> chiffre_possible = new ArrayList<String>(); - if (grid[row][col].getText().isEmpty()) { + for (int i = 1; i <= GRID_SIZE; i++) { + chiffre_possible.add(""+i); + } + + // Recherche des chiffres present sur la ligne + for (int col2 = 0; col2 < this.GRID_SIZE; col2++) { + if (!grid[row][col2].getText().isEmpty()) { + chiffre_possible.remove(""+grid[row][col2].getText()); + } + } - if (!case_vide.contains(grid[row][col])) { + // Recherche des chiffres sur la colonne + for (int row2 = 0; row2 < this.GRID_SIZE; row2++) { + if (!grid[row2][col].getText().isEmpty()) { + chiffre_possible.remove(""+grid[row2][col].getText()); + } + } - case_vide.add(grid[row][col]); - } - - //Création de la liste de chiffre acceptable - ArrayList<String> chiffre_possible = new ArrayList<String>(); - - for (int i = 1; i <= GRID_SIZE; i++) { - chiffre_possible.add(""+i); - } - - //recherche des chiffres present sur la ligne - for (int col2 = 0; col2 < this.GRID_SIZE; col2++) { - - if (!grid[row][col2].getText().isEmpty()) { - - chiffre_possible.remove(""+grid[row][col2].getText()); - } - - } - - //recherche des chiffres sur la colonne - for (int row2 = 0; row2 < this.GRID_SIZE; row2++) { - - if (!grid[row2][col].getText().isEmpty()) { - - chiffre_possible.remove(""+grid[row2][col].getText()); - } - - } - - //recherche des chiffres dans la région - int rowregion = row/3*3; - int colregion = col/3*3; - for (int row2 = rowregion; row2 < rowregion + 3; row2++) { - for (int col2 = colregion; col2 < colregion + 3; col2++) { - - if (!grid[row2][col2].getText().isEmpty()) { - - chiffre_possible.remove(""+grid[row2][col2].getText()); + // Recherche des chiffres dans la région + int rowregion = row/3*3; + int colregion = col/3*3; + for (int row2 = rowregion; row2 < rowregion + 3; row2++) { + for (int col2 = colregion; col2 < colregion + 3; col2++) { + if (!grid[row2][col2].getText().isEmpty()) { + chiffre_possible.remove(""+grid[row2][col2].getText()); + } + } + } + // Si un seul chiffre possible reste, le placer dans la case vide + if (chiffre_possible.size() == 1) { + grid[row][col].setText(chiffre_possible.getFirst()); + case_vide.remove(grid[row][col]); + } + } } - } } - if (chiffre_possible.size() == 1) { + } while (!case_vide.isEmpty()); + // Calculer la durée de résolution + double durée = (((System.nanoTime()) - depart )* Math.pow(10,-9)); + DecimalFormat df = new DecimalFormat("0.00"); - grid[row][col].setText(chiffre_possible.getFirst()); - case_vide.remove(grid[row][col]); - } - - } - } - } - }while (!case_vide.isEmpty()); + // Afficher un message de fin de résolution avec le temps obtenu + JOptionPane.showMessageDialog(null, "Grille terminé en " + df.format(durée) + " secondes", "Résolution automatique", JOptionPane.INFORMATION_MESSAGE); - double durée = (((System.nanoTime()) - depart )* Math.pow(10,-9)); - DecimalFormat df = new DecimalFormat("0.00"); - - JOptionPane.showMessageDialog(null, "Grille terminé en " + df.format(durée) + " secondes", "Résolution automatique", JOptionPane.INFORMATION_MESSAGE); - - } } - - - diff --git a/SaveButton.java b/SaveButton.java index 0859063..5d2f712 100644 --- a/SaveButton.java +++ b/SaveButton.java @@ -1,43 +1,45 @@ +/* +La classe <code>SaveButton</code> est utilisée pour la sauvegarde de la grille au format .gri à l'aide d'un bouton. +@version 1.1 +@author Thomas Follea, Yann Keraudren +*/ + import javax.swing.*; import java.awt.event.*; import java.io.*; - - - public class SaveButton implements ActionListener { private int GRID_SIZE; private JTextField[][] grid; public SaveButton(int GRID_SIZE, JTextField[][] grid ) { - this.GRID_SIZE = GRID_SIZE; - this.grid = grid; } - @Override - + // Lorsque l'utilisateur appuie sur le bouton, il exécute l'action saveFichier(); public void actionPerformed(ActionEvent e) { - - saveFichier(); - + saveFichier(); } - private void saveFichier() { try { + //Ouvre le fichier de sauvegarde FileOutputStream fr = new FileOutputStream("GrilleNum1.gri"); DataOutputStream fichier = new DataOutputStream(fr); JTextField[][] texte = grid; + + // Parcour la grille for (int i = 0; i < GRID_SIZE; i++) { StringBuilder build = new StringBuilder(); for (int j = 0; j < GRID_SIZE; j++) { String value = texte[i][j].getText(); + // Vérifier si la case contient plus d'un chiffre if (value.length() > 1) { + // Afficher un message d'erreur et arrêter la sauvegarde JOptionPane.showMessageDialog(null, "Une case comporte plus d'un chiffre. Veuillez corriger avant de sauvegarder.", "Erreur", JOptionPane.ERROR_MESSAGE); try { fichier.close(); @@ -46,25 +48,32 @@ public class SaveButton implements ActionListener { } return; // Arrêter la sauvegarde si une case comporte plus d'un chiffre } + + // Si la case est vide, ajouter "0" à la chaine de caractères à sauvegarder if (value.isEmpty()) { build.append("0"); } else { build.append(value); } } + + // Convertir la chaine de caractères en entier et écrire dans le fichier String convert = build.toString(); int write = Integer.parseInt(convert); fichier.writeInt(write); } + + // Fermer le fichier après la sauvegarde try { fichier.close(); } catch (IOException e) { System.err.println("Erreur de fermeture"); } + // Affiche un message de succès JOptionPane.showMessageDialog(null, "Grille sauvegardée avec succès.", "Succès", JOptionPane.INFORMATION_MESSAGE); } catch (IOException e) { + // Affiche un message d'erreur JOptionPane.showMessageDialog(null, "Erreur lors de la sauvegarde de la grille.", "Erreur", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); } } diff --git a/SudokuGridConcepteur.java b/SudokuGridConcepteur.java index 9024f49..acd3483 100644 --- a/SudokuGridConcepteur.java +++ b/SudokuGridConcepteur.java @@ -1,3 +1,10 @@ +/* +La classe <code>SudokuGridConcepteur</code> est utilisée pour initialisé la grille et toutes les fonction, utilisation en rapport avec celle ci (boutons, evenements, etc) +pour le programme du concepteur de la grille du sudoku. +@version 1.1 +@author Thomas Follea, Yann Keraudren +*/ + import javax.swing.*; import java.awt.*; @@ -53,21 +60,13 @@ public class SudokuGridConcepteur extends JFrame { // Bouton pour sauvegarder la grille JButton save = new JButton("Sauvegarder"); - SaveButton saver = new SaveButton(GRID_SIZE,grid); - save.addActionListener(saver); - // Bouton pour chargé la grille JButton load = new JButton("Charger"); - LoadButton loader = new LoadButton(GRID_SIZE, grid, status); - load.addActionListener(loader); - - - bouton.add(load); bouton.add(save); diff --git a/SudokuGridJoueur.java b/SudokuGridJoueur.java index 9626e9e..1d0c59b 100644 --- a/SudokuGridJoueur.java +++ b/SudokuGridJoueur.java @@ -1,3 +1,10 @@ +/* +La classe <code>SudokuGridJoueur</code> est utilisée pour initialisé la grille et toutes les fonction, utilisation en rapport avec celle ci (boutons, evenements, etc) +pour le programme du joueur. +@version 1.1 +@author Thomas Follea, Yann Keraudren +*/ + import javax.swing.*; import java.awt.*; @@ -53,36 +60,27 @@ public class SudokuGridJoueur extends JFrame { // Bouton pour sauvegarder la grille JButton save = new JButton("Sauvegarder"); - SaveButton saver = new SaveButton(GRID_SIZE,grid); - + SaveButton saver = new SaveButton(GRID_SIZE,grid); save.addActionListener(saver); // Bouton pour chargé la grille JButton load = new JButton("Charger"); - LoadButton loader = new LoadButton(GRID_SIZE, grid, status); - + LoadButton loader = new LoadButton(GRID_SIZE, grid, status); load.addActionListener(loader); - //Bouton pour résoudre la grille - JButton resolve = new JButton("Résoudre"); - Resolver resolver = new Resolver(grid, GRID_SIZE); - - resolve.addActionListener(resolver); + //Bouton pour résoudre la grille + JButton resolve = new JButton("Résoudre"); + Resolver resolver = new Resolver(grid, GRID_SIZE); + resolve.addActionListener(resolver); - - - bouton.add(load); bouton.add(save); - bouton.add(resolve); + bouton.add(resolve); // Ajout des panneaux à la fenetre getContentPane().add(gridPanel, BorderLayout.CENTER); getContentPane().add(bouton, BorderLayout.EAST); } - - - }