import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class SudokuGUI extends JFrame { private Sudoku juego; private JButton[][] botonesTablero; private JPanel panelTablero; private JButton botonDeshacer, botonReiniciar, botonNuevoJuego, botonSeleccionarNivel, botonSalir; private String nivelActual = "facil"; // Nivel por defecto public SudokuGUI() { // Inicializa el juego juego = new Sudoku(); juego.iniciarJuego(nivelActual); // Configura la ventana setTitle("Sudoku"); setSize(400, 600); // Ajusta el tamaño para los nuevos botones setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BorderLayout()); // Panel del tablero panelTablero = new JPanel(new GridLayout(9, 9)); botonesTablero = new JButton[9][9]; inicializarTablero(); // Panel de botones JPanel panelBotones = new JPanel(); panelBotones.setLayout(new GridLayout(2, 3, 10, 10)); // Botones distribuidos en 2 filas // Botón "Deshacer" botonDeshacer = new JButton("Deshacer"); botonDeshacer.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { juego.deshacerUltimaJugada(); actualizarTablero(); } }); panelBotones.add(botonDeshacer); // Botón "Reiniciar" botonReiniciar = new JButton("Reiniciar"); botonReiniciar.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { juego = new Sudoku(); // Reinicia el objeto Sudoku juego.iniciarJuego(nivelActual); actualizarTablero(); } }); panelBotones.add(botonReiniciar); // Botón "Nuevo Juego" botonNuevoJuego = new JButton("Nuevo Juego"); botonNuevoJuego.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { juego = new Sudoku(); // Inicia un nuevo juego juego.iniciarJuego(nivelActual); actualizarTablero(); } }); panelBotones.add(botonNuevoJuego); // Botón "Seleccionar Nivel" botonSeleccionarNivel = new JButton("Seleccionar Nivel"); botonSeleccionarNivel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { seleccionarNivel(); juego = new Sudoku(); juego.iniciarJuego(nivelActual); // Inicia el juego con el nuevo nivel actualizarTablero(); } }); panelBotones.add(botonSeleccionarNivel); // Botón "Salir" botonSalir = new JButton("Salir"); botonSalir.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); // Cierra el programa } }); panelBotones.add(botonSalir); // Agrega los paneles a la ventana add(panelTablero, BorderLayout.CENTER); add(panelBotones, BorderLayout.SOUTH); } private void inicializarTablero() { for (int fila = 0; fila < 9; fila++) { for (int columna = 0; columna < 9; columna++) { JButton boton = new JButton(); int valor = juego.getTablero().getValor(fila, columna); if (valor != 0) { boton.setText(String.valueOf(valor)); boton.setEnabled(false); // Los valores iniciales no se pueden cambiar } else { boton.setText(""); final int f = fila; final int c = columna; boton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { colocarNumero(f, c); } }); } botonesTablero[fila][columna] = boton; panelTablero.add(boton); } } } private void colocarNumero(int fila, int columna) { String input = JOptionPane.showInputDialog(this, "Ingrese un número (1-9):"); try { int numero = Integer.parseInt(input); if (numero >= 1 && numero <= 9) { if (juego.colocarNumero(fila, columna, numero)) { botonesTablero[fila][columna].setText(String.valueOf(numero)); } else { JOptionPane.showMessageDialog(this, "Movimiento inválido."); } } else { JOptionPane.showMessageDialog(this, "Número fuera de rango."); } } catch (NumberFormatException e) { JOptionPane.showMessageDialog(this, "Entrada inválida."); } juego.mostrarMensajeEstado(); if (juego.verificarJuego()) { JOptionPane.showMessageDialog(this, "¡Felicidades! Has completado el Sudoku."); } } private void actualizarTablero() { for (int fila = 0; fila < 9; fila++) { for (int columna = 0; columna < 9; columna++) { int valor = juego.getTablero().getValor(fila, columna); if (valor != 0) { botonesTablero[fila][columna].setText(String.valueOf(valor)); } else { botonesTablero[fila][columna].setText(""); } } } } private void seleccionarNivel() { String[] opciones = {"facil", "intermedio", "dificil"}; nivelActual = (String) JOptionPane.showInputDialog(this, "Selecciona el nivel de dificultad:", "Seleccionar Nivel", JOptionPane.QUESTION_MESSAGE, null, opciones, opciones[0]); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new SudokuGUI().setVisible(true); } }); } }