俄罗斯方块 – 硬降逻辑
我正在建造俄罗斯方块,我很困惑如何制作一块硬件。
我尝试将一个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()
方法,并检查当前位置是否等于最终位置。 如果确实如此,请停止该作品。
请注意,无论您是否担心碰撞,在没有用户操作的情况下(或者如果用户丢弃该部件),预测该部件将在哪里结束都是可行的方法。