【发布时间】:2013-03-17 23:37:36
【问题描述】:
我正在用 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] 为空?)
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 为真,我将当前图块位置设置为 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);
}
}
}
【问题讨论】:
-
为什么不将所有标题包装成一个“片段”并将片段作为单个单元移动。这只是标题的呈现(因为它们会在技术上位于作品中的相同位置)