Está en la página 1de 11

Universidad del Valle de Guatemala Programación Orientada a Objetos

Autores:

10256, Sergio Molina 10278, Juan Fernando Orellana Sección: 12 Fecha de la primera entrega: 3 de noviembre de 2010

10189, Jennifer Valdez

ANÁLISIS DEL PROYECTO No. 2

a) ENTRADAS

Click sobre un Panel

Moverse sobre los Paneles

Click sobre los Labels en el menú, en las instrucciones o cuando perdió para volver a jugar.

b) SALIDAS

Se muestra un menú con las opciones de jugar o ver instrucciones.

Se muestran las instrucciones con la opción de jugar.

Se muestra el tablero con los 8 Paneles.

Se muestran las piezas visibles en el tablero.

Se muestra ambas piezas de los lados del panel en donde se posee el mouse. Estos son las piezas que serán agregados a cada fila (Panel).

Se muestran dos piezas de next que indican que piezas tendrá al siguiente tiro.

Se muestra el tablero luego de eliminar los botones con el mismo identificador.

Se muestra el punteo.

Se muestra el nivel.

Cuando se pierde se muestra un Panel que indica que perdió, en ese panel se muestra el link del blog y hay una opción para volver a jugar.

c) CONDICIONES

Si se coloca más de 6 piezas en un lado de la fila pierde.

Si existen tres o más piezas iguales juntas se deben eliminar.

Si se eliminan piezas se deben correr los demás.

La imagen de la pieza según su identificador (constructor de Pieza)

Solamente se activan los objetos al presionar el botón izquierdo del mouse

Si no ha perdido permite seguir colocando piezas en las filas.

Si las piezas de los laterales no están en movimiento hacia la matriz se puede mover el mouse y visualizar donde se puede dar click.

En los timer para moverse si la posición no es igual a la deseada se sigue recolocando hasta llegar a la posición deseada.

En verificar de la clase Juego si ha habido cambios se vuelve a verificar.

En intercambio si la pieza no es null y la siguiente si (según este de lado derecho o izquierdo) entonces se intercambian.

En eliminar de la clase Juego se eliminan solo si no son null.

En revisar de la clase Juego si las coordenadas se salen de la matriz, o la pieza es

null, o dichas coordenadas ya fueron evaluadas entonces regresa cero.

Al colocar las piezas iniciales en el juego si una pieza es igual a otra que está junto

a ella se vuelve a asignar otro valor hasta que sean diferentes.

Si ha realizado 10 tiros o múltiplo de éste (sin ser múltiplo de 20) es turno de la pieza especial de la bala.

Si ha realizado 20 tiros o múltiplo de éste es turno de la pieza especial de la bomba.

Si tiró una bala se debe eliminar la fila completa.

Si tiró una bomba debe eliminar a todas las piezas con el mismo identificador que quedó a la par de la bomba.

Si la bomba o la bala no tocan otras piezas nada debe ser eliminado.

Si hace click en una fila donde ya no hay espacio pierde.

d) DESCRIPCIÓN DE CICLOS

Se realiza un for controlado por un contador i < 8 para crear los 8 Paneles con sus respectivas características.

Para crear la matriz de botones se realiza un doble for, controlados por contadores

y crea cada pieza de la matriz.

Mientras la pieza inicial colocada sea igual a otra junto a ella se cambia.

En eliminar se realiza un for controlado por un contador i, mientras sea menor al tamaño del vector de coordenadas que debe eliminar.

En intercambio se realiza un for controlado por un contador i que recorre toda la fila evaluando si debe realizar un cambio.

En reposicionar se realiza el for controlado por i < 8 para evaluar los 8 paneles del tablero.

Mientras haya un cambio se debe repetir la función, tanto en reposicionar como en verificar.

Se realiza un doble for para revisar todas las piezas.

e) PROGRAMA PRINCIPAL método main

Clase: JuegoMario

Se importó javax.swing.* y java.awt.*. Se creró la ventana de tipo JFrame llamada form con su respectivo título; luego se definió que hacer cuando la ventana se cierre lo cual era terminar la ejecución del juego. Se creó un objeto de la clase Menu, el cual se agregó al JFrame. Se estableció que no se pudiera cambiar de tamaño a la ventana, luego se adapto el tamaño a los componentes. Se indicó que al salir la ventana se mostrara justo en el centro de la pantalla y por último se establece que sea visible dicha ventana.

