jump to navigation

Ejercicio 3 Septiembre 11, 2008

Posted by beceoca in 1.
trackback

César Juárez Megías

ENUNCIADO EJERCICIO 3

 

En este caso en el ejercicio se trata de programar un pequeño juego en el que el jugador debe mantener una pelota rebotando de pared en pared sin dejarla caer al suelo.

Para lograrlo, el jugador moverá una raqueta en horizontal, a lo largo del borde inferior de la pantalla de juego.

 

En resumen, se trata de programar una versión simple del típico machaca-ladrillos (como por ejemplo el clásico Arkanoid) pero sin ladrillos.

Olvidaos de menús y similares: la partida comienza nada más arrancar el juego; esto es, aparece en pantalla una pelota moviéndose por la zona de juego y rebotando contra las paredes, y un rectángulo en la parte inferior que el jugador podrá mover a derecha e izquierda mediante el teclado.

Si la pelota llega a rebotar en la pared inferior (suelo), querrá decir que el jugador no logró interceptar la trayectoria de la pelota con la pala y se acabará la partida.

 

Para darle un poco más de gracia al asunto el algún lugar de la pantalla, preferiblemente fuera de la zona de juego, habrá un “marcador” que lleve la cuenta de cuántas veces ha rebotado hasta el momento la pelota contra la pala.

CLASES EJERCICIO 3

(para hacer la lectura más fácil he puesto los comentarios en color verde)

 

 

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

 

//La propia clase es un JFrame

