Está en la página 1de 17

Universidad del Valle de Guatemala

Programación Orientada a Objetos


Ing. Alenjandra Reynoso

Análisis de Eshtakka
Proyecto No. 2

Carlos Alberto Solórzano Pineda, 08832


Hugo Daniel Mena Enamorado, 08825
Juan Fernando Medrano Yax, 10330
Sección 20
Análisis de Stakka:

Salidas:
 Inicio del programa:
o Bienvenida
o Música
o Menú del juego:
 Jugar
 Seleccionar nivel
 Tutoriales
 Personalizar
 Acerca de
o Jugar:
 Muestra juego
 Muestra botón de pausa
 Muestra cronómetro (barra de progreso)
 Punteo
 Nombre del jugador
 Barra Eshtakka
 Íconos de BioHazard
o Seleccionar nivel:
 Muestra los niveles disponibles (1 a 10)
o Tutoriales:
 Muestra la lista de tutoriales disponibles:
 Muestra una animación del tutorial y regresa al menú anterior
 Muestra botón de regresar al menú principal
o Personalizar:
 Chunksize (Entre 1 y 13)
 Velocidad del cronómetro (Entre 10 y 40)
 Cantidad de colores (Entre 2 y 10)
 Filas (Entre 2 y 98)
 Comenzar juego con esas características
 Regresar al menú principal
o Menú pausa:
 Continuar juego
 Finalizar juego

Entradas:
 Nombre del jugador
 Opciones del menú:
o Jugar:
 Seleccionar menú pausa:
 Continuar
 Salir del juego
 A = Izquierda
 D = Derecha
 W = Disparar
 S = Cargar (Dos veces para disparar)
o Seleccionar nivel:
 Cualquiera de los niveles disponibles
o Personalizar:
 Chunksize
 Velocidad del cronómetro
 Cantidad de colores
 Filas
 Iniciar el juego personalizado
 Regresar al menú principal
o Tutoriales:
 Tutorial 1
 Tutorial 2
 Tutorial 3
 Tutorial 4
o Acerca de

Condiciones:
 Si no se ingresa un nombre, el default es “Anónimo”
 Chunksize: Entre 1 y 13
 Velocidad del cronómetro: Entre 10 y 40
 Colores: Entre 2 y 10
 Filas: Entre 2 y 8
 Mayor nivel:
o Mayor rapidez del cronómetro
o Mayor cantidad de colores
o Mayor chunksize
 El jugador puede tomar únicamente una pieza si está sobre dicha pieza
 Todas las piezas ocupan un espacio de 2x2, sin importar si ya están llenas las columnas
 Para ganar puntos:
o Piezas del mismo color en contacto ocupando 4 filas y/o 4 columnas después del
inicio del juego
o Al destruir piezas, las que están debajo de ellas se caen, se ganan puntos, se
consigue un Awesome (BioHazard) y se suman letras en la barra Eshtakka.
 Se pasa de nivel hasta que se terminan las piezas en el tablero de juego

Repeticiones:
 Reposición de piezas del jugador
 Cronómetro que indica que la prensa bajará
 Cada vez que se dispara una pieza, se verifica si se suman puntos
 Música

Clases:
 Eshtakka.java:
o Contiene mensaje de bienvenida
o Pide nombre del jugador
o Muestra el menú
o Es la clase principal
 GameArea.java:
Se ha definido que va a ser un JPanel. Este JPanel debe contener 3 espacios independientes pero
que interactúan, que son los siguientes:

El Area 1 es el área donde se encuentran los blocks que el jugador debe destruir. Se está
representando como una matriz de tipo JLabel[][], que va a contener a los blocks.

El Area 2 es el área donde se encuentra el “disparador” o “shooter”, que obtiene los blocks que
están en el área 3. Aún no se ha decido como o de que forma se va a representar este objeto, pero
se piensa que podría ser también una matriz de JLabel, aunque esto puede no ser lo más
conveniente.

El Area 3 es el área donde se encuentran los blocks que el jugador puede “cargar” y “disparar”
para ganar puntos. Esta área debe ser también una matriz de tipo JLabel[][] que debe contener
blocks.

