nettoyage + ecran de victoire

This commit is contained in:
Wilfried BRIGITTE 2024-05-04 14:25:52 +02:00
parent 9e223843ff
commit e1836143cd
5 changed files with 106 additions and 34 deletions

36
Sudoku/JeuFini.java Normal file
View File

@ -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);
}
});
}
}

View File

@ -14,7 +14,7 @@ mainProgramme2.class : mainProgramme2.java menuProgramme2.class
mainProgramme1.class : mainProgramme1.java menuProgramme1.class mainProgramme1.class : mainProgramme1.java menuProgramme1.class
${JC} ${JCFLAGS} mainProgramme1.java ${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 ${JC} ${JCFLAGS} grille.java
menuProgramme2.class : menuProgramme2.java resolveurGrille.class grille.class menuProgramme2.class : menuProgramme2.java resolveurGrille.class grille.class
@ -29,6 +29,9 @@ resolveurGrille.class : resolveurGrille.java
JTextFieldCharLimit.class : JTextFieldCharLimit.java JTextFieldCharLimit.class : JTextFieldCharLimit.java
${JC} ${JCFLAGS} JTextFieldCharLimit.java ${JC} ${JCFLAGS} JTextFieldCharLimit.java
JeuFini.class : JeuFini.java
${JC} ${JCFLAGS} JeuFini.java
### REGLES OPTIONNELLES ### ### REGLES OPTIONNELLES ###
run1 : mainProgramme1.class run1 : mainProgramme1.class

View File

@ -2,6 +2,9 @@ import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.FocusListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusAdapter;
import java.io.*; import java.io.*;
import javax.swing.border.Border; import javax.swing.border.Border;
import javax.swing.text.PlainDocument; import javax.swing.text.PlainDocument;
@ -19,12 +22,15 @@ public class grille extends JComponent{
/*Panneau pour la grille */ /*Panneau pour la grille */
public static JPanel place_grille = new JPanel(); public static JPanel place_grille = new JPanel();
/*variable de la fenetre*/
public static JFrame fenetre = new JFrame();
/*fonction pour afficher graphiquement la grille*/ /*fonction pour afficher graphiquement la grille*/
public static void AfficherGrille (int[][] grille, boolean editable, boolean resolutionManuel, long duree) { public static void AfficherGrille (int[][] grille, boolean editable, boolean resolutionManuel, long duree) {
/*paramètre de base de la fenetre*/ /*paramètre de base de la fenetre*/
JFrame fenetre = new JFrame();
fenetre.setSize(900, 950); fenetre.setSize(900, 950);
/*fenetre.setResizable(false);*/ fenetre.setResizable(false);
fenetre.setLocationRelativeTo(null); fenetre.setLocationRelativeTo(null);
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
@ -34,9 +40,10 @@ public class grille extends JComponent{
GridLayout gestionnaire = new GridLayout(9,9,-2,-2); GridLayout gestionnaire = new GridLayout(9,9,-2,-2);
place_grille.setLayout(gestionnaire); 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){ if(editable){
JTextField[][] case_editable = null;
case_editable = new JTextField[9][9];
for (int ligne = 0; ligne < 9; ligne++) { for (int ligne = 0; ligne < 9; ligne++) {
for (int col = 0; col < 9; col++) { for (int col = 0; col < 9; col++) {
@ -65,28 +72,26 @@ public class grille extends JComponent{
} else { } else {
JTextField[][] case_modifiable = null;
JLabel[][] case_depart = null; JLabel[][] case_depart = null;
case_depart = new JLabel[9][9]; case_depart = new JLabel[9][9];
case_modifiable = new JTextField[9][9];
for (int ligne = 0; ligne < 9; ligne++) { for (int ligne = 0; ligne < 9; ligne++) {
for (int col = 0; col < 9; col++) { for (int col = 0; col < 9; col++) {
if ((grid_values[ligne][col]) == 0) { if ((grid_values[ligne][col]) == 0) {
case_modifiable[ligne][col] = new JTextField("", 1); case_editable[ligne][col] = new JTextField("", 1);
case_modifiable[ligne][col].setDocument(new JTextFieldCharLimit(4)); case_editable[ligne][col].setDocument(new JTextFieldCharLimit(4));
case_modifiable[ligne][col].setFont(new Font("Arial", Font.PLAIN, 30)); case_editable[ligne][col].setFont(new Font("Arial", Font.PLAIN, 30));
case_modifiable[ligne][col].setHorizontalAlignment(JTextField.CENTER); case_editable[ligne][col].setHorizontalAlignment(JTextField.CENTER);
if ((ligne % 3 == 0) && (ligne != 0) && (col % 3 == 0) && (col != 0)){ 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)){ } 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)){ } 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 { }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 { } else {
case_depart[ligne][col] = new JLabel(String.valueOf(grid_values[ligne][col])); 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].setFont(new Font("Arial", Font.PLAIN, 30));
@ -111,7 +116,7 @@ public class grille extends JComponent{
JButton exporter = null; JButton exporter = null;
JPanel bouton_grille = new JPanel(); JPanel bouton_grille = new JPanel();
/*affichage des boutons en fonction du programme lancé*/
if(editable){ if(editable){
bouton_grille.add(etat_exportation); bouton_grille.add(etat_exportation);
exporter = new JButton("exporter"); exporter = new JButton("exporter");
@ -134,8 +139,41 @@ public class grille extends JComponent{
/*affichage fenetre*/ /*affichage fenetre*/
fenetre.setVisible(true); 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é */ if (verifier != null) { /* Vérification pour s'assurer que verifier a été initialisé */
verifier.addActionListener(new ActionListener() { verifier.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent verifier) { public void actionPerformed(ActionEvent verifier) {
@ -147,13 +185,6 @@ public class grille extends JComponent{
if (exporter != null) { /* Vérification pour s'assurer que exporter a été initialisé */ if (exporter != null) { /* Vérification pour s'assurer que exporter a été initialisé */
exporter.addActionListener(new ActionListener() { exporter.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent exporter) { 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("");
}
if (!(resolveurGrille.resoudreSudoku(GrilleActuelle()))){ if (!(resolveurGrille.resoudreSudoku(GrilleActuelle()))){
etat_exportation.setHorizontalAlignment(SwingConstants.LEFT); etat_exportation.setHorizontalAlignment(SwingConstants.LEFT);
etat_exportation.setText("Sudoku Impossible."); etat_exportation.setText("Sudoku Impossible.");
@ -205,6 +236,7 @@ public class grille extends JComponent{
return null; return null;
} }
/*fonction pour exporter une grille en fichier .gri*/
public static void ExporterGrille(int[][] grille){ public static void ExporterGrille(int[][] grille){
try { try {
@ -223,7 +255,6 @@ public class grille extends JComponent{
ligne_a_ecrire = ligne_a_ecrire+String.valueOf(grille[i][j]); ligne_a_ecrire = ligne_a_ecrire+String.valueOf(grille[i][j]);
} }
entier_a_ecrire = Integer.parseInt(ligne_a_ecrire); entier_a_ecrire = Integer.parseInt(ligne_a_ecrire);
System.out.print(entier_a_ecrire +"\n");
fichier2.writeInt(entier_a_ecrire); fichier2.writeInt(entier_a_ecrire);
ligne_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(){ public static int[][] GrilleActuelle(){
int[][] grilleActuelle = new int[9][9]; int[][] grilleActuelle = new int[9][9];
@ -259,6 +291,7 @@ public class grille extends JComponent{
return grilleActuelle; return grilleActuelle;
} }
/*fonction pour verifier si la grille actuelle correspond à la grille trouvé en solution*/
public static boolean VerificationGrilleFini(){ public static boolean VerificationGrilleFini(){
int[][] soluce_de_la_grille = new int[9][9]; int[][] soluce_de_la_grille = new int[9][9];
soluce_de_la_grille = resolveurGrille.resoudreGrille(grid_values); 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 ligne = 0; ligne<9; ligne ++){
for (int col = 0; col <9; col++){ for (int col = 0; col <9; col++){
if(soluce_de_la_grille[ligne][col] != gActuelle[ligne][col]){ if(soluce_de_la_grille[ligne][col] != gActuelle[ligne][col]){
System.out.println("La grille n'est pas résolue");
return false; return false;
} }
} }
} }
System.out.println("La grille est resolue !!!"); JeuFini.JeuFini();
fenetre.dispose();
return true; return true;
} }
} }

BIN
Sudoku/grille/test2 Normal file

Binary file not shown.

View File

@ -1,3 +1,5 @@
import java.util.Arrays;
public class resolveurGrille { public class resolveurGrille {
private static int[][] solution = new int[9][9]; 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*/ /*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*/ /*Vérifier la ligne*/
for (int x = 0; x < 9; x++) { for (int x = 0; x < 9; x++) {
if (grille[row][x] == num) { if (grille[row][x] == num) {
return false; return false;
} }
} }
/*Vérifier la colonne*/ /*Vérifier la colonne*/
for (int x = 0; x < 9; x++) { for (int x = 0; x < 9; x++) {
if (grille[x][col] == num) { if (grille[x][col] == num) {
@ -70,7 +71,6 @@ public class resolveurGrille {
} }
} }
} }
return true; return true;
} }
} }