gpt4 book ai didi

java - 俄罗斯方 block - 硬掉落逻辑

转载 作者:搜寻专家 更新时间:2023-11-01 02:28:04 26 4
gpt4 key购买 nike

我正在制作俄罗斯方 block ,但我对如何让一 block 硬 block 掉落感到困惑。

我尝试向 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),即使我改变它,间隔也不会变回来......

板类:

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

Piece 类: 您看到我将 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();

最佳答案

俄罗斯方 block 是一款不需要碰撞管理的游戏,本身,因为一切都被限制在一个网格中,而且您始终可以获得填充方 block 的坐标。一些俄罗斯方 block 变体实现了“即时下降”,其中按下“向下”按钮(在您的情况下为“向上”)将立即将当前棋子放在底部的任何地方。就个人而言,我赞成另一种选择,即加快(显着提高到一定程度)工件的下落速度。

无论哪种方式,我都建议每次移动棋子(横向或旋转)时调用 setFinalPosition() 方法,如果用户不采取任何操作,该方法将存储当前棋子的位置或放下棋子。然后,如果你想做一个“即时下降”,你可以调用 getFinalPosition() 并将棋子放在那里。您还可以在棋子移动时使用 getFinalPosition() 方法,即使没有用户操作,并且只需检查当前位置是否等于最终位置。如果是这样,请停止这件作品。

请注意,无论您是否为碰撞而烦恼,预测在没有用户操作(或者如果用户掉落棋子)的情况下棋子最终会在哪里是可行的方法。

关于java - 俄罗斯方 block - 硬掉落逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16592898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com