Sebe debe decidir si es conveniente utilizar únicamente una matriz, en la que se colocan las 3
areas mencionadas anteriormente, de tal forma que sea un área unificada, o si es mejor tomarlas
de forma separada.
Métodos:

Se decidió eliminar la clase Block.java ya que se pretendía que representara los blocks con los que
se juega, pero se tuvo la imposibilidad de hacer lo siguiente

Public class Block extends JLabel[][]

ya que la forma en que se representa cada block es una matriz de 2 x 2 en la que en cada posición
debe ir un JLabel, de tal forma que quedara lo siguiente:

Matriz Tipo JLabel Block ya hecho

Entonces, con la estructura anterior, Block.java sería una clase abstracta y que tendría un método
“obtenerBlock()” que devolvería una estructura igual a las de las imágenes arriba. Esto no
facilitaba de ninguna forma la programación, ya que la única utilidad de la clase Block.java sería el
método anterior. Entonces se decidió que era mejor simplemente añadir este método a la clase
GameArea.java y desde allí crear los blocks; esto si facilita la programación.

Obtener block (): label [2][2]


Forma: int (1-10) aleatoria
Color: color (1-10) aleatorio
Block : jlabel [2][2]
Switch… para que dependiendo de la forma, así se coloquen en la matriz Block los
bloquesitos individuales

Return block;

Para llenar la matriz al inicio del juego, se requiere que, dependiendo de la cantidad de filas que el
usuario haya seleccionado en el menú principal (Customize > Rows) se llene la cantidad de filas
que el usuario eligió.

Se debe recorrer la matriz que compone a la clase GameArea:


private void llenar_Filas_Iniciales(int rows)
{
JLabel[][] block;
for(aux_fila=0;aux_fila<rows;aux_fila+=2)
for(aux_col=0;aux_col<12;aux_col+=2)
block=obtenerBlock();
for(fila=0;fila<2;fila++)
for(columna=0;columna<2;columna++)

GameMatriz[aux_fila+fila][aux_col+columna]=block[fila][columna];
}

 MainMenu.java:
Esta clase representa el menú principal que se maneja durante el juego. Se tendrá entonces que
esta clase representara la imagen siguiente y todo lo que esta contenga excepto el juego en sí
mismo:

Como se observa, la clase MenuPrincipal.java contiene los botones:

 Jugar
 Seleccionar Nivel
 Tutoriales
 Personalizar
 Acerca de (en lugar de “más juegos”: no hay más juegos)

Ya se ha definido las opciones que habrá dentro de cada submenú luego de presionar cada botón
(en los que aplique), por lo que esta clase será un JPanel cuyo contenido cambiar en relación a lo
que se seleccione mientras se ejecuta el programa.

 GameStatus.java:
o Extiende de JPanel
o Contiene cronómetro, punteo, nombre del jugador y barra Eshtakka
Análisis de Clases:

Shooter.java:

Visibilidad Tipo Identificador Observaciones


Private Int alto Es el alto del shooter
Private Int Ancho Es el ancho del shoter
Private ImageIcon Img Es la imagen del
shooter
Private Int Px Es la posición en
pixeles del shooter
Private Int Py Es la posición en y del
shooter
Private Rectangle Rect Es un rectángulo que
permite identificar
colisiones
Private Int Refx Es la posición
referencia x en matriz
Private Int Refy Es la posición
referencia y en matriz
Private boolean vacio Indica si el shooter
está vacio o no

Visiblidad Retorno Identificador Parámetros Observaciones


Public No tiene Shooter() ninguno Constructor
Public Int getPX() Ninguno Posición GUI en X
Public Int getPY() Ninguno Posición GUI en Y
Public Int getRefX() Ninguno Posicion matriz
en X
Public Int getRefY() Ninguno Posición matriz
en Y
Public Boolean getVacio() Ninguno Saber si esta
vacio
Public Void moveLeft() Ninguno Mover izquierda
Public Void moveRight() Ninguno Mover derecha
Public void setVacio() Boolean vacio Indica si se llenó
GameArea.java

Clase: GameArea.java
Atributos

