Puzzle Deslizante resuelto con Algoritmo A* en JavaFX

Aprende cómo construir el clásico juego del 8-Puzzle (y 15-Puzzle) en JavaFX y cómo implementar el algoritmo A* con la heurística de Manhattan para resolverlo automáticamente.

J

JJ Arroyo

6 de marzo de 2026 10 min de lectura

Puzzle Deslizante resuelto con Algoritmo A* en JavaFX

El clásico problema del puzzle deslizante (8-puzzle en un tablero de 3x3 o 15-puzzle en un 4x4) es un excelente ejercicio para aplicar algoritmos de búsqueda y pathfinding en Inteligencia Artificial.

En este artículo te presento un proyecto completo construido en JavaFX donde no solo podrás jugar mezclando y resolviendo el puzzle manualmente, sino que la computadora puede hallar la solución óptima usando el Algoritmo A*.

La Interfaz de Usuario con JavaFX

El proyecto cuenta con un diseño premium utilizando variables CSS y fondos oscuros (Dark Mode), que le da una apariencia fenomenal.

En la clase MainView, utilizamos un GridPane dinámico que cambia dependiendo de si seleccionamos el modo 3x3 o 4x4:

// Contenedor principal del tablero
VBox gridContainer = new VBox();
gridContainer.setAlignment(Pos.CENTER);
gridContainer.getStyleClass().add("puzzle-container");

gridPane = new GridPane();
gridPane.setAlignment(Pos.CENTER);
gridPane.setHgap(10);
gridPane.setVgap(10);

gridContainer.getChildren().add(gridPane);

Y para los indicadores de desempeño, creamos unas tarjetas de estadísticas ("Stat Cards") que se actualizan en tiempo real:

private VBox createStatCard(String titleText, String valueText, String valueStyleClass) {
    VBox card = new VBox(5);
    card.setAlignment(Pos.CENTER);
    card.getStyleClass().add("stat-card");

    Label title = new Label(titleText);
    title.getStyleClass().add("stat-title");

    Label value = new Label(valueText);
    value.getStyleClass().add("stat-value");
    value.getStyleClass().add(valueStyleClass);

    card.getChildren().addAll(title, value);

    card.setMinWidth(150);
    return card;
}

El Algoritmo A* y la Distancia de Manhattan

Para resolver el puzzle de la manera más rápida posible se necesita una buena heurística. La Distancia de Manhattan calcula cuántos movimientos le tomaría a cada pieza llegar a su posición correcta asumiendo que no tiene obstáculos obstaculizando el camino.

En nuestra clase AStarSolver, implementamos una cola de prioridad (PriorityQueue) que siempre explorará los estados (PuzzleState) con el menor costo ( f(n) = g(n) + h(n) ), donde ( g(n) ) es el costo (o profundidad) actual y ( h(n) ) es la distancia Manhattan calculada a la meta.

Dado el inmenso número de permutaciones posibles especialmente en un tablero 4x4 (15-Puzzle), usar una heurística admisible y guardar en memoria (HashSet) los estados ya visitados previene evaluaciones repetidas, salvando un inmenso poder de procesamiento.

Descarga el Proyecto Completo

Puedes sumergirte en este proyecto JavaFX por ti mismo. Examina a fondo cómo interactúa la interfaz de usuario con la lógica de resolución, o simplemente pasa un rato tratando de romper tu propio récord.


Con este código base puedes crear tus propios algoritmos como BFS o DFS para comparar tiempos de resolución y número de operaciones, lo cual es excelente práctica académica, ¡o simplemente jugar un buen rato personalizando la paleta de colores CSS!

forumComentarios

Deja tu comentario

progress_activityCargando comentarios...