Java 俄罗斯方块-硬滴逻辑

Java 俄罗斯方块-硬滴逻辑,java,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++) {

我正在制作俄罗斯方块,对于如何制作一个硬滴感到困惑

我尝试向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;
}
当我向上按的时候,虽然整个底部是空的,但这一块似乎只是往下跳了几行。。。所以它应该移到那个地方

有什么建议吗

谢谢

编辑--

我已经更新了计时器,使其接受一个值。。。如果
val==1
,这意味着瞬间跌落被击中。。。所以它将间隔设置为10毫秒

如果
val!=1
,它将遍历case语句

由于某些原因,一旦设置了
计时器(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();
//硬拖放
if(keycode==KeyEvent.VK_UP){
板。定时器(1);
对于(int i=0;i
俄罗斯方块本身就是一款不需要冲突管理的游戏,因为所有东西都被限制在一个网格中,你总是可以得到填充方块的坐标。一些俄罗斯方块变体实现了“瞬间下降”,按下“下降”按钮(“上升”,在你的例子中)我个人倾向于另一种选择,那就是加快(显著地,在一定程度上)碎片的下落速度

无论哪种方式,我都建议在每次移动(侧向或旋转)工件时调用
setFinalPosition()
方法,如果用户不采取任何操作或放下工件,该方法将存储当前工件的位置。然后,如果要进行“即时放下”,可以调用
getFinalPosition()
并将工件放在那里。当工件移动时,即使没有用户操作,也可以使用
getFinalPosition()
方法,只需检查当前位置是否等于最终位置。如果是,则停止工件


请注意,无论您是否为碰撞而烦恼,都要在没有用户操作的情况下(或者如果用户丢弃了工件)展望工件的最终位置方法是这样的。

为什么不一行一行地向下移动棋子直到发生碰撞?您是否尝试过在
return hardDropRow
上设置断点,以便查看失败的地方?您的硬放功能应该与游戏计时器做的完全相同,将当前棋子放下来直到发生碰撞。硬放功能n应该只执行“勾选”非常快,忽略计时器的速度将dropRow(我认为这是一个绝对坐标)添加到当前行是否有效?在硬拖放中,如果你检查是否有空格,你的意思是!=null吗?它不应该取决于当前作品的形状、旋转和当前列吗?@binnyb lol哦…我想我是想得太多了:/
    //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();