Profesores: Jorge Escalona / Tobías Bolívar Página 1 de 5 Estructura de Datos Proyecto Final (25%) Introducción: Klotski es un juego rompecabezas para un sólo jugador. El juego se compone de un tablero ocupado por piezas y muros, y el objetivo del juego es desplazar una de las piezas de su posición inicial a una posición objetivo. Klotski es una generalización de un juego de piezas de madera de origen incierto, llamado en francés L âne rouge. Parece que la primera versión informática del juego fue para Windows 3.1. En la actualidad, hay una versión para Linux llamada Gnome Klotski o gnotski (hay otra llamada glotski que no es exactamente igual a la que pedimos) y otra escrita en python que funciona en Linux y Windows, disponible en http://phil.freehackers.org/klotski/. En la siguiente figura se muestra una imagen con la implementación del juego. Requisitos 1. El juego se compone de varios niveles, y en cada nivel habrá un tablero diferente. 2. El tablero está dividido en cuadrados, de modo que cada elemento que contiene ocupa uno o varios cuadrados contiguos (no se consideran contiguos cuadrados que se toquen en un único punto). 3. Los diferentes elementos del tablero son: Piezas Una pieza singular Muros Puertas Posición objetivo 4. La pieza singular encajará completamente en la posición objetivo. 5. Las piezas (y sólo ellas) se pueden desplazar por el tablero, horizontal o verticalmente, pero no pueden moverse por encima de otras piezas o de muros. Cualquier pieza puede moverse o colocarse encima de la posición objetivo. Únicamente la pieza singular puede moverse o colocarse encima de las puertas. 6. El programa leerá cada descripción de nivel de un fichero de texto. El fichero para el nivel N se llamará nivel_n.txt. 7. El formato de un fichero de nivel es el siguiente:
Profesores: Jorge Escalona / Tobías Bolívar Página 2 de 5 La primera línea es el nombre del nivel. El nombre contendrá como mucho 40 caracteres. La segunda línea contiene dos números naturales, el primero es el ancho del tablero en cuadrados, y el segundo la altura del tablero en cuadrados. En principio no hay límite en ambos números, excepto que puedan representarse como un entero del lenguaje de programación. Las siguientes líneas, tantas como la altura del tablero en cuadrados, representarán el tablero. En cada línea, cada carácter representará qué elemento ocupa el cuadrado correspondiente del tablero (por tanto, en el tablero inicial no puede haber elementos solapados). Los diferentes elementos se representan de la siguiente forma: o Pieza singular: * o Resto de las piezas: a - z (Letra minúscula ASCII) o Muro: # o Puerta: - o Posición objetivo:. o Cuadrado vacío: o & (espacio en blanco) Si una pieza está definida por caracteres que no ocupan cuadrados conexos, el programa deberá detectarlo y dar un mensaje de error adecuado. Si una línea contiene menos caracteres que el ancho del tablero, se considerará que los cuadrados no representados están vacíos. Un ejemplo de archivo, que representa el nivel de la figura 1, es el siguiente: Forget me not (ane rouge) 10 11 &&&&&&&&&& &&&&&&&&&& &&######&& &&#a**b#&& &&#a**b#&& &&#cdde#&& &&#cfge#&& &&#a&&b#&& &&##--##&& &&&&&&&&.. &&&&&&&&.. 8. Podrán añadirse nuevos niveles al juego incorporando nuevos archivos de nivel, sin necesidad de recompilar el programa. En todo caso, se puede suponer que la numeración de los niveles es consecutiva. 9. La pantalla del juego contendrá al menos: El tablero El nombre del nivel El número de movimientos hecho hasta el momento Los botones o menús necesarios 10. Las piezas y los muros se representarán de modo que aparezcan conexos, inclusive si ocupan varios cuadrados del tablero. 11. Todas las piezas, excepto la singular, se representarán de la misma forma. 12. Cada pieza diferente que se mueve se considera un movimiento. Al mover una pieza que acaba de ser movida se considera que es una continuación del movimiento anterior, y no cuenta como movimiento. 13. Si la pieza que se está moviendo se vuelve a colocar en la posición donde estaba cuando se comenzó el movimiento actual (que puede haber tenido varios sub-movimientos), se considerará que este movimiento no ha existido, y se decrementará por tanto el contador de movimientos. 14. La puntuación, en cada nivel, es el número de movimientos realizados para llevar la pieza singular de su posición inicial a la posición objetivo. La mejor puntuación, obviamente, es la más baja. 15. El programa, al iniciar, cargará el nivel que se estaba resolviendo la última vez que se utilizó el programa, tal y como lo dejó el jugador, y se mostrará en la pantalla. Si es la primera vez que se ejecuta el programa, se cargará el nivel 1.
Profesores: Jorge Escalona / Tobías Bolívar Página 3 de 5 16. Cómo se mueven las piezas queda a discreción de los alumnos, puede ser mediante el ratón o el teclado, apareciendo o no una pieza seleccionada, etc. En todo caso, el procedimiento tiene que ser intuitivo y no debe basarse en la representación interna de las piezas. 17. Se permitirá deshacer el último movimiento realizado, y sucesivamente los anteriores. Para ello el programa deberá memorizar todos los movimientos realizados desde el comienzo del nivel. De esta manera, mediante sucesivos deshaceres, debería ser posible retornar al estado inicial del nivel que se está resolviendo. Esto último debe ser posible aunque se haya cargado un nivel que se había dejado a medias la última vez que se utilizó el programa. 18. El nivel se considerará completo cuando la pieza singular esté en la posición objetivo. El programa debe detectar esto automáticamente. 19. El programa mantendrá un registro de los 10 mejores records de cada nivel. 20. Existirán al menos botones o menús para: Proporcionar instrucciones del juego Mostrar los créditos del juego (quién lo ha hecho) Cambiar a otros niveles del juego Reiniciar el nivel Deshacer movimientos Mostrar records del nivel actual. Salir (preguntará si se quiere salvar el juego) Clases a Implementar (Paquete xklotski): 1. Clase XKlotskiException: public class XKlotskiException extends Exception{ public XKlotskiException (); public XKlotskiException (String msg){ super(msg); 2. Clase XJugador: public class XJugador { private String nombre; private int nivel_actual; private int nro_mov; private java.util.list movs_nivel; public XJugador(); //metodos getters y setters 3. Clase XPieza: Public clase XPieza{ private int id_pieza; private int tipo_pieza; //0: Pieza singular;1:resto de las piezas; 2:Muro;3:Puerta;4:Posición objetivo; // 5: Cuadrado vacío public XPieza( ); //métodos getters y setters
Profesores: Jorge Escalona / Tobías Bolívar Página 4 de 5 4. Clase XKlotski //imports public class XKlotski { //atributos //constructores public XKlotski (); //crea una instancia de la clase inicializando las estructuras necesarias para el control del juego //métodos public void cargarjuego(string nombrearchivo) throws XKlotskiException; //carga un nuevo juego desde el archivo indicado como parámetro //genera una excepción si hay algún error cargando el archivo public void guardarjuego(xjugador jugadoractual) throws XKlotskiException; //guarda la información del juego actualn en el archivo del jugador actual //genera una excepción si hay algún error guardando el archivo public int moverpieza(xpieza pieza, char direccion) throws XKlotskiException; //mueve una pieza en la dirección indicada como parámetro: // i: izquierda // d: derecha // a: arriba // b; abajo // devuelve 0 si la jugada se realizó con éxito // devuelve 1 si la jugada completa el juego //genera una excepción si la pieza o el movimiento es inválido public int contadormovimientos(); //devuelve el numero de movimientos realizados por el jugador en el juego actual public java.util.list recordsnivel(int nivel) throws XKlotskiException; //devuelve una lista con los records del nivel actual //genera una excepción si hay algún error public int esnuevorecord(int nivel, int cantmovidas) //devuelve un número entero entre 1 y 10 si la cantidad de movimientos //está entre los diez mejores records //si no devuelve 0 public void guardarnuevorecord(int nivel, String jugador, int cantmovidas) throws XKlotskiException //guarda el Nuevo record en el archive de records de cada nivel //genera una excepción si hay algún error public XMatriz matrizjuego()throws XKlotskiException; //devuelve una instancia de la clase XMatriz //conteniendo en cada celda la información de la pieza o espacio que hay en ella.
Profesores: Jorge Escalona / Tobías Bolívar Página 5 de 5 Por último, debe implementar una clase denominada Klotski_App que permita probar cada una de las características del juego. La interfaz de esta aplicación puede ser en forma gráfica u orientada a caracteres según su conveniencia. Entrega #1: Semana 10 Paquete xklotski con todos sus módulos y dependencias implementadas. Entrega #2: Semana 15 Aplicación Klotski_App Informe Final del Proyecto Nota: El Informe del Programa debe estar conformado por: Portada. Indice. Introducción. Planteamiento del Problema. Diagrama de Clases Estrategias de Resolución de Problemas. Consideraciones y/o Restricciones.