|
楼主 |
发表于 2012-9-12 13:41:10
|
显示全部楼层
砖型算法:只有一句
砖型="11211222101121222011211210111213101112221011120210111221"7种砖型数组集合
--------------------------------------------
原点
╲ 0 1 2 3
0 * * * *
1 * [1][2] * ←第一种方型
2 * [3][4] *
3 * * * *
这是个方形砖型矩阵,如果我们把左上角那一点看作是x0y0,那么从上面可以看出点1的xy坐标是“11”(现在才发现这个错误!项目资源里的算法说明这里写的是“10”,这个要改改),四个点的坐标连起来就是“11211222”
就是上面砖型变量的前8位数,同理我们把其它6种砖型的点都加入砖型变量,7种砖型我们用0-6来表示,要用时再截取出来就行了。
例如我们要取Z 型的方砖,因为2代表这种砖型,所以我们把2代入:
整型 x,y,i
重复(4)
x=转换.字符型转整型(字符串.截取(砖型,2*8+0+i,2*8+1+i))//→按砖型取出方砖四个点的x,y坐标
y=转换.字符型转整型(字符串.截取(砖型,2*8+1+i,2*8+2+i))
i=i+2
重复结束
因为每8位代表一个砖型,所以2砖型是从16位开始,故2*8。
表示这排版很让我头痛,怎样都对不齐!
----------------------------------------------
旋转算法:核心算法也只有二句
旋x[yy]=3 - 砖y点[yy]
旋y[yy]=砖x点[yy]
虽然只有二句,但要我解析起来还有点难度,因为我都不知怎样表达自己的意思,套用以前老师的一句话“只能意会,不能言传”
这个算法的重点是我们已经知道x0y0旋转后的位置是在x3y0
如果我们以A点为原点,从上图我们可以发现,旋转后A点的位置虽然变化了,但它和各点间的距离是不会变的,
所以只要我们知道了旋转后A点的位置,我们就可以根据它和其它点固定的距离来推算出其它点旋转后的坐标。
而A点和各个点的距离刚好是各个点的坐标,如旋转前x轴上,A点和B点C点的距离分别是1、2,而刚好B点C点的
X坐标是X1、X2,所以,A点和各点的距离就是各点的坐标。明白以上二点就好推算了。
但旋转后A点和其它点X轴的距离变成了Y轴的距离,A点和其它点Y轴的关系变成了X轴的距离,如A点和B点在原来
的X轴的距离是1,Y轴的距离是0。A点和B点旋转后变成了Y轴距离是1,x轴的距离是0.
而且旋转前A点无论x轴和y轴和其它点的距离都是递增关系,所以A点+距离就等于其它点的坐标。
旋转后y轴和各点的关系仍然是递增关系,但X轴和各点的关系变成了递减关系,所以A点的X坐标-距离才等于其它
点的X坐标
所以:旋转后B点的y坐标=旋转后A点的y坐标+旋转前B点的x坐标(就是A点和B点原本在x轴上的距离,现在变成了y轴距离)
旋转后B点的X坐标=旋转后A点的X坐标-旋转前B点的y坐标(道理同上)
从上图我们可以看到,A点旋转后的坐标是x3y0,所以我们代入计算:
旋转后B点的y坐标=0+1=1 因为0+任何数都等于任何数,所以我们可得
旋转后B点的y坐标=旋转前B点的x坐标
旋转后B点的X坐标=3-0=3 由此可得
旋转后B点的X坐标=3-旋转前B点的Y坐标
---------------------------------------------------
碰撞区算法:就是源码里第一个创建函数里包含的功能,其实它只是一个做了标记的数组,实际上我们是看不见的!
碰撞区=整型[27][35]
整型 y
循环(y<35)//创建一块32行*21列的游戏区域和35*27大的逻辑碰撞区
整型 x
循环(x<27)
如果(x<3||x>23||y>31)//把碰撞区的左右下三个方向的最外三行标记为碰撞点
碰撞区[x][y]=1//碰撞标记为1
如果结束
x=x+1
循环结束
y=y+1
循环结束
下图是把这个逻辑碰撞区用砖块表示出来的情形:
从上面可以看出,标有“1”的地方就是不能移动过去的,而中间没有标任何内容的方砖,其实就是开始时的游戏区。为什么外面要留三行三列呢(其实留二行也够了),主要是防止像“1字型”这样方砖在靠边时旋转的话,它会有一个方块越界二行,这时如果只留一行的话,就会报数组越界。
-----------------------------------------------------
这个俄罗斯方块核心的算法大概就是这几个了,其实思路就是先创建好按钮,然后通过计算让它显示或隐藏。其它没什么
就是方砖下落和左右移动的算法我至今都想不出好的方法来。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|