小游戏算法系列一之俄罗斯方块矩阵旋转的一种方法

来源:互联网 发布:空间数据质量国家标准 编辑:程序博客网 时间:2024/06/01 10:37

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

通常,在制作的时候,我们会用数组来表示一种形状,如L形我们会用如下二维数组表示
[[1,0],
[1,0],
[1,1]]

这是其中一种表示方法。那么形状的旋转就转化为对数组(矩阵)的旋转了。
那么要怎么旋转呢,有很多种方法

1是实现把旋转后的数组作为变量保持下来,旋转的时候调用

2.是用数学矩阵旋转的方法

3.就是我现在说的方法

经过观测,其实只是把数组旋转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循环中遍历一同实现。

下面来看看具体代码:

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;}


 

原创粉丝点击