Realiza un sencillo juego de romper ladrillos con JAVA

Visión general

Use java para implementar un juego de ladrillo y mortero, la interfaz del juego incluye los siguientes elementos

  • Ladrillos de varios colores en la parte superior.
  • Deflector inferior
  • bola pequeña
  • Panel de visualización de información del juego
  • El juego incluye

Use el mouse o el teclado para mover el bisel

  • Rompe los ladrillos y gana puntos
  • Hay 3 posibilidades en cada ronda, si el deflector no recibe una bola pequeña, la posibilidad se reduce en 1
  • Cuando la bola negra es eliminada, los accesorios se dejarán caer y el deflector se alargará cuando el deflector reciba el apoyo.
  • Puede elegir el nivel de dificultad del juego.

Realización de funciones

Primero, toda la clase hereda de GraphicsProgram. Después de que se inicia el programa, primero se ejecuta el método init () y luego se ejecuta el método run ()

public class Arkanoid extends GraphicsProgram
{
    
    
    public void init()
    {
    
    
        // 进行初始化
    }

    public void run()
    {
    
    
        // 具体执行
    }
}

Luego, en init (), crea la interfaz del juego.

Crea ladrillos

Antes de crear un ladrillo, prepare un contenedor para almacenar el color y la puntuación correspondiente, aquí es realizado por Map, la clave guarda el objeto Color y el valor guarda la puntuación.

Map<Color,Integer> brickColors;

colors=new Color[]{
    
    
        Color.BLACK,Color.BLUE,Color.CYAN,Color.DARK_GRAY,Color.GRAY,Color.GREEN,
        Color.LIGHT_GRAY,Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED,Color.YELLOW
};
brickColors=new HashMap<>();
for(int i=0;i<colors.length;i++)
{
    
    
    Color color=colors[i];
    // 黑色砖块是特殊砖块,打掉不得分,但是可以掉落胶囊
    if(color.getRGB() == Color.BLACK.getRGB())
    {
    
    
        brickColors.put(color,0);
    }
    else
    {
    
    
        brickColors.put(color,colors.length%(i+1)+1);
    }
}

Con el color del ladrillo, el siguiente paso es crear los ladrillos de la fila y columna especificadas, aquí usamos GRect para representar los ladrillos.

Una cosa a tener en cuenta es que GRect tiene un borde de 1 píxel por defecto. Si no lo quita, debe tener en cuenta este píxel al calcular el ancho del ladrillo.

final int ROWS=6;
final int COLUMNS=12;

// 砖块实心部分的宽,高
brickW=GAME_PANE_WIDTH/COLUMNS;
brickH=brickW/2;

for(int i=0;i<ROWS;i++)
{
    
    
    for(int j=0;j<COLUMNS;j++)
    {
    
    
        GRect brick=new GRect(brickW,brickH);
        brick.setFilled(true);
        brick.setColor(colors[randomGenerator.nextInt(0,brickColors.size()-1)]);

        brick.setLineWidth(0);
        double x=j*brickW;
        double y=i*brickH;
        add(brick,x,y);
    }
}

Crea deflector y bola

Cree el deflector y la bola, use GRect y GOval respectivamente, y luego agréguelos a la posición apropiada.

Crear panel de visualización de información del juego

En el panel de visualización de información del juego, puede agregar algunos paneles para mostrar información de acuerdo con las funciones que implementará el juego.

Aquí crea paneles que incluyan [Probabilidad del juego] [Puntuación] [Dificultad del juego] [Un juego más] y así sucesivamente.

El más externo se crea usando JPanel, el método de diseño es GirdLayout, y luego se pueden agregar todos los elementos.

Use el mouse o el teclado para controlar el movimiento del bisel

Para realizar la función de permitir que el deflector se mueva con el mouse, debe agregar un oyente de mouse directamente al componente más externo de la interfaz del juego.

Llame al método addMouseListeners () y luego anule el método mouseMoved (MouseEvent), en el que la posición del deflector se puede establecer de acuerdo con la posición del mouse. Preste atención para limitar el rango de movimiento del deflector y evitar que exceda la interfaz del juego .

addMouseListeners();

