我正在编写一个俄罗斯方块克隆,在我的游戏中,我将我的tetromino块存储为4x4块阵列。我现在需要能够旋转数组中的整数位置,以便我得到一个旋转的tetris块。我不能简单地旋转纹理,因为我的所有碰撞检测等都被设计为与2D数组一起使用。游戏是用CNA用CNA编写的。
我怎么可能顺时针/逆时针旋转我的2D数组的整数90度。
以下是我的'L'块存储的示例。
0 1 0 0
0 1 0 0
0 1 1 0
0 0 0 0
感谢您的帮助。
答案 0 :(得分:29)
如果它们是2D数组,则可以通过使用不同的数组访问顺序进行复制来实现旋转。
即,顺时针旋转,请尝试:
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];
}
}
逆时针方向类似。
答案 1 :(得分:11)
请勿使用代码旋转碎片。只需存放一组不同的片段方向,并在片段旋转时循环播放。没有必要在俄罗斯方块游戏中动态旋转它们。
由于问题域是俄罗斯方块,你会发现旋转算法会导致不良影响,例如长薄的Tetronimo不会在两个位置之间交替(就像它在真实场景中那样)。
答案 2 :(得分:6)
在经典的俄罗斯方块中,对象的排列很少。我只想在4个位置的每个位置为每个“tetromino”设置一个常量数组,并根据输入选择合适的数组。
为什么浪费CPU周期试图旋转呢?
答案 3 :(得分:4)
如果要旋转4 x 4块,只需移动位置:
A B C A
C D D B
B D D C
A C B A
每个A移动到下一个A,B,C和D相同。
/-----\
| |
| V
A B C A
/->C D>D B--\
| B D D C |
| A C B A |
| | ^ |
| | | |
\----/ \----/
答案 4 :(得分:1)
我存储“单元格”的(x,y)坐标,并使用旋转矩阵旋转它们。 例如,请参阅Drawing a Rotated Rectangle。您可能必须将结果舍入到最接近的0.5增量。
答案 5 :(得分:0)
顺时针和逆时针的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;
}
答案 6 :(得分:0)
int[,] source = { { 1,2,3 }, {4,5,6 }, { 7,8,9} };
int[,] result = new int[3,3];
var rows = source.GetLength(0);
var cols = source.GetLength(1);
for (var r=0; r<rows; r++)
{
for (var c = 0; c < cols; c++)
{
result[r, c] = source[rows - 1 - c, r];
}
}