SAE21_2024/Sudoku/grille.java

277 lines
11 KiB
Java
Raw Normal View History

import javax.swing.*;
import java.awt.*;
2024-04-18 19:29:38 +02:00
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
2024-04-27 05:18:18 +02:00
import javax.swing.border.Border;
2024-04-30 02:12:14 +02:00
import javax.swing.text.PlainDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
public class grille extends JComponent{
2024-04-27 20:51:28 +02:00
private static JLabel etat_exportation = new JLabel();
/*tableau de valeurs de la grille de sudoku*/
public static int[][] grid_values = null;
/*Panneau pour la grille */
public static JPanel place_grille = new JPanel();
/*fonction pour afficher graphiquement la grille*/
2024-04-30 12:56:06 +02:00
public static void AfficherGrille (int[][] grille, boolean editable, boolean resolutionManuel, long duree) {
/*paramètre de base de la fenetre*/
JFrame fenetre = new JFrame();
2024-04-22 15:38:29 +02:00
fenetre.setSize(900, 950);
/*fenetre.setResizable(false);*/
fenetre.setLocationRelativeTo(null);
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
2024-04-15 18:46:05 +02:00
place_grille.setSize(900,900);
/*creation grille*/
2024-04-13 20:13:24 +02:00
GridLayout gestionnaire = new GridLayout(9,9,-2,-2);
2024-04-15 18:46:05 +02:00
place_grille.setLayout(gestionnaire);
if(editable){
JTextField[][] case_editable = null;
case_editable = new JTextField[9][9];
2024-04-30 02:12:14 +02:00
2024-04-27 05:18:18 +02:00
for (int ligne = 0; ligne < 9; ligne++) {
for (int col = 0; col < 9; col++) {
if (grille[ligne][col] == 0){
case_editable[ligne][col] = new JTextField("", 1);
2024-04-30 11:18:29 +02:00
case_editable[ligne][col].setDocument(new JTextFieldCharLimit(4));
2024-04-14 23:59:14 +02:00
}else{
2024-04-30 11:18:29 +02:00
case_editable[ligne][col] = new JTextField(1);
case_editable[ligne][col].setDocument(new JTextFieldCharLimit(4));
case_editable[ligne][col].setText(String.valueOf(grille[ligne][col]));
2024-04-14 23:59:14 +02:00
}
2024-04-27 05:18:18 +02:00
case_editable[ligne][col].setFont(new Font("Arial", Font.PLAIN, 30));
case_editable[ligne][col].setHorizontalAlignment(JTextField.CENTER);
if ((ligne % 3 == 0) && (ligne != 0) && (col % 3 == 0) && (col != 0)){
case_editable[ligne][col].setBorder(BorderFactory.createMatteBorder(5,5,2,2,Color.BLACK));
} else if((ligne % 3 == 0) && (ligne != 0)){
case_editable[ligne][col].setBorder(BorderFactory.createMatteBorder(5,2,2,2,Color.BLACK));
} else if ((col % 3 == 0) && (col != 0)){
case_editable[ligne][col].setBorder(BorderFactory.createMatteBorder(2,5,2,2,Color.BLACK));
} else {
case_editable[ligne][col].setBorder(BorderFactory.createMatteBorder(2,2,2,2,Color.BLACK));
}
place_grille.add(case_editable[ligne][col]);
}
}
2024-04-27 05:18:18 +02:00
} else {
2024-04-14 23:59:14 +02:00
JTextField[][] case_modifiable = null;
JLabel[][] case_depart = null;
case_depart = new JLabel[9][9];
case_modifiable = new JTextField[9][9];
2024-04-30 02:12:14 +02:00
2024-04-27 05:18:18 +02:00
for (int ligne = 0; ligne < 9; ligne++) {
for (int col = 0; col < 9; col++) {
if ((grid_values[ligne][col]) == 0) {
case_modifiable[ligne][col] = new JTextField("", 1);
2024-04-30 11:18:29 +02:00
case_modifiable[ligne][col].setDocument(new JTextFieldCharLimit(4));
2024-04-27 05:18:18 +02:00
case_modifiable[ligne][col].setFont(new Font("Arial", Font.PLAIN, 30));
case_modifiable[ligne][col].setHorizontalAlignment(JTextField.CENTER);
2024-04-27 13:34:13 +02:00
if ((ligne % 3 == 0) && (ligne != 0) && (col % 3 == 0) && (col != 0)){
case_modifiable[ligne][col].setBorder(BorderFactory.createMatteBorder(5,5,2,2,Color.BLACK));
2024-04-27 05:18:18 +02:00
} else if ((col % 3 == 0) && (col != 0)){
case_modifiable[ligne][col].setBorder(BorderFactory.createMatteBorder(2,5,2,2,Color.BLACK));
2024-04-27 13:34:13 +02:00
} else if ((ligne % 3 == 0) && (ligne != 0)){
case_modifiable[ligne][col].setBorder(BorderFactory.createMatteBorder(5,2,2,2,Color.BLACK));
2024-04-27 05:18:18 +02:00
}else {
case_modifiable[ligne][col].setBorder(BorderFactory.createMatteBorder(2,2,2,2,Color.BLACK));
}
place_grille.add(case_modifiable[ligne][col]);
2024-04-14 23:59:14 +02:00
} else {
2024-04-27 05:18:18 +02:00
case_depart[ligne][col] = new JLabel(String.valueOf(grid_values[ligne][col]));
case_depart[ligne][col].setFont(new Font("Arial", Font.PLAIN, 30));
case_depart[ligne][col].setHorizontalAlignment(JTextField.CENTER);
2024-04-27 13:34:13 +02:00
if ((ligne % 3 == 0) && (ligne != 0) && (col % 3 == 0) && (col != 0)){
case_depart[ligne][col].setBorder(BorderFactory.createMatteBorder(5,5,2,2,Color.BLACK));
2024-04-27 05:18:18 +02:00
} else if ((col % 3 == 0) && (col != 0)){
case_depart[ligne][col].setBorder(BorderFactory.createMatteBorder(2,5,2,2,Color.BLACK));
2024-04-27 13:34:13 +02:00
} else if ((ligne % 3 == 0) && (ligne != 0)){
case_depart[ligne][col].setBorder(BorderFactory.createMatteBorder(5,2,2,2,Color.BLACK));
2024-04-27 05:18:18 +02:00
} else {
case_depart[ligne][col].setBorder(BorderFactory.createMatteBorder(2,2,2,2,Color.BLACK));
2024-04-27 05:18:18 +02:00
}
place_grille.add(case_depart[ligne][col]);
2024-04-14 23:59:14 +02:00
}
}
}
}
2024-04-26 16:26:26 +02:00
/*bouton(s) grille(s)*/
JButton verifier = null;
JButton exporter = null;
2024-04-15 18:46:05 +02:00
JPanel bouton_grille = new JPanel();
2024-04-27 20:51:28 +02:00
if(editable){
2024-04-27 20:51:28 +02:00
bouton_grille.add(etat_exportation);
exporter = new JButton("exporter");
bouton_grille.add(exporter);
place_grille.add(bouton_grille);
}else{
2024-04-30 12:56:06 +02:00
if(resolutionManuel){
verifier = new JButton("verifier");
bouton_grille.add(verifier);
place_grille.add(bouton_grille);
}else {
JLabel texteTemps = new JLabel("Le programme a mit "+duree+" nanoSecondes pour resoudre la grille");
bouton_grille.add(texteTemps);
}
}
2024-04-15 18:46:05 +02:00
fenetre.add(bouton_grille,BorderLayout.SOUTH);
2024-04-18 19:29:38 +02:00
fenetre.add(place_grille, BorderLayout.CENTER);
2024-04-26 16:26:26 +02:00
/*affichage fenetre*/
fenetre.setVisible(true);
2024-04-14 23:59:14 +02:00
/*System.out.println(grid[0][0].getText());*/
2024-04-18 19:29:38 +02:00
if (verifier != null) { /* Vérification pour s'assurer que verifier a été initialisé */
verifier.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent verifier) {
VerificationGrilleFini();
}
});
}
if (exporter != null) { /* Vérification pour s'assurer que exporter a été initialisé */
exporter.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent exporter) {
2024-04-27 20:51:28 +02:00
for (int i=0; i < 9; i++){
for (int j=0; j < 9; j++){
System.out.print(GrilleActuelle()[i][j]);
2024-04-27 20:51:28 +02:00
}
System.out.println("");
}
if (!(resolveurGrille.resoudreSudoku(GrilleActuelle()))){
2024-04-27 20:51:28 +02:00
etat_exportation.setHorizontalAlignment(SwingConstants.LEFT);
etat_exportation.setText("Sudoku Impossible.");
etat_exportation.setForeground(Color.RED);
} else {
ExporterGrille(GrilleActuelle());
2024-04-27 20:51:28 +02:00
etat_exportation.setText("");
}
}
});
}
}
/*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;
}
2024-04-26 16:26:26 +02:00
public static void ExporterGrille(int[][] grille){
2024-04-27 18:56:50 +02:00
try {
JFileChooser filechooser2 = new JFileChooser();
filechooser2.setCurrentDirectory(new File("./grille"));
int result2 = filechooser2.showOpenDialog(null);
if (result2 == JFileChooser.APPROVE_OPTION) {
File selectedFile2 = filechooser2.getSelectedFile();
FileOutputStream fs2 = new FileOutputStream(selectedFile2.getAbsolutePath());
DataOutputStream fichier2 = new DataOutputStream(fs2);
String ligne_a_ecrire = "";
int entier_a_ecrire = 0;
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++){
ligne_a_ecrire = ligne_a_ecrire+String.valueOf(grille[i][j]);
}
entier_a_ecrire = Integer.parseInt(ligne_a_ecrire);
System.out.print(entier_a_ecrire +"\n");
fichier2.writeInt(entier_a_ecrire);
ligne_a_ecrire = "";
}
try {
fs2.close();
}catch(IOException e){
System.err.println("erreur fermeture du fichier");
}
}
}catch(IOException e) {
System.err.println("Erreur ouverture du fichier");
}
}
public static int[][] GrilleActuelle(){
int[][] grilleActuelle = new int[9][9];
for (Component comp : place_grille.getComponents()) {
if (comp instanceof JTextField) {
JTextField textField = (JTextField) comp;
String text = textField.getText().trim();
int value = text.isEmpty() ? 0 : Integer.parseInt(text);
grilleActuelle[place_grille.getComponentZOrder(comp) / 9][place_grille.getComponentZOrder(comp) % 9] = value;
} else if (comp instanceof JLabel) {
JLabel label = (JLabel) comp;
String text = label.getText().trim();
int value = Integer.parseInt(text);
grilleActuelle[place_grille.getComponentZOrder(comp) / 9][place_grille.getComponentZOrder(comp) % 9] = value;
}
}
2024-04-26 16:26:26 +02:00
return grilleActuelle;
2024-04-26 16:26:26 +02:00
}
2024-04-30 14:51:04 +02:00
public static boolean VerificationGrilleFini(){
int[][] soluce_de_la_grille = new int[9][9];
soluce_de_la_grille = resolveurGrille.resoudreGrille(grid_values);
2024-04-30 14:51:04 +02:00
int[][] gActuelle = GrilleActuelle();
for ( int ligne = 0; ligne<9; ligne ++){
for (int col = 0; col <9; col++){
if(soluce_de_la_grille[ligne][col] != gActuelle[ligne][col]){
System.out.println("La grille n'est pas résolue");
return false;
}
}
}
System.out.println("La grille est resolue !!!");
2024-04-30 14:51:04 +02:00
return true;
}
}