无法发现我的Java Tetris游戏中的错误

时间:2011-05-19 01:45:14

标签: java tetris

我的朋友和我在Java中制作了一个类似俄罗斯方块的游戏,它可以正常工作一段时间,然后每次突然发出大约相同数量的总碎片。例如,它可能会错误地显示42件,其次是46件,之后是44件。

[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][2][2][ ][ ][ ][ ][ ][ ][7]
[ ][2][2][2][3][3][ ][4][ ][7]
[2][2][1][3][3][1][ ][4][ ][7]

以上是错误发生之前的示例。不要试图过多地阅读上面的示例,因为错误不依赖于作品位置等。

以下是错误发生后网格的样子......

[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ]
[ ][2][2][ ][ ][ ][ ][ ][ ][7]
[ ][2][2][2][3][3][ ][4][ ][7]
[2][2][1][3][3][1][ ][4][ ][7]

请注意,这两个人一直走到网格的顶部?这就是发生的事情。

这是事情变得有趣的地方。我们将其限制为特定功能和特定代码行。

grid[x+legend[piece.type].fetch(i, 0, piece.rotate)]
    [y+legend[piece.type].fetch(i, 1, piece.rotate)]
    .type = piece.type+1;

上面的代码行是被认为导致问题的确切代码行。问题是这行代码没有任何问题。我已经调试了整个程序大约一个星期,我在每次更改之后记录了网格。

上面两个网格之间的区别是对该线的一次调用。它不可能在网格中分配所有其他单元格。调试日志说变量是:

i: 0
legend[piece.type].block.length: 4
legend[piece.type].fetch(i, 0, piece.rotate): 0
legend[piece.type].fetch(i, 1, piece.rotate): 0
piece.type: 1
piece.rotate: 3
x: 3
y: 6

这些是影响上面第二个网格的变量。有问题的代码行会读到:

grid[3+0][6+0].type = 1+1;

我们是否有可能发现Java本身的错误?我花了好几个小时调试这段代码,我从来没有找到一个我找不到的bug(我通常在python中编写代码,但是...... Java对我来说还是个新手)

此外,似乎该错误受到网格大小的影响。如果我将网格的高度设置为较低的数字,则会导致错误。同样,如果我做一个更高的网格,它需要更多的碎片。

希望那里的Java专家可以帮助解释一下这种情况。

P.S。我正在使用JRE JVM 1.6在Mac上使用Eclipse进行编程。我也尝试过JRE JVM 1.4,同样的事情发生了。

其他信息:

private Grid grid[][] = new Grid[dimx][dimy];

上面的代码是在创建网格时。网格是一个类:

public class Grid {
    int type;

    public Grid(int type) {
    }
}

这是广泛的调试日志代码的一部分......这是打印基于文本的网格的函数。

public void printGrid(int line) {
    System.out.print("\n\n\n"+line+":\n");
    for (int y = 0;y < grid[0].length;y++) {
        for (int x = 0;x < grid.length;x++) {
            if (grid[x][y].type == 0) {
                System.out.print("[ ]");
            } else {
                System.out.print("["+grid[x][y].type+"]");
            }

        }
        System.out.println();
    }
    System.out.println("\n\n");
}

变量'line'并不重要,只是告诉我们调用printGrid()函数的行号。

如果您需要更多信息,请与我们联系。

更多其他信息:

以下是此计划的所有文件。

哦,这是调试日志的摘录,为您提供更多信息。

http://pastebin.com/9VKhF8CR

它包括成功放置一块(在bug之前放置的最后一块)然后它显示发生的错误。该函数的所有变量都打印出来,没有一个变得不合适。任何被放置在网格上任何位置的部件都会发生错误。每次打电话给我上面谈到的线路后打印网格。如果你们需要更多信息,请告诉我。我希望这个bug被压扁。

1 个答案:

答案 0 :(得分:4)

从您的问题描述中,出现,好像grid[0]grid[1]grid[6]都是对相同行数组(但grid[7]及更高版本是对不同数组的引用)。这将导致您描述的症状,更改单个元素会导致它在所有这些行中发生更改。

尝试:

System.err.println(grid[0] == grid[1]);

并查看您是true还是false。您可能会获得true