import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * 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. */ public class SudokuButtonListener implements ActionListener { private int row; private int col; private Sudoku sudoku; private JButton[][] buttons; /** * Constructeur de SudokuButtonListener. * * @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. * @param buttons La grille de boutons associée à l'interface utilisateur. */ public SudokuButtonListener(int row, int col, Sudoku sudoku, JButton[][] buttons) { this.row = row; this.col = col; this.sudoku = sudoku; this.buttons = buttons; } /** * 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. * * @param e L'événement ActionEvent associé au clic du bouton. */ @Override public void actionPerformed(ActionEvent e) { String input = JOptionPane.showInputDialog("Entrez un nombre :"); if (input != null && input.length() > 0) { try { int num = Integer.parseInt(input); if (num >= 0 && num <= 9) { sudoku.getGrid().getCell(row, col).setValue(num); if (num == 0) { buttons[row][col].setText(""); } else { buttons[row][col].setText(String.valueOf(num)); } if (!isValid(num, row, col)) { buttons[row][col].setForeground(Color.RED); } else { buttons[row][col].setForeground(Color.BLACK); } sudoku.checkIfGridIsSolved(); // Vérifier si la grille est résolue après chaque ajout de nombre } else { JOptionPane.showMessageDialog(null, "Veuillez entrer un nombre entre 0 et 9."); } } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(null, "Veuillez entrer un nombre valide."); } } } /** * Vérifie si le nombre entré est valide pour la position donnée dans la grille de Sudoku. * * @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. */ private boolean isValid(int num, int row, int col) { return isValidRow(num, row) && isValidCol(num, col) && isValidBox(num, row - row % 3, col - col % 3); } /** * Vérifie si le nombre est valide dans la ligne donnée de la grille de Sudoku. * * @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. */ private boolean isValidRow(int num, int row) { for (int i = 0; i < 9; i++) { if (sudoku.getGrid().getCell(row, i).getValue() == num && i != col) { return false; } } return true; } /** * Vérifie si le nombre est valide dans la colonne donnée de la grille de Sudoku. * * @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. */ private boolean isValidCol(int num, int col) { for (int i = 0; i < 9; i++) { if (sudoku.getGrid().getCell(i, col).getValue() == num && i != row) { return false; } } return true; } /** * Vérifie si le nombre est valide dans la boîte 3x3 contenant la cellule donnée. * * @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. * @return True si le nombre est valide dans cette boîte, False sinon. */ private boolean isValidBox(int num, int boxStartRow, int boxStartCol) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { int row = i + boxStartRow; int col = j + boxStartCol; if (sudoku.getGrid().getCell(row, col).getValue() == num && (row != this.row || col != this.col)) { return false; } } } return true; } }