private FormaBasica[][] GameSpace: Esta es la matriz en que se controla todo el juego. Contiene
únicamente los blocks que interactúan visualmente.

private FormaBasica[][] Game_Aux: Esta matriz contiene todos los blocks que han de ser
destruidos por el usuario, y que se trasladan constantemente a la matriz GameSpace para ser
mostrados al usuario

private Timer animación: es un Timer del paquete javax.swing que permite realizar todas las
animaciones que se observan en el juego.

Private Image back: es la imagen de fondo que tiene el juego que se presenta al usuario.

Private boolean bajar: este atributo indica si actualmente esta corriendo la animación de los
componentes representando que estos están bajando. Si algún componente esta bajando
animadamente, entonces esta variable es true.

Private boolean cargar: permite saber si actualmente se esta cargando animadamente una
imagen.

Private int chunksize: representa la cantidad minima de filas de blocks que deben estar juntas
después de ser disparada la ultima para que comiencen a destruirse.

Private boolean disparando: indica si hay algún block moviéndose hacia arriba, simulando la acción
de ser disparado por el shooter. Mientas un block este moviéndose hacia arriba, esta variable es
true.

Private boolean game_over: permite saber si las condiciones para que el usuario haya perdido la
partida se han dado. Estas condiciones son que la ultima fila que los blocks a destruir este
ocupando la ultima fila posible.

Private boolean ganar: permite saber si las condiciones para saber que el usuario ha ganado están
dadas. Estas condiciones no son más que verificar que toda la matriz GameSpace desde la fila 0
hasta la 8 tengan blocks vacios o que en sí la matriz en esas posiciones este vacio, o null.

Private int nivel: este atributo permite configurar el nivel en el cual el usuario jugará. Los niveles
varian en la cantidad de colores en que pueden ser representados los blocks.

Private int points: este atributo indica la cantidad de puntos que el usuario ha acumulado a través
de destruir blocks y dispararlos. Por cada block destruido el usuario obtiene 100 puntos.

Private int rows: este atributo indica la cantidad de filas de blocks que el usuario debe destruir. Por
ejemplo, si esta variable tiene 12, quiere decir que habrá 6 filas de blocks que el usuario deberá
destruir, ya que cada block se compone de dos filas
Private Shooter shooter: representa al shooter que utiliza el jugador para disparar. Este shooter es
un cuadrado rojo que se puede mover a en el espacio de juego a discreción del usuario pero según
los movimientos que tiene permitidos.

Metodos

Public GameArea: constructor de esta clase que permite crear un nuevo objeto GameArea que es
en sí el juego eshtakka con un nivel, chunksize, cantidad de filas a destruir y puntos iniciales
personalizados, de tal forma que se pueda jugar Eshtakka de diversas formas.

Public int alturaMaxima(): este método permite saber cual es la fila a la que en la que un block
debe reposicionarse luego de ser disparado. Antes de ser disparado, un block esta en las mismas
coordandas que el shooter, y cuando se dispara, debe dirigirse hacia arriba, y este método permite
saber hasta donde se debe mover.

Public boolean aplastado: este método permite saber si la matriz de blocks a destruir ha bajado lo
suficiente como para “aplastar” al usuario, y por tanto saber si este ya perdió el juego.

Public void bajarPrensa(): este método permite mover gráficamente y matricialmente los blocks,
de tal forma que tanto al usuario como programador, los blocks les resulten una fila abajo. Para
esto es necesario también trasladar blocks de la matriz Game_Aux, a la matriz Game_Area.

Public void cargar_block(): este método permite mover grafica y matricialmente los blocks que se
pueden cargar y disparar, para que, dada una posicion adecuada del shooter, el block
inmediatamente abajo suba al shooter y se “cargue” en este.

Pulbic void correrFilaGameAux(): este método permite mover matricialmente hacia arriba, todos
los blocks en la matriz Game_Aux, de tal forma que todos los blocks suban en total dos filas luego
de ser ejecutado este método.

Public void destruirBlocks(fila_disparo:int, columna:int) : este método permite destruir una serie
de blocks dadas las coordenadas del ultimo blocks disparado y por el cual se va a destruir los
blocks.

