5

我正在尝试用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);    
       }
    }
    
  • 当底行充满非空值或俄罗斯方块时,一行将被清除(对于 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++;
      }
    }
    

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

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();
    }
  }

我有两个问题:

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

2)在地板上似乎有一条红线......我假设它是被JFrame隐藏的一排块......我不确定为什么会在那里。

在此处输入图像描述

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

有什么想法吗?

谢谢!

4

2 回答 2

0

如果不实际调试您的应用程序,很难说出哪里出了问题。但也许试试这个:

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 = 4; j >= 0; j--) {
                grid[j][i] = getTileAt(i,j-1);
                grid[j-1][i] = null;
            }
        }
    break;
    }       
   x++;
   }
}

您有 5 行(索引从 0 到 4)和 4 列(索引从 0 到 3)。你传递给什么高度和宽度值:grid = new Tile[height][width];

因为据我所知,您应该这样做: grid = new Tile[5][4];

于 2013-03-06T10:51:44.333 回答
0

呸,

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

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

将碰撞检查放在checkBottomFull确保底部已满时不会替换新生成的部件。

于 2013-03-07T04:00:38.713 回答