Can';我没有在我的Java俄罗斯方块游戏中发现错误

Can';我没有在我的Java俄罗斯方块游戏中发现错误,java,tetris,Java,Tetris,我和我的朋友用Java制作了一个类似俄罗斯方块的游戏,它运行了一段时间后,突然之间每次的总碎片数都差不多了。例如,它可能会在一次42块,下一次46块,之后44块 [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] [ ][ ][ ][ ][

我和我的朋友用Java制作了一个类似俄罗斯方块的游戏,它运行了一段时间后,突然之间每次的总碎片数都差不多了。例如,它可能会在一次42块,下一次46块,之后44块

[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][2][2][ ][ ][ ][ ][ ][ ][7]
[ ][2][2][2][3][3][ ][4][ ][7]
[2][2][1][3][3][1][ ][4][ ][7]
上面是一个在bug发生之前的例子。不要试图过多地阅读上面的示例,因为错误并不依赖于工件位置等

下面是错误发生后网格的外观

[ ][ ][ ][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?我花了数小时调试这段代码,从来没有遇到过找不到的bug(我通常用python编写代码,不过……Java对我来说是相当新的)

而且,这个bug似乎受到网格大小的影响。如果我将网格的高度设置为一个较低的数字,那么产生错误所需的碎片就更少。同样地,如果我做一个更高的网格,它需要更多的碎片

希望那里的Java专家能够帮助我们了解情况

p、 我正在Mac上使用JRE JVM 1.6在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");
}
public void打印网格(int行){
系统输出打印(“\n\n\n”+行+:\n”);
对于(int y=0;y
变量“line”并不重要,它只告诉我们调用函数printGrid()的行号

如果你们需要更多信息,请告诉我

更多其他信息:

private Grid grid[][] = new Grid[dimx][dimy];
这是这个程序的所有文件

  • Legend.java:
  • Listener.java:
  • TetrisFrame.java: (这里有90%的代码)
  • Grid.java:
  • Tetris.java:
  • Piece.java:
哦,这里是调试日志的摘录,为您提供更多信息


它包括成功地放置一个片段(在bug之前放置的最后一个片段),然后显示bug的发生。该函数的所有变量都已打印,没有一个变量显示不正确。错误发生在网格上任何位置的任何工件上。网格是在每次调用我上面提到的线路后打印的。如果你们需要更多信息,请告诉我。我想消除这个错误。

从您对问题的描述来看,
grid[0]
grid[1]
grid[6]
都是对同一行数组的引用(但是
grid[7]
及以上都是对不同数组的引用)。这将导致您描述的症状,其中更改单个元素会导致它在所有这些行中出现更改

尝试:


并查看是否得到
true
false
。您可能会得到
true

“我们是否可能发现了Java本身的一个bug?”——不太可能。总是先怀疑你自己的代码…有消息吗?NullPointerException或类似的东西?当您知道生成IMHO日志文件的代码时,IMHO日志文件是有用的。我建议您到别处查找该问题。(“当你消除了不可能,剩下的无论多么不可能,都一定是事实。”)你能给我们展示一下创建
网格
的代码和打印它的代码吗?@Ted我在我的原始帖子中编辑了所需的信息。哦,你引用的唯一问题“…消除了不可能,不管剩下什么…”是当bug发生时,没有其他东西写入网格。网格仅在放置新工件和完成一行时写入(行上方的所有工件向下移动一个)。当放置一个新的工件时,错误就会发生,但只有在放置了这么多的工件之后才会发生。在错误发生一次之后,它一直(随机)发生,直到我结束并重新打开游戏。从您发布的示例来看,它似乎是在一列获得四项时发生的。你能证实一种或另一种方法吗?这是一个很好的假设,我投票支持它,即使它不是根本原因。我把上面的代码添加到我的程序中,它是错误的。我还要重申,这种情况只会在一段时间后发生。该错误不会立即发生,需要一段时间才能生效。我会继续搜索,如果我有什么新发现,我会告诉你们的。“过一段时间”部分对我们来说毫无意义,因为你们还没有展示全部代码,只是最终结果。我们所能做的就是检查您所描述的内容,并找出发生这种情况的原因。您的数据结构是如何形成的,这不是您的问题的一部分。但我可以向你保证