2

私はテトリス ゲームを実装していますが、通常、ピースの配置は正常に機能します。ただし、ピースを配置するときに、ゲームの状態を表す 2 次元配列の列全体がいっぱいになることがあります。例えば:

これから:

|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|           |
|  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];

問題は発生しません。これがどのように影響するのか理解できません。

また、どの技の組み合わせが投入されても同じ回数の繰り返しで発生します。

4

1 に答える 1