PRÀCTICA N 2: 2 sessions (des de 13 de Març a 2 d’Abril de 1998)

Piles: Implementació del Tetris

Objectius:

Implementació de l’estructura de dades PILA mitjançant vectors i punters. Aplicació de les piles a la programació del joc TETRIS.

Unitats per a l’especificació de l’Estructura de Dades "Pila"

Com a primera tasca de la pràctica, es demana escriure dos mòduls en TP que especifiquen l’estructura de dades Pila utilitzant dos representacions diferents. Estos mòduls es deuen dissenyar de la forma més general possible, de tal manera que siguen fàcilment adaptables a qualsevol tipus de aplicació.

La primera unitat deu representar l’estructura Pila mitjançant un vector. La segona unitat, per la seua part, deu d’utilitzar una representació enllaçada de la Pila.

Per a facilitar el disseny de les unitats, a continuació s’indica com deu de ser la seua estructura i quines operacions deu de contindre:

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.

 

Descripció del joc i de les regles.

En esta pràctica es programarà una versió del conegut joc TETRIS.

Esta versió del joc consisteix en un ‘pou’ de dimensions 15 files per 8 columnes. Cada una de les 8 columnes es representarà mitjançant una pila, numerada des de 1 (la del extrem esquerre del pou) fins a la 8 (la del extrem dret). En cada una d’estes 8 columnes es poden anar apilant les peses que el programa anirà generant aleatòriament de manera automàtica.

Cada una de les peces està constituïda per tres caràcters de entre els cinc possibles del conjunt {H, O, X, I, #}, ficats en vertical sense que es repeteisquen dos caràcters successius. Els caràcters que composen la peça s’emmagatzemen en una cadena, sent el primer caràcter el que ocupa la part baixa de la peça. Son peces vàlides:

X O ß posició major del vector

O H

X I ß posició menor del vector

però no son vàlides:

X O

X O

O O

La següent peça a col·locar es mostrarà en la part dreta superior del pou i seguidament es preguntarà al jugador si desitja invertir-la o no, si el jugador decideix donar-li la volta, es dibuixarà de nou la peça. A continuació li se preguntarà al jugador en quina columna desitja deixar-la caure.

Un exemple de inversió de peça seria:

O I

H Invertir à H

I O

En la següent figura es pot vore un instant 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

Quant es selecciona la columna en la que es deixa caure la peça, s’apila sobre eixa pila que representa la columna cada un dels caràcters de la peça. Quant el caràcter que s’està apilant coincideix amb el cim de la pila, desapareixen els dos caràcters i es suma un punt al marcador.

No es consideren les possibles coincidències del mateix caràcter en horitzontal.

El joc s’acaba quant al intentar apilar un nou caràcter sobre alguna de les columnes es supere la grandària prefixada de la mateixa (que es 15). El joc es pararà mostrant opcionalment si es desitja jugar de nou.

La visualització del procés es realitzarà utilitzant una unitat ja compilada, anomenada Uni_Ver, que contindrà les funcions necessàries per al dibuixat del estat del pou en cada instant de la partida. Les funcions de esta unitat seguiràn la següent interfície:

PintaVacio ( )

Pinta el pou buit.

Pintar (caracter : char; nPila : integer) : boolean;

Pinta un caràcter en la pila indicada per nPila. Torna TRUE se el caràcter s’ha pintat correctament i FALSE si no s’ha pogut dibuixar on es demanava (per exemple s’ha seleccionat una columna que no existeix o s’ha excedit la grandària de la pila).

Anular (nPila : integer) : boolean;

Esborra el carácter del cim de la pila indicada en nPila. Torna TRUE si el carácter ha segut efectivament esborrat i FALSE si no s’ha pogut esborrar (per exemple per que la pila estaba buida).

PintaPieza (a, b, c : char; puntuacion : integer);

Dibuixa la nova peça. ‘a’ es el caràcter que està situat en la part ‘inferior’ del vector, ‘b’ en el mig i ‘c’ el la part superior. També escriu la puntuació actual aconseguida per el jugador.

Estes funcions serveixen únicament per actualitzar el dibuix. No porten cap compte del estat actual del joc i es limiten a pintar o esborrar peces.

La manera de utilitzar estes funcions es com segueix: Al inici de la pràctica es dibuixa el pou buit (mitjançant la funció PintaVacio()). Després de cada acció d’apilar un caràcter hi a que cridar a la funció Pintar que s’encarregarà de dibuixar el caràcter en la posició indicada. Després de cada acció de desapilar es cridarà a la funció Anular que s’encarregarà de esborrar, en el dibuix, el cim de la columna seleccionada.

Normes d’esta pràctica

Com en totes les pràctiques d’esta assignatura, es seguiran estrictament les normes d’estil de programació en PASCAL.

Es deuen presentar dos unitats, una per cada Implementació de l’estructura de dades pila: mitjançant vectors i mitjançant punters, i un programa principal. Este programa deu de funcionar amb qualsevol de les dos unitats sense cap tipus de modificació. Per lo tant hi a que tindre en compte que qualsevol procés de manipulació de la pila es deu de realitzar a traves de les operacions definides en les unitats anteriorment dissenyades, de forma que en el programa no apareix cap detall que indique com s’ha representat la pila. Les solucions que no compleixquen este requisit seran considerades incorrectes.

 

LLIURAMENT DE PROGRAMES: En acabar la segon sessió de pràctiques corresponent.