Public void disparar(): este método efectua todas las operaciones matriciales en Game_Area para
mover el block que esta en el shooter a su posición final en la matriz, hacia arriba

Public boolean getGano(): este método devuelve el atributo ganar, que indica si en el actual juego
el usuario ya ha ganado.

Public boolean getLastBlock(): este método permite obtener la fila desde la 0 hasta la 8 que no
tiene ningún solo block con color sólido distinto del que tienen por defecto los Jlabel.

Public Timer getTimer(): devuelve el Timer animación que se utiliza en esta clase para hacer las
animaciones de los componentes.
Public getVerticalHorizontalBorders(f_ref:int,c_ref:int): permite saber cuales son las columnas y la
fila que rodean al ultimo block disparado y que delimitan el tamaño de búsqueda de blocks que se
deben destruir.

Public void KeyPressed(KeyEvent e): implementacion del método KeyPressed de la interfaz


KeyListener y que permite verificar qué botón fue presionado.

Public void llenarBalasIniciales() : permite colocar en la parte mas baja de la matriz GameSpace los
blocks para que el usuario pueda cargar cuando el juego inicia. Estos se colocan solamente una vez
y luego se reponen.

Public void llenarFilasIniciales(rows: int): Este método permite llenar de blocks la matriz
Game_Aux tantas filas como lo indica el argumento rows. Luego, las filas que no se llenaron, se
llenan con FormasBasicas grises.

Public void llenarUnaFilaGameSpace(): este método permite poner blocks en la fila 0 y 1 de la


matriz GameSpace y mostrarlas en pantalla, y son los blocks que el usuario verá desde el inicio.

Public FormaBasica[][] obtenerBlock(nivel: int): este método devuelve un nuevo block , que es una
matriz de 2 x 2 de Formas Basicas y cuyo color es seleccionado de una variedad indicada por el
parámetro nivel.

Public paintComponent(g: Graphics): este método permite redibujar todos los componentes de
GameArea y GameArea en sí mismo , pero ubicándolos en nuevas posiciones.

Public verificar_ganar(): permite verificar si el jugador ya ganó el juego. El jugador gano el juego si
todos los blocks en GameSpace desde la fila 0 hasta la 8 no son de colores iguales al color por
defecto de un JLabel.

Forma Básica
Atributos.

Prívate int mx: en la posición x en la matriz


Prívate int my: posición y en la matriz
Prívate int px: posición x en el panel en pixeles
Prívate int py: posición y en el panel en pixeles

Protecte Rectangle contorno:


Rodea a este label para saber si ha hecho interseccion con otro y detectar choques

Public forma básica(int x, int y, int px, int py,Color col):


Permite crear un nuevo objeto de forma básico con iguales similitudes a los demás.

public FormaBasica(int x, int y,Color col):


permite crear un nuevo objeto FormaBasica personalizado

public FormaBasica():
permite crear un nuevo objeto FormaBasica personalizado con una imagen transaparente de fonto
public int getMX():
permite obtener la posicion X en la matriz GameSpace de este label

public int getMY():


permite obtener la posicion Y en la matriz GameSpace de este label

public int getPX():


funcion: permite obtener la posicion X en la GUI

getPY:
funcion: permite obtener la posicion Y en la GUI

public void setMX_PX(int x):


funcion: permite asignar una posicion en X en la matriz a este label. Esta posicion esta relacionada
con aquella en la GUI: px=x*ancho del JLabel

public void setMY_PY(int y):


funcion: permite asignar una posicion en Y en la matriz a este label. Esta posicion esta relacionada
con aquella en la GUI: py=y*alto del JLabel

public void moveUp():


funcion: permite asignar valor py a este label de tal forma que se mueva para arriba

public void moveDown():


funcion: permite asignar valor py a este label de tal forma que se mueva para arriba

public void moveLeft():


funcion: permite asignar valor mx y px a este label de tal forma que se mueva hacia la izquierda
public void moveRight():
funcion: permite asignar valor mx y px a este label de tal forma que se mueva hacia la derecha

public void setMX(int x):


