El juego que nos hemos aventurado a hacer es un “PUZZLE”. Como todo el mundo sabe, el objetivo es completar una imagen que se muestra al inicio de la partida, antes de que se agote el tiempo. La interacción con el usuario se hará mediante el ratón y en la zona de juego que es la siguiente:
Hemos formada nuestro juego con 9 clases, que son las siguientes:
- PantallaPrincipal: es la que contiene el main y, por ello, la que se ejecuta en primer lugar. Desde aquí podrás acceder, pinchando sobre los botones correspondientes, a la pantallaInstrucciones (creando un objeto de la misma al pulsar el botón “Instrucciones”), elegir un nivel (creando un objeto de la pantallaNivel), ir a la pantalla de juego (creando un objeto de PantallaJugar) o cerrar toda la ejecución (con un System.exit(0)).
- PantallaInstrucciones: crea una ventana que muestra una serie de normas a seguir en el juego. Además contiene dos botones que te permiten salir (pues esta ventana no se puede cerrar mediante la cruz de la misma) o ir a la pantalla de juego.

- PantallaNivel: su función principal es dar un valor a las variables que controlan el número de piezas y el tiempo disponible para completar el puzzle, según el nivel que se seleccione. No se puede salir sin hacer clic sobre el botón “OK”, pues hemos anulado la función del botón X del Jframe mediante el siguiente código en el constructor: this.setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE)

- PantallaJugar: es la clase que define la pantalla de juego. Un Jlabel situado en la parte superior, te irá mostrando la información que necesitas en cada momento. Esta clase incluye un Timer que actualiza a cada segundo el tiempo restante que te queda para lograr completar el puzzle y un método pintar( ) que coloca las piezas en su sitio inicial. Los botones de abajo te sirven para definir los cambios en el funcionamiento que quiera hacer el usuario: empezar una nueva partida (llama al método pintar e inicializa el Timer), consultar la pista (crea un objeto de la clase BotonPista), resolver (muestra la solución y finaliza tu partida), comprobar las piezas que lleva bien colocadas (llama al método comprobar polución de la clase Sñlgoritmos), salir (cierra limpiamente el programa con un System.exit(0)) y cambiar de nivel (crea un objeto de PantallaInstrucciones).
- BotonPista: cuando el botón “Pista” de la pantalla de juego es pulsado, se crea un objeto de esta clase que implantará una ventana con la imagen que debes formar. También contiene un Timer para controlar su desaparición al cabo de 5 segundos. Cada vez que se pulsa disminuye el tiempo que te queda en 10 segundos como penalizacion.
- Algoritmos: clase auxiliar que implementa varios métodos que se utilizarán en PantallaJugar. Entre ellos están:
- comprobarSolucion ( ): comprueba si la colocación de las piezas que has puesto en el tablero se corresponde con la correcta, con la imagen bien formada. Si es así te mostrará un mensaje de enhorabuena, y si no te dirá cuantas piezas tienes bien colocadas. Esto se hace gracias a un array donde vamos almacenando que pieza hay en cada posición. Se comprueba a cada segundo si el tablero está completo (no falta ninguna pieza por colocar, bien o mal, en él), utilizando el Timer de la clase PantallaJugar, para que si es así se llame a este método.
- crearAleatorios ( ): crea números aleatorios que se almacenarán en variables para controlar cual es la imagen y el orden de las piezas en cada partida. Por tanto la imagen que aparece al empezar una partida y el orden de las piezas, es aleatorio.
- Audio: define el comportamiento de cualquier objeto de sonido, pues deberá ser de tipo Audio, esta clase esta basada en los ejemplos de teoría. Para que un sonido se reproduzca, tan solo deberás poner nombreObjetoAudio.player.star( ) en el lugar correspondiente y después pararlo cuando querar (por ejemplo al pulsar un botón) con nombreObjetoAudio.player.star( ).
- EventosPiezas: esta clase define el funcionamiento de las piezas de la pantalla de juego. Para ello hemos implementado de MouseListener, y en el método mouseClicked(MouseEvent ev) hemos añadido la funcionalidad que deseábamos que realice cada pieza al pinchar sobre ella con el ratón. Hay que recordar que aunque no se utilicen, hay que poner todos los métodos que contiene el Mouse Listener.
- EventosTablero: se encarga de crear el movimiento de la zona del tablero de la pantalla de juego. Es una clase muy parecida a la anterior, sólo que describe otro comportamiento.
Pues estas son las pautas generales que hemos seguido para hacer el juego que… visto a si, no parece ni complicado xD pero os aseguro que ha dado mucho que pensar. Encima cuando ya parecía todo hecho porque compilaba, nos aparecían errores de ejecución o nos poníamos a jugar y hacía cosas que no debería… cada vez aparecían más problemas. Pero los fuimos resolviendo uno a uno con mucha paciencia y al final… ¡LO CONSEGIMOS!