0

我在俄罗斯方块中清除行时遇到了一些奇怪的事情......

如果我将板的宽度和高度设置为相同(10 和 10):

board = new Board(10, 10, 35);

由以下因素决定:

public Board(int w, int h, int ts) {
    width = w;
    height = h;
    tilesize = ts;
    grid = new Tile[width][height];
...
}

public int getWidth() {
       return width * tilesize; 
}

public int getHeight() {
       return height * tilesize;
}

行清除似乎工作正常(虽然,我不确定为什么它下面有一个隐藏的行......它不应该完全适合 JFrame 吗?):

在此处输入图像描述在此处输入图像描述

但是,如果我以不同的方式设置宽度和高度(这里是 10 和 12),行将不会清除。

board = new Board(10, 12, 35);

在此处输入图像描述

行清零:

public void checkBottomFull() {
    System.out.println(grid.length);
    int lines = 0;
    for(int row = grid.length-1; row >= 0; row--) {
        while (isFull(row)) {       
            lines++;
            clearRow(row);   
        }
    }
}

public boolean isFull(int row) {
    for (int col = 0; col <= grid[row].length-1; col++) {
        while(grid[col][row] == null) {
             return false;
        }
    }
    return true;
}

public void clearRow(int rowToClear) {
     for(int row = rowToClear; row > 0; row--) {
         for(int col = 0; col < grid[row].length; col++) {
            grid[col][row] = grid[col][row-1];
         }
     }
}

任何想法为什么具有相同的尺寸可以使行清除?为什么这很重要?

谢谢!


我想我找到了这个问题,但是当我试图解决它时,它现在抛出了一个错误。

之前,我checkBottomFull()遍历了 grid.length-1,它等于 10 ( for(int row = grid.length-1; row >= 0; row--) {) 但是我将高度(行)设置为 12 gameBoard = new Board(10, 12, 35);,所以我应该循环遍历 12 行,而不是 10。我应该每循环 10 列排...

所以我硬编码了下面 12 的行和 10 的列......

//loop through all rows (12 rows)
public void checkBottomFull() {
    System.out.println(grid.length);
    for(int row = 12; row > 0; row--) {
        while (isFull(row)) {       
            clearRow(row);   
        }
    }
}
//loop through all columns in that row (10 columns)
public boolean isFull(int row) {
    System.out.println(grid[row].length);
    for (int col = 0; col <= 10; col++) {
        if(grid[col][row] == null) {
             return false;
        }
    }
    return true;
}

但它抛出了 IndexOutOfBounds 异常......

不知道为什么

4

2 回答 2

1

您可能已将循环的网格/列最大值换出某处。当它是方形的时候它工作得很好,因为它们是一样的。如果它不是方形的(即行/列最大值不同),那么对于一侧它不会处理整个行/列,而另一侧会溢出。

不相关,但是方法中while(grid[col][row] == null)循环的意义isFull(...)何在?这应该是一个if代替吗?

于 2013-05-02T16:26:28.593 回答
1

我注意到的一件事是:

for (int col = 0; col <= grid[row].length-1; col++) {
    while(grid[col][row] == null) {

你有,grid[row]但是grid[col][row]。这让我认为它应该是grid[col]或 grid[row][col]`

于 2013-05-02T16:20:04.150 回答