TC官方合作论坛

 找回密码
 立即注册
查看: 10853|回复: 79

[TC5.0源码] 俄罗斯方块3.039版源码及核心算法详解。

  [复制链接]
发表于 2012-9-12 13:35:07 | 显示全部楼层 |阅读模式
源码请务必用3.039版TC打开,其它版本极有可能出错。项目资源里有算法说明,看不明白全部代码没关系,只要看懂部分对自己有所启发就行了。我也是看了前人的源码,才做出来的,但也只看懂了10%~20%不到。源码回复可免费下载!
游客,如果您要查看本帖隐藏内容请回复

因为是直接用TC按钮做的方砖,所以在不同的电脑主题里方砖的样子是不同的。
Ps:因为3.039版TC还没有 控件.销毁()这个api,所以这个3.039版的俄罗斯方块没有在预览区创建方块的功能(其实是也能现实的,方法要变一变,我懒得再做了!)。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

 楼主| 发表于 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
回复 支持 反对

使用道具 举报

发表于 2012-9-12 13:50:53 | 显示全部楼层
00000000000000000000000000000000000000000
回复 支持 反对

使用道具 举报

发表于 2012-9-12 13:57:12 | 显示全部楼层
gfdgdfgdfgdf
回复 支持 反对

使用道具 举报

发表于 2012-9-12 14:17:19 | 显示全部楼层
求阅
回复 支持 反对

使用道具 举报

发表于 2012-9-12 16:08:00 | 显示全部楼层
看下
回复 支持 反对

使用道具 举报

发表于 2012-9-12 16:38:05 | 显示全部楼层
看看一样不
回复 支持 反对

使用道具 举报

发表于 2012-9-12 18:00:25 | 显示全部楼层
学习
回复 支持 反对

使用道具 举报

发表于 2012-9-12 18:19:55 | 显示全部楼层
回复 1楼kkkkkkk的帖子

万恶的回复啊
回复 支持 反对

使用道具 举报

发表于 2012-9-12 18:36:10 | 显示全部楼层
看看!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-19 23:36 , Processed in 0.046653 second(s), 23 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表