Java俄罗斯方块 - 奇怪的行清除问题

时间:2013-05-02 16:16:12

标签: java swing

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

如果我将电路板的宽度和高度设置为相同(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吗?):

enter image description here enter image description here

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

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

enter image description here

行清除:

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异常......

不知道为什么

2 个答案:

答案 0 :(得分: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]`

答案 1 :(得分:1)

你的循环的网格/列最大值可能会在某处交换出来。当它是正方形时它工作正常,因为它们是相同的。如果它不是正方形(即行/列最大值不同)那么对于一方它不会处理整个行/列而另一方会溢出。

不相关,但while(grid[col][row] == null)方法中isFull(...)循环的重点是什么?这应该是if吗?