如何旋转2D整数数组

我正在编写一个俄罗斯方块克隆,在我的游戏中,我将我的tetromino块存储为4×4块arrays。 我现在需要能够旋转数组中的整数位置,以便我得到一个旋转的tetris块。 我不能简单地旋转纹理,因为我的所有碰撞检测等都被设计为与2D数组一起使用。 游戏是用CNA用CNA编写的。

我怎么可能顺时针/逆时针旋转我的2D数组的整数90度。

以下是我的’L’块存储的示例。

0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 

谢谢你的帮助。

如果它们是2Darrays,则可以通过使用不同的arrays访问顺序进行复制来实现旋转。

即,顺时针旋转,尝试:

 int [,] newArray = new int[4,4]; for (int i=3;i>=0;--i) { for (int j=0;j<4;++j) { newArray[j,3-i] = array[i,j]; } } 

逆时针是类似的。

不要用代码旋转碎片。 只需存储不同部件方向的arrays,并在旋转部件时循环通过它们。 在俄罗斯方块游戏中无需动态旋转它们。

由于问题领域是俄罗斯方块,你会发现旋转算法会产生不良影响,例如长薄的Tetronimo不会在两个位置之间交替(就像在真实的情况下那样)。

在经典的俄罗斯方块中,对象的排列非常少。 我只想在4个位置的每个位置为每个“tetromino”设置一个常量数组,并根据输入选择合适的数组。

为什么浪费CPU周期试图旋转它?

如果要旋转4 x 4块,只需移动位置:

 ABCA CDDB BDDC ACBA 

每个A移动到下一个A,B,C和D相同。

  /-----\ | | | V ABCA /->C D>D B--\ | BDDC | | ACBA | | | ^ | | | | | \----/ \----/ 

我存储“单元格”的(x,y)坐标,并使用旋转矩阵旋转它们。 例如,请参见绘制旋转矩形 。 您可能必须将结果舍入到最接近的0.5增量。

顺时针和逆时针的js代码:

 function arrRotation90(arr, clockwise) { var arr_rotated = []; for (var i = 0; i < arr[0].length; i++) { arr_rotated[i] = []; } if (clockwise) { for (var i = 0; i < arr.length; i++) { for (var j = 0; j < arr[i].length; j++) { arr_rotated[arr[i].length-1-j][i] = arr[i][j]; } } } else { for (var i = 0; i < arr.length; i++) { for (var j = 0; j < arr[i].length; j++) { arr_rotated[j][arr.length - 1 - i] = arr[i][j]; } } } return arr_rotated; }