6/4/10

INFORME LABORATORIO PACMAN TETRIS










INFORME LABORATORIO "PACMAN-TETRIS"




Joanna Ochoa – 258050
Pedro Valderrama – 258031
Andrés Bernal – 258029




RESUMEN EJECUTIVO
El problema inicial planteado era el de desarrollar un pacman, en el cual se modelara el movimiento a nuestro gusto, sin fantasmas y con una matriz de galletas especificada por nosotros. El grid sugerido de 6x7 se aumentó a uno de de 15x15 (incluyendo pared exterior). Se hicieron varios cambios respecto a las clases anteriores. En la clase pacman, se definieron el constructor y el destructor, y se añadieron nuevas funciones como las de dibujar_pacman (), imprimirGalletas (), borrar (), que se describirán en la parte de este informe destinada para eso. En la clase Tablero, se conservaron los atributos, pero en la parte de las funciones miembro se añadieron también el constructor y el destructor, y la única función miembro (imprimirTablero ()) siguió vigente. Para la visualización del juego, añadimos la librería graphics.h, con la cual dibujamos la interfaz de juego, el pacman, el laberinto y las galletas. Ésta tuvo uso en una función miembro de la clase pacman (dibujar_pacman ()) y en la clase Tablero, en su única función. En especial, se usó la función de dicha librería, denominada pieslice, la cual tiene respectivamente los siguientes parámetros: cordenada "x" del centro, cordenada "y" del centro,angulo de inicio de la boca del pacman, ángulo final de la boca del pacman, radio en pixeles del circulo; además llamando la función intiwindow (), para abrir la ventana de 1024 x 768 pixeles. También incluimos la librería time.h la cual es usada explícitamente en la función miembro de la clase pacman limit-time (), que se explicará después.
Para el caso del tetris, como sólo se pide realizar los diagramas de clases, se ideó lo siguiente: una clase base llamada rectángulo, la cual contiene las características de cada figura que encontramos en el popular juego tetris, la cual tiene como atributos arreglos de 3 campos, los cuales tienen los nombres de int pos_cuadrado1_arriba [2],int pos_cuadrado2_arriba[2], int pos_cuadrado3_arriba[2], int pos_cuadrado1_abajo[2], int pos_cuadrado2_abajo[2], int pos_cuadrado3_abajo[2], y como sus nombres lo indican contienen las posiciones de cada figura del tetris, y en la parte de las funciones miembro se definieron constructor y destructor necesarios (rectángulo(), ~rectangulo(), respectivamente), además, una función void verificador (), que verifica…, una función void puntaje (), que como se indica, calcula el puntaje del jugador según las líneas que va completando el usuario con las figuras, y tres funciones que operan con las figuras, que son void dibujar_figura(), void mover_figura(), void girar_figura(), que desarrollan lo que dicen sus nombres, actuando según la forma de cada figura, la primera de éstas, también se apoyará en el uso de la librería graphics.h con la función pieslice así como en el pacman, y especificando el color de cada figura para diferenciarlas también por este criterio y basándose en el conocimiento de la posición de cada figura y actualizando dichos datos, excepto el color; la segunda función también tendría una estrecha relación con la primera, como el caso del pacman (mov_pacman () y dibujar_pacman()) y realizaría el trabajo de el movimiento de la figura, como su nombre lo especifica, realizando también actualización de datos de posiciones actuales y finales; y para la tercera función también se trabajaría con líneas de validación para el movimiento según la matriz del tablero y de las demás figuras y con opciones diferentes de movimiento según la figura modelados por teclado. También consideraríamos el uso de la librería time. H, dependiendo la modalidad de juego de tetris que se proponga, si es que se fuera a implementar en un futuro.

MARCO TEORICO
Herencia:
Se puede construir una clase a partir de otra mediante el mecanismo de la herencia. Para indicar que una clase deriva de otra se utiliza la palabra extends, como por ejemplo:
class CirculoGrafico extends Circulo {...}
Cuando una clase deriva de otra, hereda todas sus variables y métodos. Estas funciones y variables miembro pueden ser redefinidas (overridden) en la clase derivada, que puede tambiéndefinir o añadir nuevas variables y métodos. En cierta forma es como si la sub-clase (la clase derivada) "contuviera" un objeto de la super-clase; en realidad lo "amplía" con nuevas variables y métodos.
Java permite múltiples niveles de herencia, pero no permite que una clase derive de varias (no es posible la herencia múltiple). Se pueden crear tantas clases derivadas de una misma clase como se quiera.
Todas las clases de Java creadas por el programador tienen una super-clase. Cuando no se indica explícitamente una super-clase con la palabra extends, la clase deriva de java.lang.Object, que es la clase raíz de toda la jerarquía de clases de Java. Como consecuencia, todas las clases tienen algunos métodos que han heredado de Object.
Tomado de GARCÍA DE JALÓN, Javier, RODRÍGUEZ, Jose Ignacio y otros. Aprenda Java como si estudviera en primero. Universidad de Navarra. Escuela superior de ingenieros. San Sebastián. Enero 2000. Disponible en http://www.tecnun.es/asignaturas/Informat1/ayudainf/aprendainf/Java/Java2.pdf
Encapsulamiento:
El encapsulamiento (o encapsulación), u ocultación de la información, es el proceso de ocultar todos los detalles de un objeto que no contribuyen a sus características esenciales. Esencialmente, significa que aquello que está en el interior de la clase está oculto; sólo las interfaces externas se pueden ver por otros objetos. El usuario de un objeto nunca necesitará conocer el interior de la clase.
Una de las ventajas principales del encapsulamiento es que proporciona al programador libertad en la implementación de los detalles de un sistema. La única restricción que tendrá el programador es mantener la interfaz abstracta que ven los usuarios externos.
En realidad, es el mecanismo que enlaza juntos código y los datos que los manipulan y los mantienen seguros de interferencias externas y el mal uso.
En Java, los fundamentos de la encapsulación están en la clase. Una clase define la estructura y el comportamiento (datos y código) que se compartirá por un conjunto de objetos. Por esta razón, los objetos se conocen como a veces como instancias de una clase. Por consiguiente, una clase es una construcción lógica; un objeto tiene una realidad física.


