我正在实现一个俄罗斯方块游戏,通常棋子的放置效果很好。然而,有时在放置棋子时,表示游戏状态的 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 次,但之后,世界总数大幅增长。
我无法弄清楚为什么会发生这种情况。
哦,pieces 数组只是一个恒定的 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 > 0; k--) { world[k] = world[k - 1];
问题不会发生。只是不明白这会如何影响它。
此外,无论输入哪种移动组合,它都会发生相同数量的迭代。