俄罗斯方块 – 硬降逻辑

我正在建造俄罗斯方块,我很困惑如何制作一块硬件。

我尝试将一个hardDrop()方法添加到Board类,它将从底行迭代并检查开放空间…

董事会类:

 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 class:你看我把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(); 

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

无论哪种方式,我建议每次移动(侧向或旋转)时调用setFinalPosition()方法,这将存储当前片段的位置,如果用户不采取任何操作或丢弃该片段。 然后,如果你想做一个’即时丢弃’,你可以调用getFinalPosition()并将其放在那里。 即使没有用户操作,只要一个棋子移动,您也可以使用getFinalPosition()方法,并检查当前位置是否等于最终位置。 如果确实如此,请停止该作品。

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