public void mouseMoved(MouseEvent e)
{
    
    
    if(gameover) // 游戏结束,恢复挡板在底部正中央
    {
    
    
        paddle.setLocation(GAME_PANE_WIDTH/2.-paddle.getWidth()/2,GAME_PANE_HEIGHT-paddle.getHeight()-30);
    }
    else // 游戏运行中,动态改变挡板水平方向的位置
    {
    
    
        //paddle.setLocation(e.getX()-PADDLE_W/2,e.getY()-PADDLE_H/2);
        // 限制挡板左侧和右侧不能超出游戏界面的范围
        double x=e.getX()-paddle.getWidth()/2;
        if(x<0)
        {
    
    
            x=0;
        }
        if(x>GAME_PANE_WIDTH-paddle.getWidth())
        {
    
    
            x=GAME_PANE_WIDTH-paddle.getWidth();
        }
        paddle.setLocation(x,paddle.getY());
    }
}

Similar a usar un mouse, usar el teclado para operar el movimiento del deflector también requiere un detector de eventos clave.

addKeyListeners();

@Override
public void keyTyped(KeyEvent e)
{
    
    
    double x=paddle.getX();

    char keyChar=e.getKeyChar();
    if(keyChar == '1') // 左移
    {
    
    
        x-=paddle.getWidth()*1.5;
        if(x<=0)
        {
    
    
            x=0;
        }
    }
    else if(keyChar == '2') // 右移
    {
    
    
        x+=paddle.getWidth()*1.5;
        if(x>GAME_PANE_WIDTH-paddle.getWidth())
        {
    
    
            x=GAME_PANE_WIDTH-paddle.getWidth();
        }
    }
    paddle.setLocation(x,paddle.getY());
}

Bola en movimiento

Para mover la pelota, solo necesita estar en un bucle, siempre que el juego no haya terminado, solo llame a move () todo el tiempo.

Debes darle a la pelota una velocidad de movimiento inicial antes de que comience el juego, y la velocidad es diferente cada vez.

VELOCITY_X=3;
VELOCITY_Y=5;
boolean gameover=false;

public void init()
{
    
    
    int offset=randomGenerator.nextInt(0,3);
    vx=VELOCITY_X+offset;        // 水平速度
    vy=-(VELOCITY_Y+offset);        // 竖直速度
}

public void run()
{
    
    
    while(!gameover)
    {
    
    
        ball.move(vx,vy);
        pause(DELAY);
    }
}

Detecta si la pelota golpea la pared

De acuerdo con el ancho y la altura de la interfaz del juego y las coordenadas actuales de la pelota, determine si la pelota toca el borde de la interfaz del juego , para determinar si la pelota golpea la pared.

Si la pelota golpea la pared superior o inferior, la velocidad en la dirección y se invierte, y si golpea la pared izquierda o derecha, la velocidad en la dirección x se invierte.

El código es similar al siguiente

if(hitBottomWall() || hitTopWall())
{
    
    
    vy=-vy;
}
if(hitLeftWall() || hitRightWall())
{
    
    
    vx=-vx;
}

La pelota golpea el ladrillo y rebota, el ladrillo desaparece

Primero, haz que la bola golpee los ladrillos.

Necesita detectar 4 vértices, aquí solo se proporciona un código de muestra

GObject getCollidingObject()
{
    
    
    GObject element=getElementAt(x,y);
    if(element!=null)
        return element;
    return null;
}

Luego, cambia la trayectoria de la bola de acuerdo a donde golpea el ladrillo.

Un ladrillo se puede dividir en 8 áreas a su alrededor de acuerdo con las líneas que se extienden desde los 4 lados:

  • Hacia arriba, hacia abajo
  • Positivo a la izquierda, positivo a la derecha
  • Arriba a la izquierda, abajo a la izquierda, arriba a la derecha, abajo a la derecha

Si el centro de la bola está en la región superior o inferior, simplemente tome la velocidad en la dirección y;

Si el centro de la bola está en el área positiva izquierda o derecha, simplemente tome su velocidad en la dirección x;

Si el centro de la bola está en otra área, significa que golpea exactamente los 4 vértices del ladrillo, y la velocidad en las direcciones xey se invierte al mismo tiempo.

boolean changeX=false;
boolean changeY=false;

