俄罗斯方块,移动一块

时间:2013-03-27 18:20:43

标签: java swing

我正在用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);

enter image description here

输出:

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);
        }               
    }
}

1 个答案:

答案 0 :(得分:1)

你有正确的步骤,但订单错误。

1)计算所有瓷砖的新位置(现在仅使用2个瓷砖进行测试)

2)执行有效的移动检查(移动到边界?并且......是grid [x] [y] null?)

3)如果有效,将电路板上的当前图块设置为空(基本上,从板上拾取所有图块)

4)最后,如果有效,请将瓷砖设置在新位置的电路​​板上

祝你好运。