我的朋友和我在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()函数的行号。
如果您需要更多信息,请与我们联系。
更多其他信息:
以下是此计划的所有文件。
哦,这是调试日志的摘录,为您提供更多信息。
它包括成功放置一块(在bug之前放置的最后一块)然后它显示发生的错误。该函数的所有变量都打印出来,没有一个变得不合适。任何被放置在网格上任何位置的部件都会发生错误。每次打电话给我上面谈到的线路后打印网格。如果你们需要更多信息,请告诉我。我希望这个bug被压扁。
答案 0 :(得分:4)
从您的问题描述中,出现,好像grid[0]
,grid[1]
到grid[6]
都是对相同行数组(但grid[7]
及更高版本是对不同数组的引用)。这将导致您描述的症状,更改单个元素会导致它在所有这些行中发生更改。
尝试:
System.err.println(grid[0] == grid[1]);
并查看您是true
还是false
。您可能会获得true
。