俄罗斯方块是一个非常经典的益智游戏,也是很多编程爱好者的入门练手之作。
在制作俄罗斯方块这个游戏的时候,不得不解决一个问题,就是形状的旋转。

通常,在制作的时候,我们会用数组来表示一种形状,如L形我们会用如下二维数组表示
[[1,0],
[1,0],
[1,1]]
这是其中一种表示方法。那么形状的旋转就转化为对数组(矩阵)的旋转了。
那么要怎么旋转呢,经过观测,其实只是把数组旋转90度,方法应该有很多,我这里
提供一种方法。

如图1显示的是初始数组,表示图形L。
步骤:
1.提取出初始数组的第0列数据(图2)
2.新建一个一位数组tempArr,把图2数据一次压入新数组。(图3)
3.把tempArr压入一个辅助栈
4.提取出初始数组的第1列数据(图4)
5.新建一个一位数组tempArr,把图4数据一次压入新数组。(图5)
6.把tempArr压入辅助栈
7.最终栈的数据即为转置后的数组。(图6)
在实际开发中,我们可以新建一个数组来充当辅助栈,但要注意此时提取初始数组列的顺序应该从后往前提,因为往数组压入数组的时候,后压入的数组会在下方。
在实际开发中,提取初始数组列数据的操作,压入tempArr的操作可以在for循环中遍历一同实现。
下面来看看具体代码:
//L形状数据
var blokArr:Array =
[[1,0],
[1,0],
[1,1]];
//逆时针旋转
function blokTurnRight(blokArr:Array):Array{
var rows = blokArr.length;
var column = blokArr[0].length;
var newBlokArr:Array = new Array();//辅助栈
//从后往前遍历列数据
for(var i=column-1;i>=0;i--){
var tempArr:Array = new Array();
for(var j=0;j<rows;j++){
tempArr.push(blokArr[j][i]);
}
newBlokArr.push(tempArr);//把tempArr数组压入辅助栈数组
tempArr = null;
}
return newBlokArr;
}
//顺时针旋转,基本和上面一样
function blokTurnLeft(blokArr:Array):Array{
var rows = blokArr.length;
var column = blokArr[0].length;
var newBlokArr:Array = new Array();
for(var i=0;i<column;i++){
var tempArr:Array = new Array();
for(var j=rows-1;j>=0;j--){
tempArr.push(blokArr[j][i]);
}
newBlokArr.push(tempArr);
tempArr = null;
}
return newBlokArr;
}
在制作俄罗斯方块这个游戏的时候,不得不解决一个问题,就是形状的旋转。

通常,在制作的时候,我们会用数组来表示一种形状,如L形我们会用如下二维数组表示
[[1,0],
[1,0],
[1,1]]
这是其中一种表示方法。那么形状的旋转就转化为对数组(矩阵)的旋转了。
那么要怎么旋转呢,经过观测,其实只是把数组旋转90度,方法应该有很多,我这里
提供一种方法。

如图1显示的是初始数组,表示图形L。
步骤:
1.提取出初始数组的第0列数据(图2)
2.新建一个一位数组tempArr,把图2数据一次压入新数组。(图3)
3.把tempArr压入一个辅助栈
4.提取出初始数组的第1列数据(图4)
5.新建一个一位数组tempArr,把图4数据一次压入新数组。(图5)
6.把tempArr压入辅助栈
7.最终栈的数据即为转置后的数组。(图6)
在实际开发中,我们可以新建一个数组来充当辅助栈,但要注意此时提取初始数组列的顺序应该从后往前提,因为往数组压入数组的时候,后压入的数组会在下方。
在实际开发中,提取初始数组列数据的操作,压入tempArr的操作可以在for循环中遍历一同实现。
下面来看看具体代码:
//L形状数据
var blokArr:Array =
[[1,0],
[1,0],
[1,1]];
//逆时针旋转
function blokTurnRight(blokArr:Array):Array{
var rows = blokArr.length;
var column = blokArr[0].length;
var newBlokArr:Array = new Array();//辅助栈
//从后往前遍历列数据
for(var i=column-1;i>=0;i--){
var tempArr:Array = new Array();
for(var j=0;j<rows;j++){
tempArr.push(blokArr[j][i]);
}
newBlokArr.push(tempArr);//把tempArr数组压入辅助栈数组
tempArr = null;
}
return newBlokArr;
}
//顺时针旋转,基本和上面一样
function blokTurnLeft(blokArr:Array):Array{
var rows = blokArr.length;
var column = blokArr[0].length;
var newBlokArr:Array = new Array();
for(var i=0;i<column;i++){
var tempArr:Array = new Array();
for(var j=rows-1;j>=0;j--){
tempArr.push(blokArr[j][i]);
}
newBlokArr.push(tempArr);
tempArr = null;
}
return newBlokArr;
}