4

私はテトリスを構築していますが、ピースをハードドロップする方法について混乱しています。

hardDrop()一番下の行から反復して空きスペースをチェックするメソッドを Board クラスに追加しようとしました...

ボードクラス:

public int hardDrop() {
    int hardDropRow = 0;
    for(int row = totalRows-1; row > 0; row--) {
        for(int col = 0; col < grid[row].length; col++) {
            if (grid[row][col] != null) {
                hardDropRow = row;
                return hardDropRow;
            }
        }       
    }
    return hardDropRow;
}

ピースクラス:

dropRow次に、各ピースについて、次のように有効なものを追加しますgetRow()

        //Hard drop
        if (keycode == KeyEvent.VK_UP) {
            //get next valid coordinates nearest to bottom 
            //hard drop needs to which row the piece needs to drop to
            int dropRow;
            dropRow = board.hardDrop();
            for (int i = 0; i < tile.length; i++) {
                calcNewPosition(tile[i].getRow()+dropRow, tile[i].getCol(), i);
            }

上に押すと、下全体がヌルであっても、ピースは数行スキップしているように見えるので、その場所に移動する必要があります。

助言がありますか?

ありがとう!

編集 -

値を受け入れるようにタイマーを更新しました... if val == 1、それはインスタントドロップがヒットしたことを意味します...したがって、間隔= 10ミリ秒に設定されます...

の場合val != 1は、case ステートメントを通過します。

何故か一度timer(1)設定するとインターバルを変えても元に戻らない…

ボードクラス:

public void timer (int val) {
    int interval;
    if (val == 1) {
        interval = 1;       
    }
    else {
        switch (level) {
        //each level increases drop speed by .10 seconds
            case 1: interval = 700;
                    break;
            case 2: interval = 600;
                    break;
            case 3: interval = 500;
                    break;
            case 4: interval = 400;
                    break;
            case 5: interval = 300;
                    break;
            default: interval = 800;
                    break;
        }
    }
    Timer t = new Timer(interval, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (pause && gameWon){
                message = "You've won!";
            }
            else if (pause) {               
                seconds++;
            }
            else {
                seconds = 0;
                newPiece.autoMove();
                repaint(); 
            }
        }
     });
    t.start();  
}    

ピース クラス:1ハード ドロップのパラメータとしてに送信したことがわかります... その後、 ...timer()以外のもので元に戻します。1

    //hard drop
    if (keycode == KeyEvent.VK_UP) {
        board.timer(1);
        for (int i = 0; i < tile.length; i++) {
            calcNewPosition(tile[i].getRow()+1, tile[i].getCol(), i);
        }
        clearCurrPosition();
        for (int i = 0; i < tile.length; i++) {
            board.checkEndGame(tile[i].getRow(), tile[i].getCol());
        }
        board.timer(0);
        board.checkBottomFull();
        if (isCollision()) board.createNewPiece();
        move();
4

1 に答える 1

5

テトリスは、すべてがグリッドに制限されているため、衝突管理自体を必要としないゲームであり、人口の多い正方形の座標をいつでも取得できます。一部の Tetris バリアントは「インスタント ドロップ」を実装しており、「ダウン」ボタン (この場合は「アップ」) を押すと、現在のピースが一番下に着地する場所に即座に配置されます。個人的には、ピースのドロップ速度を(かなり、ある程度まで)スピードアップするという別のオプションを好みます。

いずれにせよsetFinalPosition()、ピースが動かされる (横または回転される) たびにメソッドを呼び出すことをお勧めします。これは、ユーザーがアクションを実行しないか、ピースをドロップした場合に、現在のピースの位置を格納します。次に、「インスタント ドロップ」を実行したい場合は、コールgetFinalPosition()してそこにピースを配置するだけです。また、ユーザーのアクションがなくgetFinalPosition()てもピースが移動するたびにこのメソッドを使用して、現在の位置が最終的な位置と等しいかどうかを確認することもできます。もしそうなら、作品を止めてください。

衝突を気にするかどうかに関係なく、ユーザーのアクションがない場合 (またはユーザーがピースを落とした場合) にピースがどこに到達するかを予測することが最善の方法であることに注意してください。

于 2013-05-16T16:51:14.807 に答える