有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Brick Breaker从阵列中移除砖块,无需移动

最近我一直在做一个打破僵局的游戏,但是我遇到了一些问题。我遇到的问题是试图从arraylist中删除一块砖块。我首先使用bricks.remove(i)(我代表我想要移除的砖块)来实现这一点,但是这当然会导致问题,因为它会使数组向左移动,这意味着剩余的砖块被弄脏了。我尝试的第二个想法是将其设置为null,但这只会导致游戏在砖块被销毁时崩溃

有没有人能帮我在不移动阵列的情况下移除砖块

这是在阵列中创建砖块的方法:

public void createGameObjects()
{
    synchronized( Model.class )
    {
        ball   = new GameObj(W/2, H/2, BALL_SIZE, BALL_SIZE, Colour.RED );
        bat    = new GameObj(210, H - BRICK_HEIGHT*1.5f, BAT_WIDTH, 
            BRICK_HEIGHT/4, Colour.GRAY);
        bricks = new ArrayList<>();


        int pos = 50;
        int pos2 = 50;
        //first row
        for ( int i = 0; i < 10; i++){
            bricks.add(new GameObj(pos,300, BRICK_HEIGHT, BRICK_WIDTH, Colour.ORANGE));
            pos = pos + 50;
        }
        //Second row
        pos = 50;
        for ( int i = 0; i < 10; i++){
            bricks.add(new GameObj(pos,270, BRICK_HEIGHT, BRICK_WIDTH, Colour.RED));
            pos = pos + 50;
        }
        //Third row
        pos = 50;
        for ( int i = 0; i < 10; i++){
            bricks.add(new GameObj(pos,240, BRICK_HEIGHT, BRICK_WIDTH, Colour.GRAY));
            pos = pos + 50;
        }
        // Blue bricks for bricks to be hit twice
        pos = 50;
        for ( int i = 0; i < 10; i++){
            bricks.add(new GameObj(pos,300, BRICK_HEIGHT, BRICK_WIDTH, Colour.BLUE));
            pos = pos + 50;
        }

        // Greenbreaks out of view to increase the size of array
        for ( int i = 0; i < 60; i++){ 
            bricks.add(new GameObj(0,0, BRICK_HEIGHT, BRICK_WIDTH, Colour.GREEN));

        }

    }
}

该方法从砖块数组列表中声明Gameobj,并检测球击中砖块的情况。(这是我努力从中移除砖块的方法):

