0

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

1 回答 1

1

你有正确的步骤,但错误的顺序。

  1. 计算所有图块的新位置(现在只使用 2 个图块来测试)

  2. 执行有效的移动检查(移动是否在界限内?并且...是 grid[x][y] 为空吗?)

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

  4. 最后,如果有效,将瓷砖放回新位置的板上

于 2013-03-27T18:43:26.413 回答