上个版本只是将方块简单的堆砌起来,并没有将满一行的方块进行消除,本节介绍的v5版本就采用一种比较简单的方法来消行,不过这种方法是有BUG的,只能应付一般的情况,在后面的版本中将采用传统...
上个版本只是将方块简单的堆砌起来,并没有将满一行的方块进行消除,本节介绍的v5版本就采用一种比较简单的方法来消行,不过这种方法是有BUG的,只能应付一般的情况,在后面的版本中将采用传统的方法来代替。
下载地址:http://pan.baidu.com/share/link?shareid=396056&uk=940392313 (百度共享链接地址),进入zengl俄罗斯方块共享文件夹,在该文件夹中有个version_5_tetris.rar的压缩包就是v5版本的代码包,里面有个版本5说明.txt文件,包含了该版本的相关说明:
该版本是俄罗斯方块的第五个测试版本,该版本增加了简单消行的功能,在上一个版本的基础上,采用一种简单的方法来达到消除满行的方块,就是如果只消除一 行,则将每列最顶部的方块去除,如果消除两行,则将每列最顶部的两个方块去除。以此类推,但是这种方法是有BUG的,只能应付一般的情况,也不符合传统的 游戏规则,不过这里为了简单起见,先用这种方法,到后面的版本中再采用传统的消行方法,可以按ESC键退出。如果要玩完整版,可以查看"zengl编程语言"栏目,其中的"zengl编程语言v1.0.5 编译,执行,源码调试一体化,开发俄罗斯方块"这篇文章里有俄罗斯方块正式发布版的下载地址。
如果是linux用户,在成功编译了zengl v1.0.5或更高版本的程序后(注意编译需要root权限,因为需要将.so动态链接库拷贝到/usr/lib中),可以将 version_5_tetris.rar里的version_5_tetris文件夹拷贝到zengl根目录中,最后运行./zenglrun version_5_tetris/tetris.zl -n 即可,如果要调试脚本,可以加个-d参数(参数的含义请参考上面提到的zengl v1.0.5的文章,或者通过-h参数来查看帮助)。
该版本的tetris.zl脚本中添加了myRemoveMainBgFixTetris自定义的消行函数:
/*
采用一种简单的方法来达到消除满行的元素,就是如果只消除一行,则将每列最顶部的元素去除,如果消除两行,则将每列最顶部的两个元素去除。
以此类推,但是这种方法是有BUG的,只能应付一般的情况,也不符合传统的游戏规则,不过这里为了简单起见,先用这种方法,到后面的版本中
再采用传统的方法。
*/
fun myRemoveMainBgFixTetris()
global gameMainBg;
clsGameMainBg gameMainBg;
for(i=0;i<GameMainWidthNum;i++) //从第一列到最后一列进行循环
for(index = i,needRemoveNum = gameMainBg.needRemoveNum;
index < gameMainBg.count && needRemoveNum > 0; index+=GameMainWidthNum) //循环从每列顶部开始扫描,根据需要消去的行数,将顶部需要去除的元素去除。
if(gameMainBg.fix_tetris[index].occupy)
gameMainBg.fix_tetris[index].occupy = 0; //如果顶部有处于占用状态的元素,则将其占用状态设为0,表示消除该元素
vy = bltConvToInt(index / GameMainWidthNum); //由索引值得到虚拟纵坐标
gameMainBg.line_count_array[vy]--; //将该行的方块总数减一
needRemoveNum--; //将该列需要消除的数量也减一
endif
endfor
endfor
gameMainBg.needRemoveNum = 0; //所有列处理完毕后,将需要消除的行数重置为0
endfun
在tetris_def.zl脚本中对clsGameMainBg类也做了扩展:
class clsGameMainBg
clsPosition pos; //游戏主区域的主屏幕的坐标,宽高信息
clsColor bgcolor; //游戏主区域的背景颜色
clsFixTetris fix_tetris; //存放游戏主区域固定方块信息的数组
count; //游戏主区域的总方格数
line_count_array; //游戏主区域中每行包含的方块个数
needRemoveNum; //游戏主区域中需要消除的行数
endcls
在该类中添加了line_count_array数组成员,数组中的每个元素的值代表一行所拥有的固定方块个数,line_count_array[0]对应是第一行即主游戏区域最顶部的行,line_count_array[1]对应第二行,以此类推。
该类的needRemoveNum成员用于记录需要消除的行数,当游戏区域的某一行里装满了固定方块时,就将needRemoveNum成员值加一,最后 在上面提到的myRemoveMainBgFixTetris函数中根据needRemoveNum值来消除顶部的方块。
至于脚本中的其他代码都在重要的部分加了注释,可以结合注释和调试器进行分析。
OK,下节介绍v6的版本,休息,休息一下 O(∩_∩)O~