Java 俄罗斯方块-硬滴逻辑
我正在制作俄罗斯方块,对于如何制作一个硬滴感到困惑 我尝试向Board类添加一个Java 俄罗斯方块-硬滴逻辑,java,Java,我正在制作俄罗斯方块,对于如何制作一个硬滴感到困惑 我尝试向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++) {
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;
}
当我向上按的时候,虽然整个底部是空的,但这一块似乎只是往下跳了几行。。。所以它应该移到那个地方
有什么建议吗
谢谢
编辑--
我已经更新了计时器,使其接受一个值。。。如果val==1
,这意味着瞬间跌落被击中。。。所以它将间隔设置为10毫秒
如果val!=1
,它将遍历case语句
由于某些原因,一旦设置了计时器(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();
}
工件类:您可以看到,我将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();
//硬拖放
if(keycode==KeyEvent.VK_UP){
板。定时器(1);
对于(int i=0;i
俄罗斯方块本身就是一款不需要冲突管理的游戏,因为所有东西都被限制在一个网格中,你总是可以得到填充方块的坐标。一些俄罗斯方块变体实现了“瞬间下降”,按下“下降”按钮(“上升”,在你的例子中)我个人倾向于另一种选择,那就是加快(显著地,在一定程度上)碎片的下落速度
无论哪种方式,我都建议在每次移动(侧向或旋转)工件时调用setFinalPosition()
方法,如果用户不采取任何操作或放下工件,该方法将存储当前工件的位置。然后,如果要进行“即时放下”,可以调用getFinalPosition()
并将工件放在那里。当工件移动时,即使没有用户操作,也可以使用getFinalPosition()
方法,只需检查当前位置是否等于最终位置。如果是,则停止工件
请注意,无论您是否为碰撞而烦恼,都要在没有用户操作的情况下(或者如果用户丢弃了工件)展望工件的最终位置方法是这样的。为什么不一行一行地向下移动棋子直到发生碰撞?您是否尝试过在
return hardDropRow
上设置断点,以便查看失败的地方?您的硬放功能应该与游戏计时器做的完全相同,将当前棋子放下来直到发生碰撞。硬放功能n应该只执行“勾选”非常快,忽略计时器的速度将dropRow(我认为这是一个绝对坐标)添加到当前行是否有效?在硬拖放中,如果你检查是否有空格,你的意思是!=null吗?它不应该取决于当前作品的形状、旋转和当前列吗?@binnyb lol哦…我想我是想得太多了:/
//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();