1) Implementación de las utilidades para el juego (archivos, listas...)Este deliverable tiene tres partes:
1.1)
Listas1.2)
Hash1.3)
Archivos de configuración
1.1) ListasEste módulo ha sido el más sencillo, es la implementación de una lista, en la que cada nodo sólo se conecta con el siguiente. Para hacer la lista más eficiente para cuándo hay más de un nodo, y no tener que iterar cada vez que se quiera añadir uno, lo que hemos hecho ha sido añadir un puntero al último nodo, de esta manera añadir es mucho más rápido.
1.2) HashEste ha sido el más complicado, pero no porque fuese realmente complicado para su uso, pero cómo tenía pensado publicarlo en acabar el juego en una librería que tengo en mente, pues he trabajado duro en ello.
Bueno, el tipo del hash son 64 bits sin signo (8 bytes), teniendo a
it cómo el índice del caracter actual, y a
val cómo el caracter en cuestión, se hacen las siguientes operaciones (muy largas de describir (ver operaciones binarias de C)):
hash -= (1 << it) + ~it / 7;
hash /= ((it + 1) << 3);
hash *= val;Luego se parte el hash en dos partes de 4 bytes cada una, y se intercambian los valores de:
Byte 1 y Byte 4
Byte 2 y Byte 3Esto en las dos partes, cuándo esto ha finalizado se mueven todos los bits una posición a la derecha (o dividir por 2). Pasamos una máscara al hash, que es la siguiente:
hash = ((3 << (hash + 1)) * hash * 7)Y ya, para finalizar devolvemos lo siguiente:
hash = (hash ^ ~it) / lengthDonde
length es la longitud de la cadena que nos han enviado.
1.3) Archivos de configuraciónLa idea de hacer esto era que en el juego se pudiesen crear partidas predefinidas, guardar las partidas y cargarlas (por supuesto). El formato de un archivo de configuración es el siguiente:
Si tenemos READ, se muestra 'cadena para mostrar' y se pide el valor de la variable, esto se puede usar para valores cómo nombres y demás. Lo que hace el código para cargar un archivo es:
1) Abrir el archivo
2) Leer las dos primeras palabras
3) Leer lo que queda de línea
4.1) Si no es READ, asignamos a la constante el valor
4.2.1) Si es READ, leemos una nueva línea
4.2.2) Pedimos datos al usuario
Repetimos los pasos del 2 al 4 hasta que encontramos el fin del fichero, y luego metemos el fichero en una lista de archivos que tiene el contexto de la librería.