我正在用Java制作俄罗斯方块...我能够得到一个单一的俄罗斯方块瓷砖移动得很好......但如果我尝试移动整块(由多个瓷砖组成),任何瓷砖移动到当前现有的瓷砖(当前俄罗斯方块)的位置设置为空。
我的目标是:
1)计算所有瓷砖的新位置(现在仅使用2个瓷砖进行测试)
if (keycode == KeyEvent.VK_DOWN) {
newX = tile.getX(); //tile x
newY = tile.getY()+1; //tile y
newX2 = tile2.getX(); //tile 2 x
newY2 = tile2.getY()+1; //tile 2 y
2)将电路板上的当前磁贴设置为空(基本上,从电路板上拾取所有磁贴)
board.setTileAt(null, tile.getX(), tile.getY());
board.setTileAt(null, tile2.getX(), tile2.getY());
Board的setTileAt方法供参考:
public void setTileAt(Tile tile, int x, int y) {
grid[x][y] = tile;
}
3)执行有效的移动检查(移动到边界?并且......是grid [x] [y] null?)
4)最后,如果有效,请将瓷砖设置在新位置的电路板上
tile.setLocation(newX, newY);
tile2.setLocation(newX2, newY2);
输出:
Game running...
original: 1, 1
new: 1, 2
original: 1, 2
new: 1, 3
有什么想法?我的逻辑是从板上拾取单件的单个瓷砖,然后在新位置更换它们是正确的吗?
谢谢!
编辑:
向Board类添加了有效的移动检查:
在界限?
public boolean isValidCoordinate(int x, int y) {
return x >= 0 && y >= 0 && x < width && y < height;
}
是开放点吗?
public boolean isOpen(int x, int y) {
return isValidCoordinate(x, y) && getTileAt(x, y) == null;
}
在Piece类中,如果isOpen为true,我将当前tile位置设置为null ...另外,我设置了新位置......
public void move(int keycode) {
//move
int newX, newY, newX2, newY2;
if (keycode == KeyEvent.VK_DOWN) {
newX = tile.getX();
newY = tile.getY()+1;
newX2 = tile2.getX();
newY2 = tile2.getY()+1;
if (board.isOpen(newX2, newY2) && board.isOpen(newX, newY)) {
board.setTileAt(null, tile.getX(), tile.getY());
board.setTileAt(null, tile2.getX(), tile2.getY());
System.out.println("original: " + tile.getX() + ", " + tile.getY());
System.out.println("new: " + newX + ", " + newY);
System.out.println("original: " + tile2.getX() + ", " + tile2.getY());
System.out.println("new: " + newX2 + ", " + newY2);
tile.setLocation(newX, newY);
tile2.setLocation(newX2, newY2);
}
}
}
答案 0 :(得分:1)
你有正确的步骤,但订单错误。
1)计算所有瓷砖的新位置(现在仅使用2个瓷砖进行测试)
2)执行有效的移动检查(移动到边界?并且......是grid [x] [y] null?)
3)如果有效,将电路板上的当前图块设置为空(基本上,从板上拾取所有图块)
4)最后,如果有效,请将瓷砖设置在新位置的电路板上
祝你好运。