public void runAsSeparateThread()
    {
        final float S = 3; // Units to move (Speed)
        try
        {
            synchronized ( Model.class ) // Make thread safe
            {
                GameObj       ball   = getBall();     // Ball in game
                GameObj       bat    = getBat();      // Bat
                List<GameObj> bricks = getBricks();   // Bricks


            }
            while (runGame)
            {
                synchronized ( Model.class ) // Make thread safe
                {
                    float x = ball.getX();  // Current x,y position
                    float y = ball.getY();

                    // Deal with possible edge of board hit
                    if (x >= W - B - BALL_SIZE)  ball.changeDirectionX();
                    if (x <= 0 + B            )  ball.changeDirectionX();
                    if (y >= H - B - BALL_SIZE)  // Bottom
                    { 
                        ball.changeDirectionY(); addToScore( HIT_BOTTOM ); 
                    }
                    if (y <= 0 + M            )  ball.changeDirectionY();

                    // As only a hit on the bat/ball is detected it is 
                    //  assumed to be on the top or bottom of the object.
                    // A hit on the left or right of the object
                    //  has an interesting affect

                    String counter1 = "" + counter;
                    // Yellow Bricks
                    GameObj brick1 = bricks.get(0);
                    GameObj brick2 = bricks.get(1);
                    GameObj brick3 = bricks.get(2);
                    GameObj brick4 = bricks.get(3);
                    GameObj brick5 = bricks.get(4);
                    GameObj brick6 = bricks.get(5);
                    GameObj brick7 = bricks.get(6);
                    GameObj brick8 = bricks.get(7);
                    GameObj brick9 = bricks.get(8);
                    GameObj brick10 = bricks.get(9);
                    GameObj brick11 = bricks.get(10);
                    GameObj brick12 = bricks.get(11);
                    GameObj brick13 = bricks.get(12);
                    GameObj brick14 = bricks.get(13);
                    GameObj brick15 = bricks.get(14);
                    GameObj brick16 = bricks.get(15);
                    GameObj brick17 = bricks.get(16);
                    GameObj brick18 = bricks.get(17);
                    GameObj brick19 = bricks.get(18);
                    GameObj brick20 = bricks.get(19);
                    GameObj brick21 = bricks.get(20);
                    GameObj brick22 = bricks.get(21);
                    GameObj brick23 = bricks.get(22);
                    GameObj brick24 = bricks.get(23);
                    GameObj brick25 = bricks.get(24);
                    GameObj brick26 = bricks.get(25);
                    GameObj brick27 = bricks.get(26);
                    GameObj brick28 = bricks.get(27);
                    GameObj brick29 = bricks.get(28);
                    GameObj brick30 = bricks.get(29);
                    // Blue Bricks
                    GameObj brick31 = bricks.get(30);
                    GameObj brick32 = bricks.get(31);
                    GameObj brick33 = bricks.get(32);
                    GameObj brick34 = bricks.get(33);
                    GameObj brick35 = bricks.get(34);
                    GameObj brick36 = bricks.get(35);
                    GameObj brick37 = bricks.get(36);
                    GameObj brick38 = bricks.get(37);
                    GameObj brick39 = bricks.get(38);
                    GameObj brick40 = bricks.get(39);

                    if ( ball.hitBy(brick1)){
                        ball.changeDirectionY();
                        if (alreadyHit1 == true){
                            bricks.remove(0);
                            addToScore( HIT_BRICK  );
                            counter = counter - 1;
                            Debug.trace(counter1);

                        }
                    }
                    if ( ball.hitBy(brick2)){
                        ball.changeDirectionY();
                        if (alreadyHit2 == true){
                            bricks.remove(1);
                            addToScore( HIT_BRICK  ); 
                            counter = counter - 1;
                            Debug.trace(counter1);
                        }
                    }
                    if ( ball.hitBy(brick3)){
                        ball.changeDirectionY();
                        if (alreadyHit3 == true){
                            bricks.remove(2);
                            addToScore( HIT_BRICK  ); 
                            counter = counter - 1;
                            Debug.trace(counter1);
                        }
                    }
                    if ( ball.hitBy(brick4)){
                        ball.changeDirectionY();
                        if (alreadyHit4 == true){
                            bricks.remove(3);
                            addToScore( HIT_BRICK  );
                            counter = counter - 1;
                            Debug.trace(counter1);
                        }
                    }
                    if ( ball.hitBy(brick5)){
                        ball.changeDirectionY();
                        if (alreadyHit5 == true){
                            bricks.remove(4);
                            addToScore( HIT_BRICK  );
                            counter = counter - 1;
                            Debug.trace(counter1);
                        }
                    }  
                    if ( ball.hitBy(brick6)){
                        ball.changeDirectionY();
                        if (alreadyHit6 == true){
                            bricks.remove(5);
                            addToScore( HIT_BRICK  ); 
                            counter = counter - 1;
                            Debug.trace(counter1);
                        }
                    }
                    if ( ball.hitBy(brick7)){
                        ball.changeDirectionY();
                        if (alreadyHit7 == true){
                            bricks.remove(6);
                            addToScore( HIT_BRICK  ); 
                            counter = counter - 1;
                            Debug.trace(counter1);
                        }
                    }
                    if ( ball.hitBy(brick8)){
                        ball.changeDirectionY();
                        if (alreadyHit8 == true){
                            bricks.remove(7);
                            addToScore( HIT_BRICK  ); 
                            counter = counter - 1;
                            Debug.trace(counter1);
                        }
                    }
                    if ( ball.hitBy(brick9)){
                        ball.changeDirectionY();
                        if (alreadyHit9 == true){
                            bricks.remove(8);
                            addToScore( HIT_BRICK  ); 
                            counter = counter - 1;
                            Debug.trace(counter1);
                        }
                    }
                    if ( ball.hitBy(brick10)){
                        ball.changeDirectionY();
                        if (alreadyHit10 == true){
                            bricks.remove(9);
                            addToScore( HIT_BRICK  ); 
                            counter = counter - 1;
                            Debug.trace(counter1);
                        }
                    }
                    if ( ball.hitBy(brick11)){
                        ball.changeDirectionY();
                        bricks.remove(10);
                        addToScore( HIT_BRICK  ); 
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick12)){
                        ball.changeDirectionY();
                        bricks.remove(11);
                        addToScore( HIT_BRICK  ); 
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick13)){
                        ball.changeDirectionY();

                        bricks.remove(12);
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);

                    }
                    if ( ball.hitBy(brick14)){
                        ball.changeDirectionY();
                        bricks.remove(13);
                        addToScore( HIT_BRICK  ); 
                        counter = counter - 1;
                        Debug.trace(counter1);

                    }
                    if ( ball.hitBy(brick15)){
                        ball.changeDirectionY();
                        bricks.remove(14);
                        addToScore( HIT_BRICK  ); 
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick16)){
                        ball.changeDirectionY();

                        bricks.remove(15);
                        addToScore( HIT_BRICK  ); 
                        counter = counter - 1;
                        Debug.trace(counter1);

                    }
                    if ( ball.hitBy(brick17)){
                        ball.changeDirectionY();
                        bricks.remove(16);
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick18)){
                        ball.changeDirectionY();
                        bricks.remove(17);
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick19)){
                        ball.changeDirectionY();

                        bricks.remove(18);
                        addToScore( HIT_BRICK  ); 
                        counter = counter - 1;
                        Debug.trace(counter1);

                    }
                    if ( ball.hitBy(brick20)){
                        ball.changeDirectionY();
                        bricks.remove(19);
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick21)){
                        ball.changeDirectionY();
                        bricks.remove(20);
                        addToScore( HIT_BRICK  ); 
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick22)){
                        ball.changeDirectionY();

                        bricks.remove(21);
                        addToScore( HIT_BRICK  ); 
                        counter = counter - 1;
                        Debug.trace(counter1);

                    }
                    if ( ball.hitBy(brick23)){
                        ball.changeDirectionY();
                        bricks.remove(22);
                        addToScore( HIT_BRICK  ); 
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick24)){
                        ball.changeDirectionY();
                        bricks.remove(23);
                        addToScore( HIT_BRICK  ); 
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick25)){
                        ball.changeDirectionY();

                        bricks.remove(24);
                        addToScore( HIT_BRICK  ); 
                        counter = counter - 1;
                        Debug.trace(counter1);

                    }
                    if ( ball.hitBy(brick26)){
                        ball.changeDirectionY();
                        bricks.remove(25);
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick27)){
                        ball.changeDirectionY();
                        bricks.remove(26);
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick28)){
                        ball.changeDirectionY();

                        bricks.remove(27);
                        addToScore( HIT_BRICK  ); 
                        counter = counter - 1;
                        Debug.trace(counter1);

                    }
                    if ( ball.hitBy(brick29)){
                        ball.changeDirectionY();
                        bricks.remove(28);
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick30)){
                        ball.changeDirectionY();
                        bricks.remove(29);
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    //Blue bricks
                    if ( ball.hitBy(brick31)){
                        ball.changeDirectionY();
                        brick31 = new GameObj(50,350, BRICK_HEIGHT, BRICK_WIDTH, Colour.GREEN);
                        alreadyHit1 = true;
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick32)){
                        ball.changeDirectionY();
                        bricks.remove(31);
                        alreadyHit2 = true;
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick33)){
                        ball.changeDirectionY();
                        bricks.remove(32);
                        alreadyHit3 = true;
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick34)){
                        ball.changeDirectionY();
                        bricks.remove(33);
                        alreadyHit4 = true;
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick35)){
                        ball.changeDirectionY();
                        bricks.remove(34);
                        alreadyHit5 = true;
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick36)){
                        ball.changeDirectionY();
                        bricks.remove(35);
                        alreadyHit6 = true;
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick37)){
                        ball.changeDirectionY();
                        bricks.remove(36);
                        alreadyHit7 = true;
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick38)){
                        ball.changeDirectionY();
                        bricks.remove(37);
                        alreadyHit8 = true;
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick39)){
                        ball.changeDirectionY();
                        bricks.remove(38);
                        alreadyHit9 = true;
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }
                    if ( ball.hitBy(brick40)){
                        ball.changeDirectionY();
                        bricks.remove(39);
                        alreadyHit10 = true;
                        addToScore( HIT_BRICK  );
                        counter = counter - 1;
                        Debug.trace(counter1);
                    }

                    if ( counter < 1){
                        addToScore( HIT_BRICK  );
                        Debug.trace("Well done! you have completed BreakOut!");
                        break;
                    }

                    if ( ball.hitBy(bat) )
                        ball.changeDirectionY();

                }
                modelChanged();      // Model changed refresh screen
                Thread.sleep( fast ? 2 : 20 );
                ball.moveX(S);  ball.moveY(S);
            }
        } catch (Exception e) 
        { 
            Debug.error("Model.runAsSeparateThread - Error\n%s", 
                e.getMessage() );
        }
    }

