Adivina la Palabra

Constantemente se busca algo que hacer en nuestro momentos de ocio o también necesitamos de alguna actividad para disminuir nuestro estrés.

Adivina la Palabra es un juego el cual no solo ayuda a disminuir una alta tasa de aburrimiento y estrés en las personas, sino que también, al jugarlo como pasatiempo, se va adquiriendo conocimiento de manera didáctica. De esta forma el jugador podrá potenciar sus habilidades cognitivas relacionadas al lenguaje, tales como el vocabulario y la ortografía, potenciando así su creatividad.



Análisis del Problema

Adivina la palabra está basado en el recientemente popular juego de navegador Wordle, el cual consiste en identificar una palabra de 5 letras en 6 intentos donde al final de cada uno se muestran qué letras corresponden a la palabra y si se encuentran en la posición correcta.

Nuestro proyecto implementa este juego de forma offline permitiendo jugarlo cuando se desee, a diferencia de Wordle que es una palabra al día. También agrega modos con palabras de 6 o 7 letras, distintas dificultades que imponen un límite de tiempo a la partida y la posibilidad de consultar la definición de la palabra al terminar, *esta última funcionalidad requiere conexión a internet.



Requerimientos del Programa

Caso de Uso 1
Nombre: Elegir cantidad de letras
Descripción: El usuario elige la cantidad de letras con la que desea jugar.
Actor: Usuario de Adivina la Palabra.
Precondiciones: El programa debe estar ejecutándose, mostrando el menú principal del juego.

Flujo Normal:
  1. El usuario presiona la cantidad de letras con la que desea jugar (cinco, seis o siete).
  2. El sistema muestra un nuevo submenú: Selecciona la dificultad.
Flujo Alternativo 1:
  1. El usuario no hace click en ninguna cantidad de letras.
  2. El sistema no ejecuta acción alguna, queda en el mismo estado.

Postcondiciones: Se puede seleccionar la dificultad de juego.
Caso de Uso 2
Nombre: Elegir dificultad de juego
Descripción: El usuario elige la dificultad con la que desea jugar Adivina la Palabra (tiempo del cronómetro).
Actor: Usuario de Adivina la Palabra.
Precondiciones: El usuario debe haber escogido con anterioridad la cantidad de letras con la que desea jugar.

Flujo Normal:
  1. El usuario selecciona la dificultad con la que desea completar el juego (5 minutos, 3 minutos o 1 minuto).
  2. El sistema elige una palabra al azar de la cantidad de letras escogida y comienza a correr el cronómetro.
  3. El sistema muestra la vista de juego, mostrando el contador.
Flujo Alternativo 1:
  1. El usuario selecciona “Modo libre”.
  2. El sistema elige una palabra al azar de la cantidad de letras escogida.
  3. El sistema muestra la vista de juego, sin contador.
Flujo Alternativo 2:
  1. El usuario no hace click en ninguna dificultad.
  2. El sistema no ejecuta acción alguna, queda en el mismo estado.

Postcondiciones: Se puede comenzar a ingresar palabras en el juego, intentando adivinar la palabra.
Caso de Uso 3
Nombre: Ingreso de una palabra
Descripción: El usuario ingresa una palabra, intentando acertar la elegida por el sistema.
Actor: Usuario de Adivina la Palabra.
Precondiciones: Debe existir un tipo de juego escogido (cantidad de letras y dificultad), lo que conlleva la existencia de la palabra a encontrar.

Flujo Normal:
  1. El usuario ingresa una palabra existente, según el diccionario de La Real Academia Española, respetando la cantidad de letras escogida. (No ingresa la palabra correcta, sólo una válida).
  2. El sistema muestra aquellas letras que: (1) no se encuentran en la palabra, con color gris, (2) se encuentran en la palabra en posición incorrecta, en color amarillo y; (3) se encuentran en la posición correcta, en color verde.
Flujo Alternativo 1:
  1. El usuario ingresa la palabra correcta.
  2. El sistema muestra un mensaje informando que el usuario ha ganado la partida, mostrando el tiempo en el que lo ha hecho y en cuántos intentos.
Flujo Alternativo 2:
  1. El usuario ingresa una palabra que no existe según el diccionario de La Real academia Española.
  2. El sistema muestra un mensaje de error en pantalla, solicitando que se ingrese una palabra válida.
Flujo Alternativo 3:
  1. El usuario ingresa una palabra que contiene una menor cantidad de letras a la solicitada.
  2. El sistema muestra un mensaje de error en pantalla, solicitando que se ingrese una palabra del tamaño escogido en el menú principal.
Flujo Alternativo 4:
  1. El usuario ingresa una palabra con tildes.
  2. El sistema muestra un mensaje de error en pantalla, solicitando que se ingrese la palabra sin tildes (u otra palabra).

Postcondiciones: Si no se ha ingresado la palabra correcta y aún quedan intentos y tiempo disponible, se pueden seguir ingresando palabras

Arquitectura de nuestra solución


Diagrama UML

Para el programa descrito con anterioridad, podemos resumir nuestro trabajo en el siguiente diagrama de alto nivel:
UML



Diagrama de Secuencia Propuesto Caso 1

Para visualizar mejor el funcionamiento de nuestro programa, a continuación realizaremos un diagrama de secuencia para el caso 1, donde un usuario hace click en una dificultad (en este caso 5 letras) y comienza a jugar:
DiagramaSecuencia

Pruebas de Solución

#{{index+1}} {{photo.imagename}}
Dificultades

  1. Al ingresar letras con tilde el programa no las reconocía, por lo que creamos una función, quitatildes(), que busca las letras con tilde en una palabra y las reemplaza por su versión sin tilde.
  2. Para facilitar la codificación de nuestro programa, necesitábamos obtener las letras ingresada en cada textfield como una lista, con el objetivo de obtener rápidamente la palabra ingresada. En primera instancia, se intentó crear la lista de textfields directamente en el controller de la scena correspondiente, lo cual no funcionó. La solución fue modificar el archivo .fxml generado por scene builder, agregando las líneas correspondientes obtenidas gracias a la documentación de este, las cuales están encargadas de crear una lista de textfields que se puede implementar rápidamente en el código del controlador mediante "List" y se puede manejar como normalmente se manejaría un objeto List.