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