上个版本只是将方块简单的堆砌起来,并没有将满一行的方块进行消除,本节介绍的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~

上下篇

下一篇: zengl俄罗斯方块v6 传统消行法

上一篇: zengl俄罗斯方块v4 堆砌碰撞过的方块

相关文章

zengl俄罗斯方块v8 修复消行BUG

zengl俄罗斯方块v9 添加下一次出现方块的预览功能

zengl俄罗斯方块v6 传统消行法

zengl俄罗斯方块v10 连续按键,顶部非可见区域

zengl俄罗斯方块v11 使用zengl v1.0.6新语法

zengl俄罗斯方块v4 堆砌碰撞过的方块