我和我的 friend 用 Java 制作了一个类似俄罗斯方 block 的游戏,它在一段时间内运行良好,然后突然出现错误,每次的总棋子数量都差不多。例如,它可能一次出现 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 本身的错误?我花了几个小时调试这段代码,而且我从来没有遇到过我找不到的错误(我通常用 python 编写代码,但是……Java 对我来说是相当新的)
此外,该错误似乎受网格大小的影响。如果我将网格的高度设置为较低的数字,则导致错误的部分就会减少。同样的道理,如果我做一个更高的网格,它需要更多的碎片。
希望那里的 Java 专家可以帮助阐明这种情况。
附注我正在使用 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() 被调用的行号。
如果你们需要更多信息,请告诉我。
更多附加信息:
这里是这个程序的所有文件。
- 图例.java: http://pastebin.com/mWL7wACW
- 监听器.java: http://pastebin.com/8A2BgicD
- TetrisFrame.java: http://pastebin.com/1HKgc1uS (90% 的代码在这里)
- 网格.java: http://pastebin.com/6HgKZsaF
- 俄罗斯方 block .java: http://pastebin.com/kHdnvHyT
- 片段.java: http://pastebin.com/k5PZpCzd
哦,这是调试日志的摘录,可为您提供更多信息。
它包括成功放置一个棋子(放置在错误之前的最后一个棋子),然后显示错误正在发生。该函数的所有变量都被打印出来,没有一个看起来不合适。该错误发生在放置在网格上任何位置的任何棋子上。每次调用我上面提到的行后都会打印网格。让我知道你们是否需要更多信息。我想解决这个错误。
最佳答案
根据您对问题的描述,它看起来好像是 grid[0]
、grid[1]
到 grid[ 6]
都是对相同 行数组的引用(但 grid[7]
及以后是对不同数组的引用)。这会导致您描述的症状,即更改单个元素会导致它在所有这些行中看起来都发生了变化。
尝试:
System.err.println(grid[0] == grid[1]);
看看你得到的是true
还是false
。您可能会得到 true
。
关于java - 无法发现我的 Java 俄罗斯方 block 游戏中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6052915/