【问题标题】:Rotating blocks in 2D-array二维阵列中的旋转块
【发布时间】:2012-02-22 23:45:52
【问题描述】:

我正在制作一个类似于著名游戏俄罗斯方块的程序,但在旋转方块时遇到了一些问题。

我知道您可以使用“x = -y”和“y = x”在坐标系中旋转图形,但问题是因为我使用整数数组来表示块,所以它使事情变得如此困难得多。

我的数组看起来像:

int[][] space = new int[20][10];

如果坐标包含块,则值为 1,否则为 0。

那么我怎样才能在那个空间中旋转一个块而不会遇到负数问题呢?

【问题讨论】:

  • 如果值为 0 或 1,为什么不直接使用布尔值?
  • 最好的解决方法是,如果你拿起一支铅笔和一张纸,在其中画一个网格和一个形状,然后观察旋转它时会发生什么。我知道这不是答案,但相信我,你会通过这种方式学到更多。
  • 由于您使用的是二维数组,因此我认为为此目的使用方阵会更容易。这是因为,在方阵中,如果需要在旋转时交换行/列的大小,您将不会遇到问题。
  • @biziclop 我听取了您的建议,并在想如果我将要旋转的形状添加到一个新的较小数组中可能会更容易,这样我就可以更轻松地设置偏移量并以这种方式旋转它.我会尝试一下,但不确定它是否会起作用。

标签: java rotation coordinate-systems


【解决方案1】:

这是一个示例(使用 0 和 1 重复使用您的 int[][],这也可以使用布尔数组来完成):

private static final int[][] piece = new int[][] {
        { 0, 1, 0, },
        { 1, 1, 1, },
};

你可以这样旋转一块:

private static int[][] rotate( final int[][] piece ) {
    final int[][] res = new int[piece[0].length][piece.length];
    for (int x = 0; x < piece.length; x++) {
        for (int y = 0; y < piece[0].length; y++) {
            res[(res.length-1)-y][x] = piece[x][y];
        }
    }
    return res;
}

起始部分:

010
111

这是旋转(片)

01
11
01

这里是 rotate(rotate(piece))

111
010

这里是 rotate(rotate(rotate(piece)))

10
11
10

【讨论】:

    【解决方案2】:

    如果我理解正确,您可以通过对坐标应用固定偏移量来做到这一点。偏移量是您要围绕其旋转的中心。

    int oldSpace[][] = new int[20][10];
    int newSpace[][] = new int[20][10];
    int offX = 10;
    int offY = 5;
    for(int x = -5; x < 5; x++) {
      for(int y = -5; y < 5; y++) {
        newSpace[offX+x][offY+y] = oldSpace[offX-y][offY+x];
      }
    }
    

    我假设 X 维度为 20,Y 维度为 10。这将围绕坐标 (10,5) 旋转 10x10 块。请注意,我只在中间旋转了一个 10x10 块,因为这是两个空间之间的重叠。也许您正在将 [20][10] 数组复制到 [10][20] 数组,在这种情况下,您可以增加 y 的范围,使其从 -10 运行到 9。

    编辑:抱歉,如果您有不同形状的输出数组,您还需要一组不同的偏移量,因为 (10,5) 将不再位于中心。但是你应该能够弄清楚这一点。

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多