private void changeXY(GObject element,double center_x,double center_y)
{
    
    
    double left_brick=element.getX();
    double top_brick=element.getY();
    double right_brick=left_brick+brickW;
    double bottom_brick=top_brick+brickH;

    if(center_y>top_brick && center_y<bottom_brick) // 小球在砖块的左侧,或右侧
    {
    
    
        changeX=true;
    }
    else if(center_x>left_brick && center_x<right_brick) // 小球在砖块的上侧,或xia侧
    {
    
    
        changeY=true;
    }
    else // 小球在砖块的4个顶点范围
    {
    
    
        changeX=true;
        changeY=true;
    }
}

Finalmente, en el método de ejecución, cambie vx y vy de acuerdo con las variables changeX y changeY

GObject element=getCollidingObject();
if(element != null)
{
    
    
    if(element == paddle) // 如果打到挡板,反弹
    {
    
    
        vy=-vy;
        // 加一下速
        if(vx>0)
            vx+=va;
        else
            vx-=va;
        if(vy>0)
            vy+=va;
        else
            vy-=va;
        continue;
    }
    else
    {
    
    
        if(changeX)
            vx=-vx;
        if(changeY)
            vy=-vy;
        remove(element);
    }
}

Puntaje

Al golpear un ladrillo, solo necesitas obtener la puntuación correspondiente al color según el color del ladrillo y sumarla a la puntuación.

GObject element=getCollidingObject();
if(element != null)
{
    
    
    Color color=element.getColor();
    int point=brickColors.get(color);
    score+=point;
    scoreLabel_num.setText(""+score);
}

Deje caer accesorios, reciba accesorios, el deflector se vuelve más largo

Golpee un ladrillo negro y aparecerá un apoyo debajo del ladrillo, y caerá verticalmente; si usa un deflector para conectarse al apoyo antes de que el apoyo caiga a la pared inferior, el deflector se alargará.

Primero defina una lista de arreglos para almacenar los elementos caídos;

Después de golpear los ladrillos negros, cree un accesorio y agréguelo al recipiente;

Finalmente, deje que los accesorios en el contenedor "caigan";

Si el deflector recibe un accesorio, restablezca su tamaño.

ArrayList<GImage> falls;

if(color.getRGB() == Color.BLACK.getRGB())// 如果是黑砖块,落下道具
{
    
    
    Toolkit toolkit=Toolkit.getDefaultToolkit();
    Image image=toolkit.createImage("fall.png");
    GImage fall=new GImage(image);
    fall.setSize(PADDLE_W,PADDLE_W);
    add(fall,element.getX(),element.getY());
    falls.add(fall);
}

for(GImage fall:falls)
{
    
    
    if(fall != null)
    {
    
    
        fall.move(0,5);

        // 接到了道具
        if(Math.abs(paddle.getY()-fall.getY()-fall.getHeight())<=0.1 && (Math.abs(fall.getX()-paddle.getX())<=paddle.getWidth()-0.1))
        {
    
    
            remove(fall);
            double newWidth=paddle.getWidth()*1.5;
            if(newWidth>=GAME_PANE_WIDTH)
            {
    
    
                newWidth=GAME_PANE_WIDTH;
            }
            paddle.setSize(newWidth,paddle.getHeight());
        }
    }
}

Establecer el nivel de dificultad del juego

La dificultad aquí es simplemente aumentar la velocidad de la pelota cuando rebota en el deflector. Según la magnitud de la aceleración, se divide en
3 niveles de dificultad : [Fácil] [General] [Difícil].

Cree 3 botones de radio, configure sus monitores y cambie el rango de aceleración cuando se seleccionen

double va=0;

JRadioButton simpleBtn=new JRadioButton("简单",true);
JRadioButton middleBtn=new JRadioButton("一般");
JRadioButton diffcultyBtn=new JRadioButton("困难");

simpleBtn.addActionListener(e ->
{
    
    
    va=0;
});
middleBtn.addActionListener(e ->
{
    
    
    va=1;
});
diffcultyBtn.addActionListener(e ->
{
    
    
    va=2;
});

Luego, en el método de ejecución, agregue la aceleración a vx, vy

if(element == paddle) // 如果打到挡板,反弹
{
    
    
    vy=-vy;
    // 加一下速
    if(vx>0)
        vx+=va;
    else
        vx-=va;
    if(vy>0)
        vy+=va;
    else
        vy-=va;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_52308504/article/details/113615281
Recomendado
Clasificación