From e1836143cd182442394b5fee4f60f6a279e56b5b Mon Sep 17 00:00:00 2001 From: brigitte Date: Sat, 4 May 2024 14:25:52 +0200 Subject: [PATCH] nettoyage + ecran de victoire --- Sudoku/JeuFini.java | 36 +++++++++++++++ Sudoku/Makefile | 5 +- Sudoku/grille.java | 89 ++++++++++++++++++++++++------------ Sudoku/grille/test2 | Bin 0 -> 36 bytes Sudoku/resolveurGrille.java | 10 ++-- 5 files changed, 106 insertions(+), 34 deletions(-) create mode 100644 Sudoku/JeuFini.java create mode 100644 Sudoku/grille/test2 diff --git a/Sudoku/JeuFini.java b/Sudoku/JeuFini.java new file mode 100644 index 0000000..a1cf2f1 --- /dev/null +++ b/Sudoku/JeuFini.java @@ -0,0 +1,36 @@ +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; + +public class JeuFini { + /*afficher la fenetre de fin*/ + public static void JeuFini(){ + JFrame fenetre = new JFrame(); + fenetre.setSize(500, 200); + fenetre.setTitle("End Game ! (By Wilfried BRIGITTE & Julian GALLEGO)"); + fenetre.setResizable(false); + fenetre.setLocationRelativeTo(null); + fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + GridLayout gestionnaire = new GridLayout(2,1); + fenetre.setLayout(gestionnaire); + + JLabel titre = new JLabel("Bravo vous avez résolu le Sudoku"); + titre.setHorizontalAlignment(JLabel.CENTER); + titre.setFont(new Font("Arial", Font.PLAIN, 30)); + fenetre.add(titre, BorderLayout.CENTER); + + JPanel ligne2 = new JPanel(); + JButton quitter = new JButton("Quitter"); + ligne2.add(quitter); + fenetre.add(ligne2, BorderLayout.CENTER); + + fenetre.setVisible(true); + + quitter.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + System.exit(0); + } + }); + } +} \ No newline at end of file diff --git a/Sudoku/Makefile b/Sudoku/Makefile index 736bd68..01e1d6d 100644 --- a/Sudoku/Makefile +++ b/Sudoku/Makefile @@ -14,7 +14,7 @@ mainProgramme2.class : mainProgramme2.java menuProgramme2.class mainProgramme1.class : mainProgramme1.java menuProgramme1.class ${JC} ${JCFLAGS} mainProgramme1.java -grille.class : grille.java resolveurGrille.class JTextFieldCharLimit.class +grille.class : grille.java resolveurGrille.class JTextFieldCharLimit.class JeuFini.class ${JC} ${JCFLAGS} grille.java menuProgramme2.class : menuProgramme2.java resolveurGrille.class grille.class @@ -29,6 +29,9 @@ resolveurGrille.class : resolveurGrille.java JTextFieldCharLimit.class : JTextFieldCharLimit.java ${JC} ${JCFLAGS} JTextFieldCharLimit.java +JeuFini.class : JeuFini.java + ${JC} ${JCFLAGS} JeuFini.java + ### REGLES OPTIONNELLES ### run1 : mainProgramme1.class diff --git a/Sudoku/grille.java b/Sudoku/grille.java index 805defc..551a516 100644 --- a/Sudoku/grille.java +++ b/Sudoku/grille.java @@ -2,6 +2,9 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.FocusListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusAdapter; import java.io.*; import javax.swing.border.Border; import javax.swing.text.PlainDocument; @@ -19,12 +22,15 @@ public class grille extends JComponent{ /*Panneau pour la grille */ public static JPanel place_grille = new JPanel(); + /*variable de la fenetre*/ + + public static JFrame fenetre = new JFrame(); + /*fonction pour afficher graphiquement la grille*/ public static void AfficherGrille (int[][] grille, boolean editable, boolean resolutionManuel, long duree) { /*paramètre de base de la fenetre*/ - JFrame fenetre = new JFrame(); fenetre.setSize(900, 950); - /*fenetre.setResizable(false);*/ + fenetre.setResizable(false); fenetre.setLocationRelativeTo(null); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @@ -34,9 +40,10 @@ public class grille extends JComponent{ GridLayout gestionnaire = new GridLayout(9,9,-2,-2); place_grille.setLayout(gestionnaire); + JTextField[][] case_editable = null; + case_editable = new JTextField[9][9]; + /*si la grille peut etre entierement éditée (dans le cas du programme1*/ if(editable){ - JTextField[][] case_editable = null; - case_editable = new JTextField[9][9]; for (int ligne = 0; ligne < 9; ligne++) { for (int col = 0; col < 9; col++) { @@ -65,28 +72,26 @@ public class grille extends JComponent{ } else { - JTextField[][] case_modifiable = null; JLabel[][] case_depart = null; case_depart = new JLabel[9][9]; - case_modifiable = new JTextField[9][9]; 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); - case_modifiable[ligne][col].setDocument(new JTextFieldCharLimit(4)); - case_modifiable[ligne][col].setFont(new Font("Arial", Font.PLAIN, 30)); - case_modifiable[ligne][col].setHorizontalAlignment(JTextField.CENTER); + case_editable[ligne][col] = new JTextField("", 1); + case_editable[ligne][col].setDocument(new JTextFieldCharLimit(4)); + 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_modifiable[ligne][col].setBorder(BorderFactory.createMatteBorder(5,5,2,2,Color.BLACK)); + case_editable[ligne][col].setBorder(BorderFactory.createMatteBorder(5,5,2,2,Color.BLACK)); } else if ((col % 3 == 0) && (col != 0)){ - case_modifiable[ligne][col].setBorder(BorderFactory.createMatteBorder(2,5,2,2,Color.BLACK)); + case_editable[ligne][col].setBorder(BorderFactory.createMatteBorder(2,5,2,2,Color.BLACK)); } else if ((ligne % 3 == 0) && (ligne != 0)){ - case_modifiable[ligne][col].setBorder(BorderFactory.createMatteBorder(5,2,2,2,Color.BLACK)); + case_editable[ligne][col].setBorder(BorderFactory.createMatteBorder(5,2,2,2,Color.BLACK)); }else { - case_modifiable[ligne][col].setBorder(BorderFactory.createMatteBorder(2,2,2,2,Color.BLACK)); + case_editable[ligne][col].setBorder(BorderFactory.createMatteBorder(2,2,2,2,Color.BLACK)); } - place_grille.add(case_modifiable[ligne][col]); + place_grille.add(case_editable[ligne][col]); } else { case_depart[ligne][col] = new JLabel(String.valueOf(grid_values[ligne][col])); case_depart[ligne][col].setFont(new Font("Arial", Font.PLAIN, 30)); @@ -111,7 +116,7 @@ public class grille extends JComponent{ JButton exporter = null; JPanel bouton_grille = new JPanel(); - + /*affichage des boutons en fonction du programme lancé*/ if(editable){ bouton_grille.add(etat_exportation); exporter = new JButton("exporter"); @@ -134,8 +139,41 @@ public class grille extends JComponent{ /*affichage fenetre*/ fenetre.setVisible(true); - /*System.out.println(grid[0][0].getText());*/ + /*verification si un chiffre peut être placé à un endroit*/ + for (int ligne = 0; ligne < 9; ligne++) { + for (int col = 0; col < 9; col++) { + final int finalLigne = ligne; + final int finalCol = col; + if (case_editable[ligne][col] != null) { + JTextField textField = case_editable[ligne][col]; + textField.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + VerificationGrilleFini(); + int[][] currentGrid = GrilleActuelle(); + String input = textField.getText().trim(); + if (!input.isEmpty()) { + int newValue = Integer.parseInt(input); + textField.setText(""); + currentGrid = GrilleActuelle(); + if (resolveurGrille.isValid(currentGrid, finalLigne, finalCol, newValue)) { + // Mettre à jour la grille actuelle avec le nouveau chiffre + currentGrid[finalLigne][finalCol] = newValue; + textField.setText(Integer.toString(newValue)); + } else { + // Le chiffre n'est pas valide, réinitialiser le champ + textField.setText(""); + } + } + } + }); + } + } + } + + + /*événement des boutons*/ if (verifier != null) { /* Vérification pour s'assurer que verifier a été initialisé */ verifier.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent verifier) { @@ -146,14 +184,7 @@ public class grille extends JComponent{ if (exporter != null) { /* Vérification pour s'assurer que exporter a été initialisé */ exporter.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent exporter) { - for (int i=0; i < 9; i++){ - for (int j=0; j < 9; j++){ - System.out.print(GrilleActuelle()[i][j]); - } - System.out.println(""); - } - + public void actionPerformed(ActionEvent exporter) { if (!(resolveurGrille.resoudreSudoku(GrilleActuelle()))){ etat_exportation.setHorizontalAlignment(SwingConstants.LEFT); etat_exportation.setText("Sudoku Impossible."); @@ -205,6 +236,7 @@ public class grille extends JComponent{ return null; } + /*fonction pour exporter une grille en fichier .gri*/ public static void ExporterGrille(int[][] grille){ try { @@ -223,7 +255,6 @@ public class grille extends JComponent{ 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 = ""; } @@ -239,6 +270,7 @@ public class grille extends JComponent{ } } + /*fonction pour récupérer les valeurs ACTUELLES de la grille est les placer dans un tableau*/ public static int[][] GrilleActuelle(){ int[][] grilleActuelle = new int[9][9]; @@ -259,6 +291,7 @@ public class grille extends JComponent{ return grilleActuelle; } + /*fonction pour verifier si la grille actuelle correspond à la grille trouvé en solution*/ public static boolean VerificationGrilleFini(){ int[][] soluce_de_la_grille = new int[9][9]; soluce_de_la_grille = resolveurGrille.resoudreGrille(grid_values); @@ -266,12 +299,12 @@ public class grille extends JComponent{ 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 !!!"); + JeuFini.JeuFini(); + fenetre.dispose(); return true; } } \ No newline at end of file diff --git a/Sudoku/grille/test2 b/Sudoku/grille/test2 new file mode 100644 index 0000000000000000000000000000000000000000..647b79c6beee66659bc1e632389a425d6e991dbe GIT binary patch literal 36 acmZQzKmzOw6&M(pBA_Ax42%{HAT|IU-U2KD literal 0 HcmV?d00001 diff --git a/Sudoku/resolveurGrille.java b/Sudoku/resolveurGrille.java index c542f8d..5a404c1 100644 --- a/Sudoku/resolveurGrille.java +++ b/Sudoku/resolveurGrille.java @@ -1,3 +1,5 @@ +import java.util.Arrays; + public class resolveurGrille { private static int[][] solution = new int[9][9]; @@ -45,14 +47,13 @@ public class resolveurGrille { } /*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) { + public 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; + if (grille[row][x] == num) { + return false; } } - /*Vérifier la colonne*/ for (int x = 0; x < 9; x++) { if (grille[x][col] == num) { @@ -70,7 +71,6 @@ public class resolveurGrille { } } } - return true; } }