f)

CLASES

Clase: Panel

Hereda de: JPanel

Atributos

Visibilidad

Identificador

Tipo

Descripción

Privado

no_fila

int

Es el número de fila en el tablero

Privado

imagenFondo

ImageIcon

Es la imagen que tendrá de fondo el Panel

Privado

height

int

Es el alto que tendrá cada Panel

Privado

org

SpringLayout

Es el layout que tendrá el panel

Métodos

public Panel(int no_fila, int height, ImageIcon img)

Se llama al constructor de la clase JPanel (clase madre) y luego se inicializa el valor de su atributo con los parámetros ingresados y se cambia el layout con el org.

public int getNo_fila()

Devuelve el valor del atributo no_fila {int} de la clase.

public SpringLayout getOrg()

Devuelve el valor del atributo org {SpringLayout} de la clase.

public void paintComponent(Graphics g)

Se dibuja la imagen en el parámetro g; estableciendo la imagen de fondo desde 0,0 con largo de 700 y alto del tamaño del atributo height; luego se establece que no sea opaca para que se pinten todos los pixeles y por último se manda a llamar al paintComponent de la clase madre con el g modificado con la image.

public void setImageBg(ImageIcon img)

Cambia el valor del atributo imagenFondo con el valor que trae el parámetro; luego manda a llamar al paintComponent para que se vuelva a dibujar la imagen de fondo.

Clase: Pieza

Hereda de: JLabel

Atributos

Visibilidad

Identificador

Tipo

Descripción

Privado

pos_x

int

Es la posición en x en el tablero

Privado

pos_y

int

Es la posición en y en el tablero

Privado

identificador

int

Indica que imagen tendrá el botón

Privado

parent

Panel

Es el panel en el cual estará contenido

Métodos

public Pieza(int pos_x, int pos_y, int id, Panel parent)

Se llama al constructor de la clase JLabel (clase madre) introduciendo como parámetro una imagen que se determina por el id. Luego se inicializan los cuatro atributos; identificador, paren, pos_x y pos_y con los valores ingresados en los parámetros.

public void setPos_x(int pos_x)

Se cambia el valor del atributo pos_x con el valor del parámetro pos_x ingresado.

public void setParent(Panel parent)

Se cambia el valor del atributo parent con el valor del parámetro Panel ingresado.

public void setIdentificador(int id)

Se cambia el valor del atributo identificador con el valor del parámetro id ingresado.

public int getPos_x()

Devuelve el valor del atributo pos_x {int} de la clase.

public int getPos_y()

Devuelve el valor del atributo pos_y {int} de la clase.

public int getIdentificador()

Devuelve el valor del atributo identificador {int} de la clase.

public Panel getParent()

Devuelve el valor del atributo parent {Panel} de la clase.

public void colocar(int x)

Primero se agrega la pieza actual al parent. Se crea una variable SpringLayou t que fue el layout utilizado para determinar posiciones de los componentes en los paneles; dicha variable recibirá el layout del panel; luego con esta variable se especifica a le distancia se mostrará la pieza actual de la esquina izquierda del Panel.

Clase: Juego

Hereda de: JPanel

Atributos

Visibilidad

Identificador

Tipo

Descripción

Privado

tablero

Panel []

Vector de paneles que contendrá el tablero.

Privado

control_up

Panel

Es donde existen algunos componentes de control y está arriba de control_down.

Privado

control_down

Panel

Es donde existen algunos componentes de control y está abajo de control_up.

Privado

piezas

Pieza[][]

Matriz de piezas para el trablero

Privado

pi_iz

Pieza

Pieza que será colocada en el tablero de lado izquierdo.

Privado

pi_der

Pieza

Pieza que será colocada en el tablero de lado derecho.

Privado

next_iz

Pieza

Pieza que muestra cual será la siguiente pieza que estará en juego de lado izquierdo.

Privado

next_der

Pieza

Pieza que muestra cual será la siguiente pieza que estará en juego de lado derecho.

Privado

lose

boolean

Indica si no ha perdido el juego.

Privado

loser

Perdio

Panel que se muestra al momento de perder.

Métodos

public Juego()

