Java俄罗斯方块-遍历双数组

Java俄罗斯方块-遍历双数组,java,swing,Java,Swing,我正在构建俄罗斯方块,并试图实现一种方法,该方法在网格[][]中迭代,检查每行的每一列,从底部开始,一路向上,我认为如果从底部开始,检查速度会更快,因为大多数行都需要清除 我对这一点的理解是-创建一个double for循环,对于每一行,检查该行中的所有列是否都已满且不为null。如果是,我将实现一个clear,它实际上是将当前行设置为上面的行。现在,我只是想输出完整的数据 我的系统.out.printlngrid[row][col]+,+row+,+col;检查是否正确表明它从最下面一行开始,

我正在构建俄罗斯方块,并试图实现一种方法,该方法在网格[][]中迭代,检查每行的每一列,从底部开始,一路向上,我认为如果从底部开始,检查速度会更快,因为大多数行都需要清除

我对这一点的理解是-创建一个double for循环,对于每一行,检查该行中的所有列是否都已满且不为null。如果是,我将实现一个clear,它实际上是将当前行设置为上面的行。现在,我只是想输出完整的数据

我的系统.out.printlngrid[row][col]+,+row+,+col;检查是否正确表明它从最下面一行开始,然后迭代每一列。。。但是如果网格[行][列]!=null{check似乎不在那一行上

public void checkBottomFull() {
int columnsFilled = 0;
    //loops through rows only after each column has finished
    for(int row = grid.length-2; row > 0; row--) {
        //loops through all columns per row, then row decrements
        for(int col = 0; col < grid[row].length; col++) {
            System.out.println(grid[row][col] + ", " + row + ", " + col);       
            if (grid[row][col] != null) {
                columnsFilled++;
                if (columnsFilled == grid.length-1) {
                    System.out.println("full");     
                }
            }
        }
    }
}
这里有几个问题:

您应该将int columnsFilled=0移动到外部for循环中,因为它被假定为仅检查当前行。现在,在您通过第一行后,计数将不正确。 您正在检查columnsFilled==grid.length-1,而事实上这应该是columnsFilled==grid[row].length-1。您的检查将填充列数与行数进行比较,而不是与给定行中的列数进行比较。 这里有几个问题:

您应该将int columnsFilled=0移动到外部for循环中,因为它被假定为仅检查当前行。现在,在您通过第一行后,计数将不正确。 您正在检查columnsFilled==grid.length-1,而事实上这应该是columnsFilled==grid[row].length-1。您的检查将填充列数与行数进行比较,而不是与给定行中的列数进行比较。

您可以考虑添加类似于

的便利函数
public boolean isFullRow(Tile[][] grid, int row)
{
    for(int i=0; i<grid[row].length; i++)
    {
        if(grid[row][i] == null){ return false; }
    }
    return true;
}
最后,作为一个小问题,我想

for(int row = grid.length-2; row > 0; row--)
可以/应该写为

for(int row = grid.length-1; row >= 0; row--) {

您可以考虑添加类似于

的便利函数
public boolean isFullRow(Tile[][] grid, int row)
{
    for(int i=0; i<grid[row].length; i++)
    {
        if(grid[row][i] == null){ return false; }
    }
    return true;
}
最后,作为一个小问题,我想

for(int row = grid.length-2; row > 0; row--)
可以/应该写为

for(int row = grid.length-1; row >= 0; row--) {

您发布的代码中有一些逻辑错误,附加的代码修复了这些错误,而没有为您实现所有功能

public class SampleClass {

static String[][] grid = new String[4][10];

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    loadGrid();
    checkBottomFull();
}
public static void checkBottomFull() {
    int columnsFilled = 0;
    //loops through rows only after each column has finished
    for(int row = grid.length-1; row >= 0; row--) {//needed 'greater than or equal to'
        columnsFilled=0; //need to reinitialize this before every iteration
        for(int col = 0; col <= grid[row].length-1; col++) { //needed 'less than or equal to'
           System.out.println(row + ", " + col+", "+grid[row][col]);       
            if (grid[row][col] != null) {
                columnsFilled++;
            }
        }
        System.out.println("columns that have a character" + columnsFilled);
        System.out.println("Needs to be "+grid[row].length+" to remove row");
        if (columnsFilled == grid[row].length) {
            System.out.println("full");   //this is where you should remove a row  
        }
    }
}

private static void loadGrid() {
    grid[0] = new String[] {"X","X","X","X","X","X","X","X","X","X"};
    grid[1] = new String[] {"X","X",null,"X","X","X",null,"X","X","X"};
    grid[2] = new String[] {"X","X","X",null,"X","X",null,"X","X","X"};
    grid[3] = new String[] {"X","X",null,"X","X","X",null,"X","X","X"};
}

}

您发布的代码中有一些逻辑错误,附加的代码修复了这些错误,但没有为您实现所有功能

public class SampleClass {

static String[][] grid = new String[4][10];

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    loadGrid();
    checkBottomFull();
}
public static void checkBottomFull() {
    int columnsFilled = 0;
    //loops through rows only after each column has finished
    for(int row = grid.length-1; row >= 0; row--) {//needed 'greater than or equal to'
        columnsFilled=0; //need to reinitialize this before every iteration
        for(int col = 0; col <= grid[row].length-1; col++) { //needed 'less than or equal to'
           System.out.println(row + ", " + col+", "+grid[row][col]);       
            if (grid[row][col] != null) {
                columnsFilled++;
            }
        }
        System.out.println("columns that have a character" + columnsFilled);
        System.out.println("Needs to be "+grid[row].length+" to remove row");
        if (columnsFilled == grid[row].length) {
            System.out.println("full");   //this is where you should remove a row  
        }
    }
}

private static void loadGrid() {
    grid[0] = new String[] {"X","X","X","X","X","X","X","X","X","X"};
    grid[1] = new String[] {"X","X",null,"X","X","X",null,"X","X","X"};
    grid[2] = new String[] {"X","X","X",null,"X","X",null,"X","X","X"};
    grid[3] = new String[] {"X","X",null,"X","X","X",null,"X","X","X"};
}

}

电流输出是多少?确实要从row=grid.length-2而不是row=grid.length-1开始吗?在调用第一个for循环后放置System.out.println,该循环显示row的值。@bakoyaro grid=new Tile[width][height];Tile只是一个类,其宽度和高度在Board.java中确定-在使用paintComponent填充行时,我会按如下方式填充每个Tile:g.fillRectrow*tilesize、col*tilesize、tilesize、tilesize;在两个循环之外,columnsFilled都设置为零,然后在逐行检查时递增,再也不会降回零。这是您的意图吗?您的测试可以通过使用布尔值isFull而不是int来简化。在第二个循环之前将isFull初始化为true。找到null时将其设置为false。如果满了就进行测试。电流输出是多少?确实要从row=grid.length-2而不是row=grid.length-1开始吗?在调用第一个for循环后放置System.out.println,该循环显示row的值。@bakoyaro grid=new Tile[width][height];Tile只是一个类,其宽度和高度在Board.java中确定-在使用paintComponent填充行时,我会按如下方式填充每个Tile:g.fillRectrow*tilesize、col*tilesize、tilesize、tilesize;在两个循环之外,columnsFilled都设置为零,然后在逐行检查时递增,再也不会降回零。这是您的意图吗?您的测试可以通过使用布尔值isFull而不是int来简化。在第二个循环之前将isFull初始化为true。找到null时将其设置为false。按ifisFull测试。最终点中的两个循环版本具有非常不同的效果。如果OP打算忽略第一行和最后一行,则不能也不应该进行重写。@PatriciaShanahan,没错。如果目的是忽略第一行和最后一行,那么它被正确地写入。然而,我猜那不是他们的意图。@jedwards我喜欢你的分离想法。它似乎仍然没有正确地迭代特定行中的列,因为我已经用所有非null值填充了一行,但isFull没有返回true。@咆哮者如果isFull没有返回true,则其中一个单元格为==null。考虑在其中添加一个PrtLn来找出哪一个,然后回溯找出为什么你肯定会得到空值。我的猜测是,当您认为您已经用非空值填充了一行时,您没有正确地进行填充。或者你是为了一个不同的行而不是你正在测试的行。在你的最后一点上,两个循环版本有很大的不同
租金效应。如果OP打算忽略第一行和最后一行,则不能也不应该进行重写。@PatriciaShanahan,没错。如果目的是忽略第一行和最后一行,那么它被正确地写入。然而,我猜那不是他们的意图。@jedwards我喜欢你的分离想法。它似乎仍然没有正确地迭代特定行中的列,因为我已经用所有非null值填充了一行,但isFull没有返回true。@咆哮者如果isFull没有返回true,则其中一个单元格为==null。考虑在其中添加一个PrtLn来找出哪一个,然后回溯找出为什么你肯定会得到空值。我的猜测是,当您认为您已经用非空值填充了一行时,您没有正确地进行填充。或者你是为了一个不同于你正在测试的行而做的。@咆哮者,请多点specific@Growler请更具体一点,我更新了上面的帖子。仍然存在输出问题。有什么想法吗?谢谢我更新了上面的帖子。仍然存在输出问题。有什么想法吗?谢谢