public class Juego extends JFrame{

 

//Declaramos las variables necesarias

//Como la pantalla la vamos a dividir en dos zonas, creamos dos paneles, en el de arriba pondremos la zona de juego y el de abajo la información de los rebotes en la pared, etc

JPanel zonaJuego;

JPanel zonaInfo;

JLabel info;

JLabel juego[][];

int numeroRebotes = 0;

int posicPala = 7;

//Direcciones posibles de la pelota, 1 para derecha y arriba y dos para izquierda y abajo

direccionPelotaHorizontal = 1;

direccionPelotaVertical = 1;

//La pelota está al inicio en la fila 13 (ya que la 14 es solo para la pala) y centrada, es decir en la columna 7

int posicPelotaFila = 13;

int posicPelotaColumna = 7;

Timer timer;

 

 

//Constructor

public Juego(){

//Llamamos al constructor de JFrame poniendo ya el nombre de la ventana

super(“Proyecto machaca-ladrillos”);

//Inicializamos las variables

creaInfo();

creaJuego();

this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

 

this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(zonaJuego, BorderLayout.CENTER);
this.getContentPane().add(zonaInfo, BorderLayout.SOUTH);

 

Manejador manejador= new Manejador ();
addKeyListener(manejador);

 

this.setSize(950,700);

this.setResizable(false);

timer = new Timer(100, this);

timer.start();

this.setVisible(true);

}

 

//Metodo creaInfo, crea el area donde estará la información de los rebotes

public void creaInfo(){

info = new JLabel();

info.setText(“El numero de rebotes es: “+Integer.toString(numRebotes));

info.setOpaque(true);

info.setBackGround(Color.BLACK);

info.setForeground(Color.WHITE);

zonaInfo.add(info);}

 

//Metodo actualizaInfo, este método actualiza la etiqueta que contiene la informacion de los rebotes y refresca la pantalla para hacerla visible

public void actualizaInfo(){

info.setText(“El numero de rebotes es: “+Integer.toString(numRebotes));

this.setVisible(true);}

 

//Metodo creaJuego, crea el área donde estará la el juego

public void creaJuego(){

zonaJuego = new JPanel();

juego = new JLabel [15][15];

 

//Ponemos todo en negro en un principio

for(int i = 0; i<14; i++ ){

for(int j = 0; j<14; j++ ){

juego[i][j].setOpaque(true);

juego[i][j].setBackground(Color.BLACK);

zonaJuego.add(juego[i][j]);

}}

pintaPala();

pintaPelota();

}

 

//Metodo pintaPala, pintamos una pala de tres celdas de tamaño

public void pintaPala(){

juego[14][posicPala-1].setBackground(Color.BLACK);

juego[14][posicPala].setBackground(Color.BLACK);

juego[14][posicPala+1].setBackground(Color.BLACK);

}

 

//Método pintaPelota, pintamos una pelota de una celda de tamaño

public void pintaPelota(){

juego[posicPelotaFila][posicPelotaColumna].setBackground(Color.BLACK);

}

 

//Método actionPerformed, controla el timer

public void actionPerformed(ActionEvent e){

timer.stop();

 

//Si la pelota va hacia la derecha

if (direccionPelotaHorizontal == 1){

            //pero no ha llegado a la pared

if (posicionPelotaColumna != 14){

//Si la pelota va hacia arriba y no ha llegado al techo

if (direccionPelotaVertical == 1 && posicionPelotaFila != 0){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

posicionPelotaFila–;

posicionPelotaColumna++;

pintaPelota();

//Si la pelota va hacia arriba y ha llegado al techo

}else if (direccionPelotaVertical == 1 && posicionPelotaFila == 0){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

posicionPelotaFila++;

posicionPelotaColumna++;

pintaPelota();

//Si la pelota va hacia abajo y no ha llegado al suelo

} else if (direccionPelotaVertical == 2 && posicionPelotaFila != 14){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

posicionPelotaFila++;

posicionPelotaColumna–;

pintaPelota();

//Si la pelota ha va hacia abajo y ha llegado al suelo

}else if (direccionPelotaVertical == 2 && posicionPelotaFila == 14){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

//Si da con la pala

if (posicionPelotaColumna== posicPala || posicionPelotaColumna== posicPala-1 || posicionPelotaColumna== posicPala+1){

posicionPelotaFila–;

posicionPelotaColumna++;

pintaPelota();

}

            //Si no da con la pala has perdido

else if (posicionPelotaColumna!= posicPala || posicionPelotaColumna!= posicPala-1 || posicionPelotaColumna!= posicPala+1){

            System.out.println(“Game over”);

            System.exit(0);

            }

}

}

//y ha llegado a la pared

else if (posicionPelotaColumna == 14){

            //pero no ha llegado al techo

if (direccionPelotaVertical == 1 && posiciónPelotaFila!=0){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

posicionPelotaFila–;

posicionPelotaColumna–;

direccionPelotaHorizontal = 2;

pintaPelota();}

//pero ha llegado al techo

else if(direccionPelotaVertical == 1 && posiciónPelotaFila==0){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

posicionPelotaFila++;

posicionPelotaColumna–;

direccionPelotaHorizontal = 2;

direccionPelotaVertical = 2;

pintaPelota();

}

//pero no ha llegado al suelo

else if (direccionPelotaVertical == 2 && posiciónPelotaFila!=14){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

posicionPelotaFila++;

posicionPelotaColumna–;

direccionPelotaHorizontal = 2;

pintaPelota();

}

//pero ha llegado al suelo

else if(direccionPelotaVertical == 2 && posiciónPelotaFila==14){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

//Si da con la pala

if (posicionPelotaColumna== posicPala || posicionPelotaColumna== posicPala-1 || posicionPelotaColumna== posicPala+1){

posicionPelotaFila–;

posicionPelotaColumna–;

direccionPelotaHorizontal = 2;

numeroRebotes++;

actualizaInfo();

pintaPelota();

}

            //Si no da con la pala has perdido

else if (posicionPelotaColumna!= posicPala || posicionPelotaColumna!= posicPala-1 || posicionPelotaColumna!= posicPala+1){

            System.out.println(“Game over”);

            System.exit(0);

            }

}

 

}

}

 

//Si la pelota va hacia la izquierda

else if (direccionPelotaHorizontal == 2){

//pero no ha llegado a la pared

if (posicionPelotaColumna != 0){

//Si la pelota va hacia arriba y no ha llegado al techo

if (direccionPelotaVertical == 1 && posicionPelotaFila != 0){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

posicionPelotaFila–;

posicionPelotaColumna–;

pintaPelota();

//Si la pelota va hacia arriba y ha llegado al techo

}else if (direccionPelotaVertical == 1 && posicionPelotaFila == 0){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

posicionPelotaFila++;

posicionPelotaColumna–;

pintaPelota();

//Si la pelota va hacia abajo y no ha llegado al suelo

} else if (direccionPelotaVertical == 2 && posicionPelotaFila != 14){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

posicionPelotaFila++;

posicionPelotaColumna–;

pintaPelota();

//Si la pelota ha va hacia abajo y ha llegado al suelo

}else if (direccionPelotaVertical == 2 && posicionPelotaFila == 14){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

//Si da con la pala

if (posicionPelotaColumna== posicPala || posicionPelotaColumna== posicPala-1 || posicionPelotaColumna== posicPala+1){

posicionPelotaFila–;

posicionPelotaColumna–;

pintaPelota();

 

}

            //Si no da con la pala has perdido

else if (posicionPelotaColumna!= posicPala || posicionPelotaColumna!= posicPala-1 || posicionPelotaColumna!= posicPala+1){

            System.out.println(“Game over”);

            System.exit(0);

            }

}

}

//y ha llegado a la pared

else if (posicionPelotaColumna == 0){

            //pero no ha llegado al techo

if (direccionPelotaVertical == 1 && posiciónPelotaFila!=0){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

posicionPelotaFila–;

posicionPelotaColumna++;

direccionPelotaHorizontal = 1;

pintaPelota();

}

//pero ha llegado al techo

else if(direccionPelotaVertical == 1 && posiciónPelotaFila==0){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

posicionPelotaFila++;

posicionPelotaColumna++;

direccionPelotaHorizontal = 1;

direccionPelotaVertical = 2;

pintaPelota();

}

//pero no ha llegado al suelo

else if (direccionPelotaVertical == 2 && posiciónPelotaFila!=14){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

posicionPelotaFila++;

posicionPelotaColumna++;

direccionPelotaHorizontal = 1;

pintaPelota();

}

//pero ha llegado al suelo

else if(direccionPelotaVertical == 2 && posiciónPelotaFila==14){

juego[posicionPelotaFila][ posicionPelotaColumna].setBackground(Color.BLACK);

//Si da con la pala

if (posicionPelotaColumna== posicPala || posicionPelotaColumna== posicPala-1 || posicionPelotaColumna== posicPala+1){

posicionPelotaFila–;

posicionPelotaColumna++;

dirPelotaHorizontal = 1;

numeroRebotes++;

actualizaInfo();

pintaPelota();

}

            //Si no da con la pala has perdido

else if (posicionPelotaColumna!= posicPala || posicionPelotaColumna!= posicPala-1 || posicionPelotaColumna!= posicPala+1){

            System.out.println(“Game over”);

            System.exit(0);

            }

}

 

}

}

timer.start();

}//Fin del actionPerformed

 

//Clase interna Manejador, controla los eventos del teclado

class Manejador extends  KeyAdapter {

public void KeyPressed(KeyEvent evento){

//Miramos los casos posibles (tecla izda o dcha pulsada)

switch(evento.getKeyCode){

//Si la tecla pulsada es la derecha, miramos que no estemos ya pegando a la pared de la derecha y si no lo estamos movemos la pala

case KeyEvent.VK_RIGHT:

if(posicPala<13){

juego[14][posicPala-1].setBackground(Color.BLACK);

juego[14][posicPala+2].setBackground(Color.WHITE);

posicPala++;}

 

//Si la tecla pulsada es la izda, miramos que no estemos ya pegando a la pared de la izda y si no lo estamos movemos la pala

case KeyEvent.VK_LEFT:

if(posicPala>1){

juego[14][posicPala+1].setBackground(Color.BLACK);

juego[14][posicPala-2].setBackground(Color.WHITE);

posicPala–;}}}} //Fin de la clase interna Manejador

 

//Método Main

public static void main(String [] args){
 
Juego j = new Juego();
} //Fin del método Main

 

}//Fin de la clase Juego

CONCEPTOS USADOS EN EL EJERCICIO 3

 

En este caso los conceptos usados para resolver este ejercicio son los siguientes:

            - Conceptos de swing a nivel general

            - Conceptos de eventos

            - Timer

            - Uso de switch

Comentarios»

No comments yet — be the first.