Por: Mapachana
-
Este scrabble no admite letras con tilde, ñ o ç.
-
Todas las palabras del diccionario que se le pasen al scrabble deben estar en minúscula.
-
Ha sido probado con g++ 5.4.0 con el estándar c++11.
La estructura del proyecto es la siguiente:
Resultado de la orden tree en la carpeta raíz del proyecto.
Se ha seguido la estructura genérica de carpetas del curso.
En la carpeta data se recogen:
-
Los diccionarios dados en el material de la práctica: diccionario1.txt, diccionario2.txt, diccionario500.txt, diccionario1000.txt.
-
Diccionario con más de 10000 palabras del español al que se le han eliminado las tildes, ñ, ç y mayúsculas: listado_general.txt .
-
Ficheros letras.txt y frecuencias.txt que se generan en cada ejecución del programa Scrabble ya que dependen del diccionario (pueden eliminarse).
Ficheros fuente, donde están las implementaciones de las clases y los ficheros principales de los programas.
Archivos de cabecera de las clases.
Donde se guarda la documentación al generarla con el archivo letras.doxy.
He implementado tres clases: Diccionario, Letra y Bolsa_Letras.
No he implementado la clase Conjunto_Letras ya que me parecía redundante con Bolsa_Letras, porque usando el campo cantidad de la clase Letra podía obtener las probabilidades y, por tanto, no necesitaba dos clases separadas en las que en una las letras no se repitieran y en la otra sí. Además la función principal de Conjunto_Letras, mantener el fichero Letras.txt en memoria, se puede llevar a cabo usando la clase Bolsa_Letras.
Por estos motivos, he prescindido de la clase Conjunto_Letras y la he "mezclado" con Bolsa_Letras.
La clase Diccionario mantiene en memoria un fichero diccionario, que contiene las palabras que se permiten formar en el juego y genera los ficheros letras.txt y frecuencias.txt.
Clase iterador del tipo diccionario.
La clase Letra describe una letra, que tiene tres campos:
-
letra: Caracter que representa la letra.
-
cantidad: Numero de letras que hay en la bolsa de letras (depende del diccionario).
-
puntos: Puntos que vale la letra (depende del diccionario).
La cantidad y puntos de cada letra se calcularán en otra clase.
Esta clase se encarga de mantener todas las letras necesarias en memoria, calcular su cantidad y puntuación, generar las letras del jugador y buscar las soluciones del juego para ambos modos.
Es una pequeña prueba de la mayor parte de los métodos de diccionario.
Prueba como genera un diccionario los ficheros letras.txt y frecuencias.txt.
Programa principal, dadas unas letras busca las mejores puntuaciones de acuerdo a dos criterios: longitud o puntuación de las palabras.
En caso de que con las letras dadas no puedas encontrar ninguna solución válida, esto es, que se pueda formar con las letras dadas y que pertenezca al diccionario, se puede escribir no_hay para pasar turno y ver si había alguna solución o no.
Para compilar basta abrir una terminal y hacer make
en el directorio raíz y se compilarán todos los módulos.
Distinguimos entre dos limpiezas:
-
make clean
: Borra los archivos objeto de la carpeta obj. -
make mrproper
: Borra los archivos objeto, los binarios y la documentación.
Para generar la documentación basta ejecutar make documentacion
y se generará en la carpeta doc tanto en html como en LaTeX.
Para ello se usa el archivo letras.doxy.
Para ejecutar este módulo la sintaxis es:
./bin/testdiccionario ./data/<diccionario>
Por ejemplo:
./bin/testdiccionario ./data/diccionario1000.txt
Para ejecutar este módulo la sintaxis es:
./data/cantidad_letras ./data/<diccionario> ./data/<fichero_letras> ./data/<fichero_frecuencias>
Por ejemplo:
./data/cantidad_letras ./data/diccionario1000.txt ./data/letras.txt ./data/frecuencias.txt
Para ejecutar este módulo la sintaxis es:
./bin/letras ./data/<diccionario> ./data/<fichero_letras> <num> <P|L>
Donde:
-
num es el número de fichas aleatorias que recibirá el jugador para jugar (Puede ir de 1 a 100).
-
P es el modo por puntos, se buscará la mejor solución en función de los puntos de la palabra.
-
L es el modo por longitud, la mejor solución será la palabra más larga posible.
Por ejemplo:
./bin/letras ./data/diccionario1000.txt ./data/letras.txt 8 P
./bin/letras ./data/diccionario1000.txt ./data/letras.txt 8 L
-
En diversas partes del código se puede ver que he tomado como estándar que el juego tenga 100 fichas (variable numfichas). Esto ha sido así por simplicidad y porque la mayor parte de palabras del español no pasan de los cincuenta caracteres. Además, como la probabilidad de cada letra depende del diccionario formar una palabra larga es muy difícil por probabilidad.
-
No he diseñado la clase diccionario para que acepte mayúsculas por simplicidad, pero si se quisiera bastaría hacer un tolower() en cada lectura del diccionario.