Ejercicio 3!
Agosto 24, 2008
Vamos con el ejercicio 3…dichoso juego del Arkanoid cutre…
Lo que nos proponen en este ejercicio es crear una especie de arkanoid pero bastante más sencillo, esto es:
Hay una zona de juego formada por cuatro paredes y una barra encima de la pared inferior. Entre estas cuatro paredes hay una pelota que va rebotando entre pared y pared. El juego consiste en evitar que la pelota que va moviendose por la zona de juego no toque la pared inferior, para conseguir esto tendremos que mover la barra de derecha a izquierda con el teclado.
Al iniciar el juego la pelota empieza a moverse, cada vez que rebote contra nuestra barra acumulamos un punto. Debe haber un marcador fuera de la zona de juego que nos vaya indicando cuantos puntos llevamos acumulados.
El enunciado del ejercicio está claro, lo único que no especifica, y por lo tanto podemos elegir, es la dirección que tiene que llevar la pelota (si tiene que ir siempre en la misma, si tiene que cambiar…) que por mi parte ha sido lo que más me ha dificultado terminar el juego.
La implementación es la siguiente:
CLASE ARKANOID
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//Clase Arkanoid
public class Arkanoid extends JFrame implements KeyListener, ActionListener{
JPanel panel1, panel2, panel3, panel4, panel5;
JLabel zonajuego[][];
JLabel marcador;
Container contenedor;
int contador=0;
int X=30;
int Y=20;
Timer timer;
int pos1,pos2,pos3;
int a,b;
int movanterior=1;
public Arkanoid(){
super(“Arkanoid cutre”);
//Creamos el panel del marcador
panel1=new JPanel();
panel5=new JPanel();
panel3=new JPanel();
panel4=new JPanel();
marcador=new JLabel(“Tienes “+Integer.toString(contador)+” puntos”);
panel1.add(marcador);
//Creamos el panel de juego
panel2=new JPanel();
panel2.setLayout(new GridLayout(X,Y));
zonajuego= new JLabel[X][Y];
for (int i=0;i<zonajuego.length;i++){
for (int j=0;j<zonajuego[i].length;j++){
zonajuego[i][j]=new JLabel();
zonajuego[i][j].setOpaque(true);
zonajuego[i][j].setBackground(Color.BLUE);
panel2.add( zonajuego[i][j]);
}
}
//Añadimos al panel de contenido
contenedor=getContentPane();
contenedor.setLayout(new BorderLayout());
contenedor.add(panel1, BorderLayout.NORTH);
contenedor.add(panel2, BorderLayout.CENTER);
contenedor.add(panel3, BorderLayout.EAST);
contenedor.add(panel4, BorderLayout.WEST);
contenedor.add(panel5, BorderLayout.SOUTH);
//Barra que se mueve
pos1=Y/2;
pos2=(Y/2)+1;
pos3=(Y/2)-1;
zonajuego[X-2][pos1].setBackground(Color.BLACK);
zonajuego[X-2][pos2].setBackground(Color.BLACK);
zonajuego[X-2][pos3].setBackground(Color.BLACK);
//Pelota
a=2;
b=Y/3;
zonajuego[a][b].setBackground(Color.YELLOW);
//Añadimos evento
this.addKeyListener(this);
//Timer
timer = new Timer(100, this);
timer.start();
}
//Metodo que nos devuelve true si la pelota choca con la barra
public boolean barra(){
if(zonajuego[a][b]==zonajuego[X-3][pos1]||zonajuego[a][b]==zonajuego[X-3][pos2]||zonajuego[a][b]==zonajuego[X-3][pos3]){
return true;
}
else{
return false;
}
}
//Implementamos actionPerformed de la interfaz ActionListener
public void actionPerformed(ActionEvent e){
if(a==0){
zonajuego[a][b].setBackground(Color.BLUE);
if(b==(Y-1)){
movanterior=5;
}
else{
a+=1;
int aleatorio=(int)((Math.random()*10)%2)+1;
switch(aleatorio){
case 1:b++; movanterior=1;
break;
case 2:b=b-1;movanterior=5;
break;}
zonajuego[a][b].setBackground(Color.YELLOW);
}
}
if(b==0){
zonajuego[a][b].setBackground(Color.BLUE);
if(a==0){
movanterior=1;
}
else{
b=b+1;
if((movanterior==3)||(movanterior==8)){
a=a-1;movanterior=4;
}
else if((movanterior==5)||(movanterior==2)){
a+=1;
movanterior=6;
}
zonajuego[a][b].setBackground(Color.YELLOW);
}
}
if(b==(Y-1)){
zonajuego[a][b].setBackground(Color.BLUE);
b=b-1;
if((movanterior==1)||(movanterior==6)){
a+=1;
movanterior=2;
}
else if((movanterior==7)||(movanterior==4)){
a=a-1;
movanterior=8;
}
zonajuego[a][b].setBackground(Color.YELLOW);
}
if(barra()){
contador++;
zonajuego[a][b].setBackground(Color.BLUE);
a=a-1;
int aleatorio=(int)((Math.random()*10)%2)+1;
switch(aleatorio){
case 1:b++;movanterior=7;
break;
case 2:b=b-1;movanterior=3;
break;}
zonajuego[a][b].setBackground(Color.YELLOW);
marcador.setText(“PUNTOS: “+Integer.toString(contador));
}
if((movanterior==6)&&(!barra())){
zonajuego[a][b].setBackground(Color.BLUE);
a+=1;
b+=1;
zonajuego[a][b].setBackground(Color.YELLOW);
}
if((movanterior==5)&&(b>0)){
zonajuego[a][b].setBackground(Color.BLUE);
a+=1;
b=b-1;
zonajuego[a][b].setBackground(Color.YELLOW);
}
if((movanterior==1)&&(b<Y)){
zonajuego[a][b].setBackground(Color.BLUE);
a+=1;
b+=1;
zonajuego[a][b].setBackground(Color.YELLOW);
}
if((movanterior==7)&&(b<Y)){
zonajuego[a][b].setBackground(Color.BLUE);
a=a-1;
b+=1;
zonajuego[a][b].setBackground(Color.YELLOW);
}
if((movanterior==2)&&(!barra())){
zonajuego[a][b].setBackground(Color.BLUE);
a+=1;
b=b-1;
zonajuego[a][b].setBackground(Color.YELLOW);
}
if((movanterior==8)&&(a>0)){
zonajuego[a][b].setBackground(Color.BLUE);
a=a-1;
b=b-1;
zonajuego[a][b].setBackground(Color.YELLOW);
}
if((movanterior==3)&&(b>0)){
zonajuego[a][b].setBackground(Color.BLUE);
a=a-1;
b=b-1;
zonajuego[a][b].setBackground(Color.YELLOW);
}
if((movanterior==4)&&(a>0)){
zonajuego[a][b].setBackground(Color.BLUE);
a=a-1;
b+=1;
zonajuego[a][b].setBackground(Color.YELLOW);
}
if(a==X-1){
marcador.setText(“FIN DEL JUEGO”); //System.exit(0);
}
}
//Implementamos los siguientes métodos de la interfaz KeyListener
public void keyPressed(KeyEvent e){
switch(e.getKeyCode()){
case KeyEvent.VK_LEFT:
if(pos3!=0){
zonajuego[X-2][pos2].setBackground(Color.BLUE);
zonajuego[X-2][pos3-1].setBackground(Color.BLACK);
pos1=pos1-1;
pos2=pos2-1;
pos3=pos3-1;
break;
}
else{
break;
}
case KeyEvent.VK_RIGHT:
if(pos2!=Y-1){
zonajuego[X-2][pos2+1].setBackground(Color.BLACK);
zonajuego[X-2][pos3].setBackground(Color.BLUE);
pos1=pos1+1;
pos2=pos2+1;
pos3=pos3+1;
break;
}
else{
break;
}
}
}
public void keyTyped(KeyEvent e){
e.consume();
}
public void keyReleased(KeyEvent e){
e.consume();
}
//Main
public static void main(String[]args){
Arkanoid a=new Arkanoid();
a.setSize(350,450);
a.setVisible(true);
a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}//Fin Clase
CONCEPTOS FUNDAMENTALES
Con este ejercicio hemos repasado conceptos de Swing y eventos. A diferencia de los anteriores, este ejercicio no especifica tanto cómo tenemos que hacerlo dándonos algo mas de libertad a la hora de plantearlo y buscar la forma de resolverlo.
Aún así, creo que el juego estaba enfocado a aclararnos conceptos de Swing( manejar ventanas, paneles, etiquetas…), y entender bien los eventos; con la creación del Timer vemos el uso de la interfaz ActionListener y la implementación del método actionPerformed, que es el que nos ha permitido que la pelota se mueva y rebote como nosotros le indiquemos. Para el movimiento de la barra utilizamos la interfaz KeyListener. Mediante los métodos keyPressed, keyTyped y keyReleased (los que hay que implementar obligatoriamente) hemos conseguido que la barra se mueva de izquierda a derecha, dandole la orden mediante el teclado.
En cuanto a los algoritmos que hay que plantear para resolver este ejercicio, creo que la dificultad ha sido mayor. Quizás los movimientos de la pelota era lo que más podía dificultar el juego.
Un saludoooo!!
Entry Filed under: Uncategorized. .
Trackback this post | Subscribe to the comments via RSS Feed