我正在构建俄罗斯方块,对于如何制作一个很难的作品感到困惑。
我尝试向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()
方法,只需检查当前位置是否等于最终位置即可。如果是这样,请停下来。
请注意,无论是否遇到碰撞,都需要向前看,如果没有用户动作(或者用户放下了一块),该块最终会到达哪里。