funcion: permite asignar un valor al atributo mx

public void setMY(int y):


funcion: permite asignar un valor al atributo my

GAME ESTATUS

private int time_left:


tiempo restante antes de que termine la ejecución

prívate int time_start:


es el tiempo con que inicia el juego antes que baje la prensa.
Prívate int veces = 1:
Cantidad de veces que se ha ganado una letra de Eshtakka.

private String player_name:


ingreso de nombre de usurario.

JLabel stakka_bar:
Label d de la etiquteta

public GameStatus(int time):


Almacena el estado del juego.

public void startCount():


llama al metodo Start del thread crono.

public void run():


Es lo qué se ejecuta cuando el thread se ejecuta o se manda a llamar.

public void setPlayer_name(String player_name):


funcion: permite modificar el atributo player_name

public String getPlayer_name():


funcion: permite obtener el nombre actual del jugador
Preferences.java
Atributos:
Visibilidad Tipo Identificador Observaciones
private int chunkSize Cantidad de cuadros a
destruir
private int speedSize Velocidad del
cronómetro
private int colorsSize Cantidad de colores
dentro del juego
private int rowsSize Cantidad de filas del
juego
private JSlider sChunk Deslizador de la
cantidad de cuadros a
destruir
private JSlider sSpeed Deslizador de la
velocidad del
cronómetro
private JSlider sColors Deslizador de la
cantidad de colores
del juego
private JSlider sRows Deslizador de la
cantidad de filas del
juego

Métodos:
Visibilidad Retorno Identificador Parámetros Observaciones
public No tiene Preferences Frame parent, Constructor
boolean modal personalizado de
la clase
private void onClick No recibe Acciones con el
mouse en el
botón Aceptar
public int getChunkSize No recibe Devuelve el valor
del ChunkSize
public int getSpeedSize No recibe Devuelve el valor
de la velocidad
del cronómetro
public int getColorsSize No recibe Devuelve la
cantidad de
colores del juego
actual
public int getRowsSize No recibe Devuelve la
cantidad de filas
del juego actual
Level.java
Atributos:
Visibilidad Tipo Identificador Observaciones
private int oLevel Guarda el valor del
nivel actual del juego

Métodos:
Visibilidad Retorno Identificador Parámetros Observaciones
public No tiene Level Frame parent, Constructor
boolean modal personalizado.
Inicializa los
objetos
public void setOLevel int oLevel Configura el
nuevo nivel del
juego
public int getOLevel No recibe Devuelve el nivel
del juego actual

PlayerName.java
Atributos:
Visibilidad Tipo Identificador Observaciones
private String playerName Almacena el nombre
del jugador

Métodos:
Visibilidad Retorno Identificador Parámetros Observaciones
public No tiene PlayerName Frame parent, Constructor
boolean modal, personalizado.
String title Inicializa la clase.
public void setPlayerName String Configura el
playerName nuevo nombre
del jugador
public String getPlayerName No recibe Devuelve el
nombre del
jugador

Window.java
Atributos:
Visibilidad Tipo Identificador Observaciones
private String playerName Almacena el nombre
del jugador
Ninguna GameStatus status Crea un estado del
juego, que muestra la
barra de progreso
Ninguna GameArea game Crea un área de juego
Métodos:
Visibilidad Retorno Identificador Parametros Observaciones
public No tiene Window No recibe Constructor
predefinido.
Inicializa el
objeto
private void initComponents No recibe Inicializa y
configura los
componentes
public void setPlayerName String Configura el
playerName nuevo nombre
del jugador
public String getPlayerName No recibe Devuelve el
nombre del
jugador actual

About.java
Métodos:
Visibilidad Retorno Identificador Parámetros Observaciones
public No tiene About Frame parent, Constructor
boolean modal predefinido,
inicializa el
objeto
private void initComponents No recibe Configura los
componentes
private String license No recibe Devuelve un
String con la
licencia del
programa

Splash.java
Métodos
Visibilidad Retorno Identificador Parametros Observaciones
public No tiene Splash String file, Frame Constructor
parent, int time predefinido,
inicializa el
objeto splashLeL

También podría gustarte