PRÁCTICA Nº 2: 2 sesiones
(del 13 de Marzo al 2 de Abril de 1998)Pilas: Implementación del Tetris
0.- Objetivos.
Implementación de la estructura de datos pila mediante vectores y puntero. Aplicación de las pilas a la programación del juego TETRIS.
1.- Unidades para la especificación de la Estructura de Datos "Pila"
Como primera tarea de la práctica, se pide escribir dos módulos en TP que especifiquen la estructura de datos Pila utilizando dos representaciones diferentes. Este módulos se deben diseñar de la forma más general posible, de manera que sean fácilmente adaptables a cualquier tipo de aplicación.
La primera unidad debe representar la estructura Pila mediante un array. La segunda unidad, por su parte, debe utilizar una representación enlazada de la Pila.
Para facilitar el diseño de las unidades, a continuación se indica cómo debe ser su estructura y qué operaciones deben contener:
UNIT Uni_Cola;
INTERFACE
{Incluir aqui las definiciones de constantes y tipos necesarias en cada representación}
Procedure CREAR_PILA (Var P: Pila);
Function VACIA_PILA ( P: Pila): Boolean;
Function CIMA_PILA ( P: Pila): Valor;
Procedure ELIMINAR_PILA (Var P: Pila);
Procedure INSERTAR_PILA (Var P: Pila; x: Valor );
IMPLEMENTATION
{Escribir aqui el codigo de las operaciones anteriores}
Begin
End.
2.- Descripción del juego y reglas.
En esta práctica se programará una versión del conocido juego TETRIS.
Esta versión del juego consiste en un ‘pozo’ de dimensiones 15 filas por 8 columnas. Cada una de las 8 columnas se representará por una pila, numeradas desde 1 (la del extremo izquierdo del pozo) a la 8 (la del extremo derecho). En cada una de estas 8 columnas se pueden ir apilando las piezas que el programa irá generando aleatoriamente de modo automático.
Cada una de las piezas está constituida por tres caracteres de entre los cinco posibles del conjunto {H, O, X, I, #}, colocados en vertical sin que se repitan dos carateres contiguos. Los caracteres que componen la pieza se almacenan en una cadena, siendo el primer caracter el que ocupa la parte baja de la pieza. Son piezas válidas:
X O ß posición mayor del vector
O H
X I ß posición menor del vector
pero no lo son:
X O
X O
O O
La siguiente pieza a colocar se mostrará en la parte derecha superior del pozo, seguidamente se preguntará al jugador si desea invertirla o no, si el jugador decide darle la vuelta, se dibujará de nuevo la pieza. A continuación se le preguntará al jugador sobre que columna desea dejarla caer.
Un ejemplo de inversión de pieza:
O I
H
Invertir à HI O
En la siguiente figura se puede ver un instante de una partida:
|
|||||||||
PUNTUACION: 15 |
|||||||||
15 FILAS |
# |
SIGUIENTE: |
|||||||
O |
X |
||||||||
I |
X |
I |
O |
||||||
I |
O |
X |
O |
O |
H |
I |
|||
O |
# |
H |
I |
H |
X |
I |
I |
||
# |
O |
X |
X |
X |
H |
H |
H |
||
I |
H |
# |
I |
# |
X |
X |
# |
||
H |
X |
I |
X |
X |
I |
H |
H |
||
X |
O |
# |
O |
O |
O |
# |
# |
||
8 COLUMNAS |
Al seleccionar la columna sobre la que se deja caer la pieza, se apila sobre la pila que representa la columna, cada uno de los caracteres de la pieza. Cuando el caracter que se está apilando coincide con la cima de la pila, desaparecen ambos y se suma un punto al marcador.
No se consideran las posibles coincidencias del mismo carácter en horizontal.
El juego acaba cuando al intentar apilar un nuevo carácter sobre alguna de las columnas se supera el tamaño prefijado de la misma (que es 15). El juego se detiene mostrando opcionalmente si se desea jugar de nuevo.
La visualización del proceso se realizará utilizando una unidad ya compilada, llamada
Uni_Ver, que contendrá las funciones necesarias para el dibujado del estado del pozo en cada instante de la partida. Las funciones de esta unidad seguirán el siguiente interface:PintaVacio ( )
Pinta el pozo vacio.
Pintar (caracter : char; nPila : integer) : boolean;
Pinta un carácter en la pila indicada por nPila. Devuelve TRUE si el carácter se ha pintado correctamente, FALSE si no se ha podido dibujar donde se pedia (por ejemplo se ha seleccionado una columna que no existe ó se ha rebasado el tamaño de la pila)
Anular (nPila : integer) : boolean;
Borra el carácter de la cima de la pila indicada por nPila. Devuelve TRUE si el carácter ha sido efectivamente borrado, FALSE si no ha podido ser borrado (por ejemplo porque la pila está vacía).
PintaPieza (a, b, c : char; puntuacion : integer);
Dibuja la nueva pieza, ‘a’ es el carácter en la posición inferior del vector, ‘b’ en la media y ‘c’ en la superior. También escribe la puntuación actual conseguida por el jugador.
Estas funciones sirven únicamente para actualizar el dibujo, no llevan ninguna cuenta del estado actual del juego, se limitan a pintar o borrar piezas.
El modo de utilizar estas funciones es como sigue: Al inicio de la practica se dibuja el pozo vacío (mediante la función: PintaVacio ( )). Tras cada acción de apilar un carácter hay que llamar a la función Pintar (carácter : char; nPila : integer) quien se encargará de dibujar el carácter en el sitio correcto. Tras cada acción de desapilar un carácter se llamará a la función Anular (nPila : integer) quien se encargará de borra, en el dibujo, la cima de la columna seleccionada.
3. Normas de esta práctica.
Como en el resto de prácticas de esta asignatura se seguirá estrictamente las reglas de estilo de programación en Pascal.
Se deben presentar dos unidades, una para cada implementación de la estructura de datos pila: mediante vectores y mediante punteros, y un programa principal. Este programa debe ser capaz de funcionar con cualquiera de las dos unidades sin ningún tipo de modificación.Por lo tanto hay que tener en cuenta que cualquier proceso de manipulación de la pila se debe realizar a través de las operaciones definidas en las unidades anteriormente diseñadas, de forma que en el programa no aparezca ningún detalle que indique cómo se ha representado la pila. Las soluciones que no cumplan este requisito serán consideradas incorrectas.
Esta práctica se desarrollará en dos sesiones. Se recogerá al finalizar la segunda sesión.
ENTREGA DE PROGRAMAS: Al finalizar la segunda sesión de prácticas correspondiente.