我正在实施俄罗斯方块游戏,一般来说,工件的摆放工作正常。然而,偶尔放置一块时,表示游戏状态的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];
问题不会发生。只是不明白这会如何影响它。
此外,无论输入哪种移动组合,都会发生相同数量的迭代。
答案 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());