俄罗斯方块 - 硬降逻辑

时间:2013-05-16 16:33:36

标签: java

我正在建造俄罗斯方块,并且对于如何制作一块硬件感到困惑。

我尝试向Board类添加hardDrop()方法,该方法将从底行迭代并检查空格...

董事会成员:

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);
            }

当我按下时,即使整个底部都是空的,这件作品似乎也会跳过几行...所以它应该移动到那个位置。

有什么建议吗?

谢谢!

编辑 -

我已经更新了我的计时器,因此它接受了一个值...如果val == 1,则意味着瞬间掉落...所以它设置间隔= 10毫秒......

如果val != 1,则会通过案例陈述。

由于某种原因,设置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();

1 个答案:

答案 0 :(得分:5)

俄罗斯方块是一款不需要碰撞管理的游戏,本身,因为一切都被限制在一个网格中,你总能获得填充方块的坐标。一些俄罗斯方块的变体实现了“瞬间掉落”,其中按下“向下”按钮(在您的情况下为“向上”)将立即将当前作品放置在底部的任何位置。就个人而言,我赞成另一种选择,即加速(显着地,达到一定程度)该作品的下降速度。

无论哪种方式,我建议每次移动(侧面或旋转)时调用setFinalPosition()方法,如果用户不采取任何操作或丢弃该部分,则会存储当前部分的位置。然后,如果你想做一个“瞬间掉落”,你可以打电话给getFinalPosition()并把它放在那里。每当一个棋子移动而不用用户动作时,您也可以使用getFinalPosition()方法,并检查当前位置是否等于最终位置。如果确实如此,请停止该作品。

请注意,无论您是否担心碰撞,在没有用户操作的情况下(或者如果用户放下该部件),预测该部件将会在哪里结束都是可行的。