java - 无法发现我的 Java 俄罗斯方 block 游戏中的错误

标签 java tetris

我和我的 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() 被调用的行号。

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

更多附加信息:

这里是这个程序的所有文件。

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

http://pastebin.com/9VKhF8CR

它包括成功放置一个棋子(放置在错误之前的最后一个棋子),然后显示错误正在发生。该函数的所有变量都被打印出来,没有一个看起来不合适。该错误发生在放置在网格上任何位置的任何棋子上。每次调用我上面提到的行后都会打印网格。让我知道你们是否需要更多信息。我想解决这个错误。

最佳答案

根据您对问题的描述,它看起来好像是 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/

相关文章:

java - 无法更新 JTable 的信息

java - 阻止物体在俄罗斯方 block 游戏中越界

java - 用俄罗斯方 block 填充整个 2D 阵列(俄罗斯方 block 板),没有剩余空间(Java)

c - C 中的俄罗斯方 block 函数向右移动

java - java中UUID转换为int

Java setProperty() 在运行时不起作用

java - 无法加载/保存 ViewModel 属性的属性

java - 通过 Maven 使用 jar 作为资源

java - 使用 Stacks 的类似俄罗斯方 block 的小程序——从顶部弹出

python - 俄罗斯方 block 计时问题