在上面的方法中,我试图移除砖块的位置如下面的示例所示:

if ( ball.hitBy(brick1)){
                        ball.changeDirectionY();
                        if (alreadyHit1 == true){
                            bricks.remove(0);
                            addToScore( HIT_BRICK  );
                            counter = counter - 1;
                            Debug.trace(counter1);

                        }
                    }

alreadyHit1是一个布尔值,当此砖上方的蓝色砖被销毁时,它会变为真,从而允许此砖被销毁

谢谢你,希望你能帮忙 詹姆斯·霍利迪


共 (1) 个答案

  1. # 1 楼答案

    添加/删除列表中的元素时,列表的大小将调整。可以改用数组。这个数组是固定长度的。因此,可以通过将元素设置为null来“移除”砖块

    如果最初不知道砖块的数量,可以通过填充ArrayList,然后调用toArray来创建数组

    编辑:另外,现在我看到您已经对每个砖块分别被击中的情况进行了硬编码。你需要后退一步,学习循环/iteartions

    例如,这是一种迭代所有砖块的方法(前提是您有一个名为bricksList的砖块列表):

    GameObj[] bricks = bricksList.toArray(new GameObj[bricksList.size()]);
    
    for (int i = 0; i < bricks.length; i++) {
        if (ball.hitBy(bricks[i]) {
            ball.chageDirectionY();
            // more code here
        }
    }