Se crea el panel contenedor que todo el juego, se le cambia a la clase al layout a GridLayout con una casilla para que siempre salgan los paneles pegados a la ventana. Se cambia el layout del parent (panel contenedor) a GridLayout para manejar como matriz el tablero de juego, se colocó de 10 x 1 porque son 8 posiciones un control_up y un contro_down. Se inicializaron los atributos y las variables; todas las booleans (lose, en_movimiento, movei, moved, elimino) son falsas; luego se crean los dos timers indicando que cada 3 ms se dispare el método correspondiente. Se crea el tablero de 8 posiciones y por medio de un ciclo se crearon los 8 Paneles indicando su posición, que su altura es de 50 y la imagen correspondiente (fondo sin luz porque no está encima el mouse); se elige el tamaño de cada Panel el cual es de 700 x 50; luego se le agrega el Listener OnMousePanel y por último se añade al parent. Se crean control_up y control_down y se agregan al parent. Se establece que empieza en el nivel 1, y con 0 puntos, además se crea la variable random para escoger número al azar los cuales serán los identificadores de las piezas. Se crean los objetos encargados de mostrar el estado del juego, es decir, que muestran el punteo y el nivel; dichos objetos se agregan al parent; cada panel contiene el layout SpringLayout, el cual permite colocar a cierta distancia específica los objetos; con dicho layout se posicionaron los objetos de control del juego. Se crean la matriz de piezas de 12 x 8; cada pieza se crea por medio de un ciclo doble, dentro del siclo se crean la pieza con un identificador aleatorio, si el identificador esta a la par de otro igual lo cambia hasta que sea diferente, de esta forma no quedan figuras iguales juntas y cada pieza se coloca en su respectivo Panel.

public int revisar(int px, int py, int id, int izde)

Se crea un String llamado s, el cual se le asigna las coordenadas actuales con los valores que fueron ingresados en los parámetros; s tiene el siguiente formato: s = px + “,”+py+”:”.

Luego se evalúa si px y py siguen dentro de la matriz; luego si la matriz en la posición px, py no es igual a null, la matriz en la posición px, py llama a getIdentificador() y lo compara

con id, los cuales deben ser iguales y coord

posee dichas coordenadeas entonces si izde es igual a cero se le agrega a coord

coordenadas actuales sino se le agrega a coord_der las coordenadas actuales, y se devuelve 1 + revisar (x+1,y,id,izde) + revisar(x-1,y,id,izde) + revisar(x,y+1,id,izde) + revisar(x,y-1,id,izde) , en caso no se cumpla una de las cuatro especificaciones la función devuelve 0.

que son un String global no

iz las

iz

o coord

der

public void eliminar(String s)

Crea dos vectores de String xy y coord.; coord será el s convertido en vector por medio de Split separado por “:” así separamos las coordenadas que debemos eliminar; luego desde 0 hasta el tamaño de coord. Se crea xy con Split separado con “,” de coord en la posición

correspondiente para separar la coordenada x de la coordenada y las cuales revisan que

si la pieza es diferente de null entonces se elimina del parent; por cada pieza eliminada se

suma 5 puntos y se establece el nivel según los puntos; cada 500 puntos hay un cambio de nivel, luego se actualiza el Panel y se le asigna que es igual a null. Luego se actualizan los datos para que se muestre en pantalla.

public boolean intercambio(int y)

Se crea una variable boolean que inicia con false llamada change y especificara cuando cambio algo de posición; desde 0 hasta 4 (lado izquierdo del tablero) se evalua si piezas en la posición i,y es diferente de null y piezas i+1,y es null entonces change recibe true e intercambia la pieza i,y por la i+1,y así queda el null de lado izquierdo; de igual forma se hace de lado derecho solamente que se evalua el i-1. Este método regresa change, es decir, es true si hubo algún cambio en la matriz.

public void reposicionar()

Se hace un ciclo que recorra todas las filas de tablero llamando a intercambio mientras sea verdadero; al momento de ser falso quiere decir que la fila ya está en orden por lo que ya se puede paras a la siguiente fila.

public void verificar()

Se crea una variable boolean llamada cambio que inicia falsa, indicará si hubo algún cambio en la matriz. Se crea un entero llamado ne para contabilizas número de piezas

iguales. Por medio de un ciclo doble se recorre la matriz y en cada posición se llama a revisar y se le asigna dicho valor a ne. Si ne>2 entonces cambio es verdadero y se manda

