5

Javaでテトリスというゲームを作ろうとしています。

私はそれを次のようにしました:

  • 床にぶつかるか、y+1 が null でない場合 (その下に別のブロックがあることを意味する)、新しいブロックが生成される

    public void collisionCheck(int x, int y) {
        if (activetile.getY() == this.height-2 || getTileAt(x, y+1) != null) {
            activetile = new Tile(this, 0, 0);    
       }
    }
    
  • 一番下の行が null 以外の値、またはテトリスのピースでいっぱいになると、行がクリアされます (y = 4 (床) の場合、x = 4 まで x をループし、すべてが null でないかどうかを確認します)。

    public void checkBottomFull(int x, int y) {
    while (getTileAt(x,y) != null) {    
        say("(" + x + ", " + y +")");
        if (x == 3) {
            say("row is full");     
            //replace full row with tiles from above
            for (int i = 0; i < 4; i++) {
                for (int j = 5; j > 0; j--) {
                    grid[j][i] = getTileAt(i,j-1);
                    grid[j-1][i] = null;
                }
            }
        break;
        }       
       x++;
      }
    }
    

現在、キーを使用してブロックを移動しています。

public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();
    if(keyCode == KeyEvent.VK_DOWN) {
        activetile.setLocation(activetile.getX(), activetile.getY()+1);
        System.out.println("coordinates: " + activetile.getX() + ", " + activetile.getY());

        collisionCheck(activetile.getX(),activetile.getY());

        checkBottomFull(0,4);

        repaint();
    }
  }

私が抱えている2つの問題があります:

1) 写真では、私がブロックを床まで落としてしまったことに気付くでしょう...そして列が空になりました。クリアすると、左上 (x=0、y=1) にブロックが生成されますが、これは制御できません。

2)床に赤い線があるようです...これは、JFrameによって隠されているブロックの列であると想定しています...なぜそこにあるのかわかりません。

ここに画像の説明を入力

参考までに: grid[j][i] の行と列が反転している理由 (別名、grid[i][j] ではない理由) は、次のようにインスタンス化したためです。grid = new Tile[height][width];

何かご意見は?

ありがとう!

4

2 に答える 2

0

アプリを実際にデバッグしないと、何が問題なのかを判断するのは困難です。しかし、多分これを試してください:

public void checkBottomFull(int x, int y) {
    while (getTileAt(x,y) != null) {    
    say("(" + x + ", " + y +")");
    if (x == 3) {
        say("row is full");     
        //replace full row with tiles from above
        for (int i = 0; i < 4; i++) {
            for (int j = 4; j >= 0; j--) {
                grid[j][i] = getTileAt(i,j-1);
                grid[j-1][i] = null;
            }
        }
    break;
    }       
   x++;
   }
}

5 つの行 (0 から 4 までのインデックス) と 4 つの列 (0 から 3 までのインデックス) があります。高さと幅のどの値を渡しますか: grid = new Tile[height][width];

私が見たところ、次のようなことを行う必要があるためです。 grid = new Tile[5][4];

于 2013-03-06T10:51:44.333 に答える
0

ばあ、

キーイベントで判明したのは、衝突があるかどうかを確認する前に、底がいっぱいかどうかを確認する必要があったことです。

何が起こっていたのか、collisionCheck(activetile.getX(),activetile.getY());前にチェックcheckBottomFull(0,4);していたときに、下部がいっぱいになると、行がクリアされ、現在の行がその上の行と等しくなるように設定されていたと思いgrid[j][i] = getTileAt(i,j-1);ます:collisionCheck生成されたピースはクリアされ、 に置き換えられましたcheckBottomFull

の後に衝突チェックをcheckBottomFull配置すると、底がいっぱいになった場合に新しく生成されたピースが置き換えられないことが保証されます。

于 2013-03-07T04:00:38.713 に答える