2d布尔数组神秘地改变了它的状态

时间:2013-05-24 08:06:11

标签: java arrays

我正在实施俄罗斯方块游戏,一般来说,工件的摆放工作正常。然而,偶尔放置一块时,表示游戏状态的2d阵列的整列将填满。例如:

来自:

|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|  X XX   XX|

到此:

|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|       X   |
|  X XXXXXXX|

X是俄罗斯方块。

通过检查不同点的总块数,我将其缩小到这一部分:

int total = 0;
for (int i = 0; i < world.length - 1; i++) {
    for (int j = 0; j < width; j++) {
        if (world[i][j]) {
            total++;
        }
    }
}
System.out.println("total1 = " + total);

// add piece into environment
for (int i = 0; i < pieces[p.piece - 1][p.rotation].length; i++) {
    for (int j = 0; j < pieces[p.piece - 1][p.rotation][i].length; j++) {
        // if there is a piece block here
        if (pieces[p.piece - 1][p.rotation][i][j]) {
            world[depth + i][p.position + j] = true;
            System.out.println((depth+i) + ", " + (p.position + j));
        }
    }
}
total = 0;
for (int i = 0; i < world.length - 1; i++) {
    for (int j = 0; j < width; j++) {
        if (world[i][j]) {
            total++;
        }
    }
}
System.out.println("total2 = " + total);

这是前一个示例的输出:

total1 = 5
17, 7
18, 6
18, 7
18, 8
total2 = 26

正如您所看到的,唯一可以更新世界数组的点只改变了4次,但之后,世界总数大幅增长。

我无法弄清楚为什么会这样。

哦,片段数组只是一个恒定的4d数组

编辑:

经过大量测试后,我认为这与我删除行的代码有关,这与上一段代码完全相同:

boolean fullRow;
    latestCleared = 0;
    // check for completed lines
    // for each row
    for (int i = 0; i < world.length - 1; i++) {
        fullRow = true;
        for (int j = 0; j < width; j++) {
            if (!world[i][j]) {
                fullRow = false;
                break;
            }
        }
        if (fullRow) {
            for (int j = 0; j < width; j++) {
                world[i][j] = false;
            }
            for (int k = i; k > 0; k--) {
            world[k] = world[k - 1];
            }

        }
        latestCleared++;
    }

当我发表评论时:     for(int k = i; k&gt; 0; k--){     世界[k] =世界[k - 1];

问题不会发生。只是不明白这会如何影响它。

此外,无论输入哪种移动组合,都会发生相同数量的迭代。

1 个答案:

答案 0 :(得分:3)

在代码的抑制部分,您遇到了问题:

for (int k = i; k > 0; k++) {
    world[k] = world[k - 1];
}

您正在做的是复制行的引用,而不是复制前一行中包含的值。你应该做点什么:

for (int k = i; k > 0; k++) {
    for (int j = 0; j < width; j++) {
        world[k][j] = world[k - 1][j];
    }
}
// Adding a new blank row on the top of the world
for (int j = 0; j < width; j++) {
    world[0][j] = false;
}

此代码将复制前一行中包含的行值(而不是行的引用)。

只是为了清理您的代码,您可以取消该部分:

for (int j = 0; j < width; j++) {
    world[i][j] = false;
}

因为您将在此值的值中复制前一行的值。

我认为在您的示例中,您在添加生成问题的部分之前禁止了行。由于行的引用完全不可预测,因此它会给您带来不可预测的行为。

我希望这个简单的修改可以解决整个问题,但如果你有相似的代码,请检查你的项目。

编辑:我很确定你的所有行(除了最后一行)实际上都指向同一个引用。因此,当你在第二行添加一个至少有一个元素的片段时,这个元素将在每一行中重复,直到世界之巅。

EDIT2:您可以打印行的引用以确认问题:

StringBuilder builder = new StringBuilder();
for (int i = 0; i < world.length; i++) {
    builder.append(world[k]).append("\n");
}
System.out.println(builder.toString());