a eliminar y luego a reposicionar. Al terminar los ciclos se evalua y si cambio fue true entonces llama recursivamente a verificar, hasta que ya no elimine mas piezas.

public void evaluar()

Se colocan en las posiciones originales a pi_iz y pi_der, se vuelven visibles según toque bala, bomba o pieza normal; si el valor de iguales de lado izquierdo es mayor que dos elimina las coor_iz y establece que elimino es verdadero; de igual forma se evalua de lado derecho. Si elimino es verdadero entonces llama a reposicionar y luego a verificar.

public void bala(int fila)

Se crea un string llamado s que guardará las coordenadas de las piezas que debe eliminar; revisa en toda la fila por medio de un for, y si la pieza existe entonces sus coordenadas son agregadas al string; luego se llama a eliminar enviando como parámetro

el string con las coordenadas, luego se reestablece el punteo y el nivel y se muestran en

pantalla; por último se colocan y se vuelven visibles las piezas laterales.

public void bomba(int id)

Recorre toda la matriz buscando piezas con el identificador del parámetro; al encontrar agrega su coordenada en un string que al terminar el for se llama a eliminar con dicho string; luego se reestablece el punteo y el nivel y se muestran en pantalla; al eliminar se llama a reposicionar y a verificar por si acaso existen de nuevo tres piezas iguales juntas; por último se colocan y se vuelven visibles las piezas laterales.

Private class TimerPiezaIz Implementa de ActionListener

public void actionPerformed(AcionEvent event)

Si posición es menor que a donde debe llegar o si la pieza es diferente a una bala se le suma 5 a posición y se coloca en su nueva posición; esto es para animar el juego al momento de darle click. Si ya llego a donde debería se detiene el timer izquierdo se detiene; luego se establece que movei es falso, se coloca la pieza ya en lo p osición exacta de donde debería posicionarse, luego se evalúan los click y si ya pasaron 10 clicks se cambia el identificador del next a una bala; luego si ya pasaron otros 10 click se cambia el identificador del next a una bomba y así sucesivamente, si no es múltiplo de 10 el lanzamiento el identificador del next izquierdo se escoge aleatoriamente; luego se cambia el identificador de pi_iz por el identificador que tenía el next_iz. Se evalúa si la pi_der aun se mueve y si no entonces en_moviemiento es igual a falso, al ocurrir esto se verifica y si la pieza es una bomba se manda a llamar al método bomba sino manda a llamar a evaluar.

Private class TimerPiezaDer Implementa de ActionListener

public void actionPerformed(AcionEvent event)

Si posición es mayor que a donde debe llegar o si la pieza es diferente a una bomba se le resta 5 a posición y se coloca en su nueva posición; esto es para animar el juego al momento de darle click. Si ya llego a donde debería se detiene el timer derecho se detiene; luego se coloca el identificador del next derecho a la pieza lateral derecha; luego se evalúa y si ya pasaron 10 turnos se cambia el next derecho a una bala, luego a los siguientes 10 turnos se cambia por una bomba y así sucesivamente; luego se establece que moved es falso, se coloca la pieza ya en lo posición exacta de donde debería posicionarse, si no toca bala o bomba el identificador de next_der se selecciona al azar para sacar otra pieza aleatoria. Se evalúa si la pi_iz aun se mueve y si no entonces en_moviemiento es igual a falso, al ocurrir esto se evalúa y si la pieza lanzada es una bala manda a llamar al método bala, sino manda a llamar a evaluar.

Private class OnMousePanel extiende de MouseAdapter

public void mouseEntered(MouseEvent event)

Se evalúa si no está en movimiento entonces se realiza un casting del objeto que disparó el evento para que sea un Panel, se crea un entero que se le asiga el getNo_Fila del Panel; se crea una ImageIcon con la imagen del fondo del panel pero con más claridad, luego se cambia el fondo a esta imagen así cuando el mouse entre al panel se observa que el fondo es más claro; luego la pi_iz y la pi_der se les cambia de parent, siendo sus nuevos parents el panel en donde está el mouse; se colocan en dicho parent el cual se actualiza, para mostrar dichas piezas.

public void mouseExited(MouseEvent event)

