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.