JOYANES AGUILAR, Luis. McGRAW-HILL. ISBN: 8448132904 ISBN-13: 9788448132903. España, 2002. Págs. 71-72.
DIAGRAMAS DE CLASES

//
Convenciones de modificadores de ámbito.
+: público.
-:privado.
#: protegido.
//

Pacman:





Tetris:






DESCRIPCION DE METODOS Y ATRIBUTOS
Pacman:
void limit time(); - da el límite del tiempo para que el usuario termine de hacer que el pacman consuma las galletas. Implementado con la librería time.h.
void mov_pacman(tablero screen,char tecla); - Por los valores numéricos asignados a las operaciones de flechas del movimiento del pacman, se verifica cuál de éstas teclea el usuario. El pacman siempre se mueve en direcciones posibles desde que no llegue a una pared, el usuario debe cambiar si dirección cuando el pacman llegue a una pared o cuando desee desviar por donde el laberinto permita. Se crea un objeto tipo tablero, el cual toma valores de la matriz forma, desde la cual se verificará el camino posible. Según los criterios anteriores se va dibujando el pacman y quitándolo de su posición anterior; se dibuja ayudado de la librería graphics.h. Cuando la ubicación en la matriz del tablero inmediatamente posterior a la actual del pacman es ocupada por la pared (en este caso se especificó como de valor cero si hay pared), el pacman conserva su posición actual, mejor dicho, creamos el objeto tabla de la clase tablero que tiene como argumentos 5 galletas, la matriz forma (del laberinto (1: camino;0:pared)) y la matriz galletero (de galletas(0:no hay galleta, no hay camino posible; 1:galleta pequeña; 2: galleta grande)). Además la función mov_pacman () tiene una estrecha relación con la función dibujar_pacman (), ya que, como dijimos anteriormente, según se pueda avanzar, se cambia la posición del pacman y se dibuja.
int puntaje(tablero tabla2,int puntos); esta función define el puntaje según la cantidad y el tamaño de galletas que coma el pacman hasta el tiempo límite, según las siguientes asignaciones:
Galleta pequeña: 5 puntos.
Galleta grande: 10 puntos.
Ninguna galleta: 0 puntos.
Del objeto tabla 2, se toma en específico la tabla de posición de galletas para verificar que tipo de galleta se consume el pacman y la posición del pacman para comparar lo ya dicho, también se hace la actualización de datos, tanto la eliminación de la galleta en el tablero como la suma de puntos según el tipo de galleta (grande, pequeña).
void dibujar_pacman(int x, int y,char direccion); - como se vió en la función mov_pacman, con la función dibujar_pacman () hay una estrecha relación, pero en el caso de esta función se toman de parámetros la posición del pacman y el carácter dirección, que va a validar hacia qué lado desea mover el usuario el pacman y soportado por la librería graphics.h tanto fija el color del pacman (antes de la validación de la dirección) como en sí como el nombre de la función lo dice, dibujar el pacman en la posición correcta con sus características innatas.
void imprimirGalletas(); - muestra las galletas en el laberinto, también usando la función pieslice de la librería graphipcs.
void borrar(int pos[]); - cuando pacman se mueve lo borra de su posición anterior.
void  imprime_galletero (tablero pantalla); - imprime la matriz de las galletas mostrando los cambios de éstas cuando el pacman se las come, y mostrando el tipo de galleta según lss convenciones anteriores.
void imprimirTablero (); - esta es hasta ahora la única función miembro de la clase Tablero, la cual define el color del tablero con soporte de la función graphics.h nuevamente, la cual verifica en la matriz tabla, si el valor de cada dato de la misma es 1 entonces dibuja el laberinto que delimita el camino del pacman.
CONCLUSIONES
  • Para representar en pantalla el pacman utilizamos el encapsulamiento para ocultar las características del pacman y reflejarlas en el gráfico sin que éstas puedan ser modificadas, para evitar que el pacman atraviese paredes y no salte en el mapa sin recorrer el camino debido y aparezca graficado solamente una vez.
  • Al ser el trabajo tan extenso, nos permitió comprender de una forma las propiedades de encpasulamiento y herencia y ver sus ventajas y desventajas.
  • Al idear el tetris, fué más evidente la herencia y su utilidad puesto que las figuras tienen unas características comunes, lo cual requiere de esta propiedad.

BIBLIOGRAFIA

  • Herencia: GARCÍA DE JALÓN, Javier, RODRÍGUEZ, Jose Ignacio y otros. Aprenda Java como si estudviera en primero. Universidad de Navarra. Escuela superior de ingenieros. San Sebastián. Enero 2000. Disponible en http://www.tecnun.es/asignaturas/Informat1/ayudainf/aprendainf/Java/Java2.pdf

  • Encapsulamiento: JOYANES AGUILAR, Luis. McGRAW-HILL. ISBN: 8448132904 ISBN-13: 9788448132903. España, 2002. Págs. 71-72.