Se evalúa si no está en movimiento entonces se realiza un casting del objeto que disparó el evento para que sea un Panel, se crea un entero que se le asiga el getNo_Fila de l Panel; se crea una ImageIcon con la imagen del fondo del panel original, es decir, sin luz; luego se cambia el fondo a esta imagen así cuando el mouse salga del panel se observa que el fondo vuelve a ser el de antes; luego la pi_iz y la pi_der se eliminan de este panel, el cual se actualiza y así ya no se muestran estas piezas en él.

public void mouseClicked(MouseEvent event)

Si no está en movimiento entonces se realiza un casting del objeto que disparó el evento para que sea un Panel, se crea un entero que se le asiga el getNo_Fila del Panel. Luego se hace un for donde se calcula el valor de im, el cual es cuantos espacios debe moverse hasta llegar a uno ocupado. Si im es igual a cero entonces lose = verdadero; sino xi recibirá cuanto se debe mover en pixeles; lo mismo se realiza con el lado derecho se hace el for y evalua si lose es falso para calcular jm y luego si jm es igual a 11 entonces lose = verdadero el juego sino xd se calcula el cual es la distancia que se mueve la pi_der. Si lose es falso entonces las piezas se crean en el tablero, sus posiciones iniciales de movimiento es 0 y 650 para la pi_iz y la pi_der respectivamente, la varialble en_movimiento, movei y moved se vuelven verdaderos, se le suma al contador de click 1 y luego se limpian las coordenadas y se inicianlos timers. Si lose es verdadero entonces se crea loser de la clase Perdio, se remueve el parent y se agrega loser.

Clase: Perdio

Hereda de: JPanel

Atributos

Visibilidad

Identificador

Tipo

Descripción

Privado

play

JLabel

Será el botón para volver a jugar

Privado

parent

Panel

Panel que contiene a perdio

Privado

game

Juego

Si se vuelve a jugar se crea un objeto de la clase Juego

Métodos

public Perdio()

Se cambia el layout a GridLayout(1,1) para que los objetos salgan pegados a la ventana; crea el label con una imagen para jugar de nuevo, se le agrega el MouseListener. Se crea el parent y se agrega el label a este parent; se crea un SpringLayout para posicionar el boton dentro del parent; luego se posiciona el botón estableciendo las distancias tanto de top como left; se asignan las dimensiones del parent y se agrega a la clase.

Private class OnClick extiende de MouseAdapter

public void mouseClicked(MouseEvent event)

Se crea un nuevo Juego, se remueve el parent y se agrega el nuevo juego.

Clase: Menu

Hereda de: JPanel

Atributos

Visibilidad

Identificador

Tipo

Descripción

Privado

play

Pieza

Será el botón para jugar

Privado

instrucciones

Pieza

Será el botón para ir a las instrucciones

Privado

parent

Panel

Panel que contiene a Menu

Privado

game

Juego

Es el panel del Juego

Privado

inst

Instrucciones

Es el panel de las instrucciones

Métodos

public Menu()

Se cambia el layout a un nuevo GridLayout(1,1) para que los objetos estén pegados a la ventana, luego se crean los botones (jugar y de instrucciones); luego se le agrega el listener a ambos botones. Se crea el parent, se crea un SpringLayout para colocar los botones en el parent en su posición exacta; los botones se posicionan y se agregan al parent; se le define el tamaño al parent y se agrega a la clase.

Private class OnClickPlay extiende de MouseAdapter

public void mouseClicked(MouseEvent event)

Se crea game, el parent se remueve y se añade game a la clase.

Private class OnClickInst extiende de MouseAdapter

public void mouseClicked(MouseEvent event)

Se crea inst, el parent se remueve y se añade inst a la clase.

Clase: Instrucciones

Hereda de: JPanel

Atributos

Visibilidad

Identificador

Tipo

Descripción

Privado

play

Pieza

Será el botón para jugar

Privado

parent

Panel

Panel que contiene a instrucciones

Privado

game

Juego

Es el panel del juego

Métodos

public Instrucciones()

Se cambia el layout a GridLayout para que los objetos queden pegados a la ventana; se crea el boton para jugar, se le agrega el Listener. Se crea el parent y se le agrega el botón; se crea un SpringLayout para posicionar el boton dentro del paretn y se coloca; se le define tamaño al parent y se añade a la clase.

Private class OnClick extiende de MouseAdapter

public void mouseClicked(MouseEvent event)

Se crea el Panel Juego,se remueve el paren y se agrega a Instrucciones a la clase.