2024-04-28 01:40:14 +02:00
|
|
|
import javax.swing.*;
|
|
|
|
import java.awt.*;
|
|
|
|
import java.awt.event.ActionEvent;
|
|
|
|
import java.awt.event.ActionListener;
|
|
|
|
|
2024-05-05 00:41:39 +02:00
|
|
|
/**
|
|
|
|
* La classe SudokuButtonListener écoute les événements des boutons dans une interface utilisateur de Sudoku.
|
|
|
|
* Lorsqu'un bouton est cliqué, cette classe affiche une boîte de dialogue demandant à l'utilisateur d'entrer un nombre,
|
|
|
|
* puis met à jour la grille de Sudoku en conséquence.
|
|
|
|
*/
|
2024-04-28 01:40:14 +02:00
|
|
|
public class SudokuButtonListener implements ActionListener {
|
2024-05-04 14:59:38 +02:00
|
|
|
private int row;
|
2024-04-28 01:40:14 +02:00
|
|
|
private int col;
|
2024-05-04 00:13:44 +02:00
|
|
|
private Sudoku sudoku;
|
2024-05-04 14:59:38 +02:00
|
|
|
private JButton[][] buttons;
|
2024-04-28 01:40:14 +02:00
|
|
|
|
2024-05-05 00:41:39 +02:00
|
|
|
/**
|
|
|
|
* Constructeur de SudokuButtonListener.
|
2024-05-05 02:35:21 +02:00
|
|
|
*
|
|
|
|
* @param row L'indice de ligne du bouton.
|
|
|
|
* @param col L'indice de colonne du bouton.
|
|
|
|
* @param sudoku L'instance de Sudoku associée à l'interface utilisateur.
|
2024-05-05 00:41:39 +02:00
|
|
|
* @param buttons La grille de boutons associée à l'interface utilisateur.
|
|
|
|
*/
|
2024-05-04 14:59:38 +02:00
|
|
|
public SudokuButtonListener(int row, int col, Sudoku sudoku, JButton[][] buttons) {
|
|
|
|
this.row = row;
|
2024-04-28 01:40:14 +02:00
|
|
|
this.col = col;
|
2024-05-04 00:13:44 +02:00
|
|
|
this.sudoku = sudoku;
|
2024-05-04 14:59:38 +02:00
|
|
|
this.buttons = buttons;
|
2024-04-28 01:40:14 +02:00
|
|
|
}
|
|
|
|
|
2024-05-05 00:41:39 +02:00
|
|
|
/**
|
|
|
|
* Méthode invoquée lorsque le bouton associé à ce listener est cliqué.
|
|
|
|
* Affiche une boîte de dialogue demandant à l'utilisateur d'entrer un nombre, puis met à jour la grille de Sudoku.
|
2024-05-05 02:35:21 +02:00
|
|
|
*
|
2024-05-05 00:41:39 +02:00
|
|
|
* @param e L'événement ActionEvent associé au clic du bouton.
|
|
|
|
*/
|
2024-04-28 01:40:14 +02:00
|
|
|
@Override
|
|
|
|
public void actionPerformed(ActionEvent e) {
|
2024-05-04 00:13:44 +02:00
|
|
|
String input = JOptionPane.showInputDialog("Entrez un nombre :");
|
|
|
|
if (input != null && input.length() > 0) {
|
|
|
|
try {
|
|
|
|
int num = Integer.parseInt(input);
|
2024-05-05 17:32:57 +02:00
|
|
|
if (num >= 0 && num <= 9) {
|
2024-05-05 02:35:21 +02:00
|
|
|
sudoku.getGrid().getCell(row, col).setValue(num);
|
|
|
|
if (num == 0) {
|
2024-05-05 17:32:57 +02:00
|
|
|
buttons[row][col].setText("");
|
2024-05-05 02:35:21 +02:00
|
|
|
} else {
|
|
|
|
buttons[row][col].setText(String.valueOf(num));
|
|
|
|
}
|
|
|
|
if (!isValid(num, row, col)) {
|
2024-05-05 17:32:57 +02:00
|
|
|
buttons[row][col].setForeground(Color.RED);
|
2024-05-05 02:35:21 +02:00
|
|
|
} else {
|
2024-05-05 17:32:57 +02:00
|
|
|
buttons[row][col].setForeground(Color.BLACK);
|
2024-05-05 02:35:21 +02:00
|
|
|
}
|
2024-05-05 17:32:57 +02:00
|
|
|
sudoku.checkIfGridIsSolved(); // Vérifier si la grille est résolue après chaque ajout de nombre
|
2024-05-04 00:13:44 +02:00
|
|
|
} else {
|
2024-05-05 02:35:21 +02:00
|
|
|
JOptionPane.showMessageDialog(null, "Veuillez entrer un nombre entre 0 et 9.");
|
2024-05-04 00:13:44 +02:00
|
|
|
}
|
|
|
|
} catch (NumberFormatException ex) {
|
|
|
|
JOptionPane.showMessageDialog(null, "Veuillez entrer un nombre valide.");
|
2024-04-30 12:20:16 +02:00
|
|
|
}
|
2024-04-28 01:40:14 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-05-05 00:41:39 +02:00
|
|
|
/**
|
|
|
|
* Vérifie si le nombre entré est valide pour la position donnée dans la grille de Sudoku.
|
2024-05-05 02:35:21 +02:00
|
|
|
*
|
2024-05-05 00:41:39 +02:00
|
|
|
* @param num Le nombre entré par l'utilisateur.
|
|
|
|
* @param row L'indice de ligne de la cellule dans la grille.
|
|
|
|
* @param col L'indice de colonne de la cellule dans la grille.
|
|
|
|
* @return True si le nombre est valide pour cette position, False sinon.
|
|
|
|
*/
|
2024-05-04 14:59:38 +02:00
|
|
|
private boolean isValid(int num, int row, int col) {
|
|
|
|
return isValidRow(num, row) && isValidCol(num, col) && isValidBox(num, row - row % 3, col - col % 3);
|
2024-04-28 01:40:14 +02:00
|
|
|
}
|
|
|
|
|
2024-05-05 00:41:39 +02:00
|
|
|
/**
|
|
|
|
* Vérifie si le nombre est valide dans la ligne donnée de la grille de Sudoku.
|
2024-05-05 02:35:21 +02:00
|
|
|
*
|
2024-05-05 00:41:39 +02:00
|
|
|
* @param num Le nombre entré par l'utilisateur.
|
|
|
|
* @param row L'indice de ligne de la cellule dans la grille.
|
|
|
|
* @return True si le nombre est valide dans cette ligne, False sinon.
|
|
|
|
*/
|
2024-05-04 14:59:38 +02:00
|
|
|
private boolean isValidRow(int num, int row) {
|
2024-04-28 01:40:14 +02:00
|
|
|
for (int i = 0; i < 9; i++) {
|
2024-05-04 14:59:38 +02:00
|
|
|
if (sudoku.getGrid().getCell(row, i).getValue() == num && i != col) {
|
2024-04-28 01:40:14 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2024-05-05 00:41:39 +02:00
|
|
|
/**
|
|
|
|
* Vérifie si le nombre est valide dans la colonne donnée de la grille de Sudoku.
|
2024-05-05 02:35:21 +02:00
|
|
|
*
|
2024-05-05 00:41:39 +02:00
|
|
|
* @param num Le nombre entré par l'utilisateur.
|
|
|
|
* @param col L'indice de colonne de la cellule dans la grille.
|
|
|
|
* @return True si le nombre est valide dans cette colonne, False sinon.
|
|
|
|
*/
|
2024-04-28 01:40:14 +02:00
|
|
|
private boolean isValidCol(int num, int col) {
|
|
|
|
for (int i = 0; i < 9; i++) {
|
2024-05-04 14:59:38 +02:00
|
|
|
if (sudoku.getGrid().getCell(i, col).getValue() == num && i != row) {
|
2024-04-28 01:40:14 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2024-05-05 00:41:39 +02:00
|
|
|
/**
|
|
|
|
* Vérifie si le nombre est valide dans la boîte 3x3 contenant la cellule donnée.
|
2024-05-05 02:35:21 +02:00
|
|
|
*
|
|
|
|
* @param num Le nombre entré par l'utilisateur.
|
|
|
|
* @param boxStartRow L'indice de ligne du coin supérieur gauche de la boîte.
|
|
|
|
* @param boxStartCol L'indice de colonne du coin supérieur gauche de la boîte.
|
2024-05-05 00:41:39 +02:00
|
|
|
* @return True si le nombre est valide dans cette boîte, False sinon.
|
|
|
|
*/
|
2024-05-04 14:59:38 +02:00
|
|
|
private boolean isValidBox(int num, int boxStartRow, int boxStartCol) {
|
2024-04-28 01:40:14 +02:00
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
|
for (int j = 0; j < 3; j++) {
|
2024-05-04 14:59:38 +02:00
|
|
|
int row = i + boxStartRow;
|
|
|
|
int col = j + boxStartCol;
|
|
|
|
if (sudoku.getGrid().getCell(row, col).getValue() == num && (row != this.row || col != this.col)) {
|
2024-04-28 01:40:14 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2024-05-05 02:35:21 +02:00
|
|
|
}
|