我正在构建俄罗斯方块,对于如何制作一个很难的作品感到困惑。

我尝试向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,它将通过case语句。

由于某种原因,一旦设置了timer(1),即使我更改了间隔,间隔也不会变回来...

董事会 class :
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();

最佳答案

Tetris是一款本身不需要碰撞管理的游戏,因为所有内容都被限制在网格中,并且您始终可以获取填充正方形的坐标。某些Tetris变体实现了“即时放置”功能,在其中按下“向下”按钮(在您的情况下为“向上”)会立即将当前片段放置在底部。就我个人而言,我赞成另一种选择,这是加快(明显地,一定程度上)作品的下降速度。

无论哪种方式,我都建议每次用户移动(横向或旋转)块时调用setFinalPosition()方法,如果用户不采取任何措施或放下该块,它将存储当前块的位置。然后,如果您想进行“即时放置”,则可以调用getFinalPosition()并将其放置在此处。您甚至还可以在没有用户动作的情况下每移动一块就使用getFinalPosition()方法,只需检查当前位置是否等于最终位置即可。如果是这样,请停下来。

请注意,无论是否遇到碰撞,都需要向前看,如果没有用户动作(或者用户放下了一块),该块最终会到达哪里。

09-05 01:51