java:tetris随机块生成行清除

Gro*_*ler 5 java swing

我正试图在java中制作游戏俄罗斯方块.

我已经到了以下地步:

  • 当它碰到地板或其y + 1不为空时生成一个新块(意味着它下面有另一个块)

    public void collisionCheck(int x, int y) {
        if (activetile.getY() == this.height-2 || getTileAt(x, y+1) != null) {
            activetile = new Tile(this, 0, 0);    
       }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 当底行充满非空值或俄罗斯方块片段(y = 4(地板),循环x直到x = 4并检查是否所有非空)时,行清除

    public void checkBottomFull(int x, int y) {
    while (getTileAt(x,y) != null) {    
        say("(" + x + ", " + y +")");
        if (x == 3) {
            say("row is full");     
            //replace full row with tiles from above
            for (int i = 0; i < 4; i++) {
                for (int j = 5; j > 0; j--) {
                    grid[j][i] = getTileAt(i,j-1);
                    grid[j-1][i] = null;
                }
            }
        break;
        }       
       x++;
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

现在,我正在使用键移动块:

public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();
    if(keyCode == KeyEvent.VK_DOWN) {
        activetile.setLocation(activetile.getX(), activetile.getY()+1);
        System.out.println("coordinates: " + activetile.getX() + ", " + activetile.getY());

        collisionCheck(activetile.getX(),activetile.getY());

        checkBottomFull(0,4);

        repaint();
    }
  }
Run Code Online (Sandbox Code Playgroud)

我遇到了两个问题:

1)在图片中你会注意到我已经将块一直掉到了地板上......并且行被清除了.清除后,它将生成一个左上角的块(x = 0,y = 1),我无法控制.

2)在地板上似乎有一条红线......我假设是JFrame隐藏的一排块...我不知道为什么那里有.

在此输入图像描述

仅供参考:如果你想知道为什么grid [j] [i]有行和列翻转(也就是说,为什么它不是grid [i] [j])是因为我将它实例化为 grid = new Tile[height][width];

有什么想法吗?

谢谢!

Gro*_*ler 0

呸,

结果在关键事件中,我需要在检查是否发生碰撞之前检查底部是否已满。

collisionCheck(activetile.getX(),activetile.getY());我想发生的事情是,当我之前检查时checkBottomFull(0,4);,当底部已满时,它会清除该行并将当前行设置为等于它上面的行:grid[j][i] = getTileAt(i,j-1);,问题是collisionCheck正在生成一个新的块,并且新的块生成的碎片正在被清除并被替换checkBottomFull

将碰撞检查放在之后可checkBottomFull确保如果底部已满,新生成的块不会被替换。