我正在制作类似于着名游戏俄罗斯方块的程序,在旋转块时我遇到了一些问题。
我知道你可以通过使用“x = -y”和“y = x”来旋转坐标系中的数字,但问题是因为我使用整数数组来表示它所做的事情更难。
我的数组看起来像:
int[][] space = new int[20][10];
如果一个坐标包含一个块,则该值为1,否则为0。
那么如何在不占用负数的情况下旋转该空间中的块呢?
答案 0 :(得分:2)
这是一个示例文章(使用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
这是 rotate(piece):
01
11
01
这是旋转(旋转(片段)):
111
010
这里是旋转(旋转(旋转(片段))):
10
11
10
答案 1 :(得分:0)
如果我已经正确理解了这一点,你可以通过对坐标应用固定的偏移量来做到这一点。偏移量是您想要旋转的中心。
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];
}
}
我假设20是X维度,10是Y维度。这会围绕坐标(10,5)旋转10x10块。请注意,我只在中间旋转了一个10x10的块,因为这是两个空格之间的重叠。也许您正在将[20] [10]数组复制到[10] [20]数组,在这种情况下,您可以增加y的范围,使其从-10到9运行。
编辑:对不起,如果你有一个不同形状的输出数组,你还需要一组不同的偏移,因为(10,5)将不再位于中心。但你应该能够弄清楚这一点。