之前的版本当需要消除的行是非连续时,就无法处理,本节的版本就对该BUG进行了处理。     下载地址:http://pan.baidu.com/share/link?shareid=396056&uk=940392313 ...

    之前的版本当需要消除的行是非连续时,就无法处理,本节的版本就对该BUG进行了处理。

    下载地址:http://pan.baidu.com/share/link?shareid=396056&uk=940392313 (百度共享链接地址),进入zengl俄罗斯方块共享文件夹,在该文件夹中有个version_8_tetris.rar的压缩包就是v8版本的代码包,里面有个版本8说明.txt文件,包含了该版本的相关说明:

    该版本是俄罗斯方块的第八个测试版本,该版本修复了之前版本中存在的消行算法BUG,尤其是当需要消除的行不是连续的时候,该版本就可以处理,按ESC键可以随时退出游戏,按P键可以暂停游戏。如果要玩完整版,可以查看"zengl编程语言"栏目,其中的"zengl编程语言v1.0.5 编译,执行,源码调试一体化,开发俄罗斯方块"这篇文章里有俄罗斯方块正式发布版的下载地址。

    如果是linux用户,在成功编译了zengl v1.0.5或更高版本的程序后(注意编译需要root权限,因为需要将.so动态链接库拷贝到/usr/lib中),可以将 version_8_tetris.rar里的version_8_tetris文件夹拷贝到zengl根目录中,最后运行./zenglrun version_8_tetris/tetris.zl -n 即可,如果要调试脚本,可以加个-d参数(参数的含义请参考上面提到的zengl v1.0.5的文章,或者通过-h参数来查看帮助)。

    在该版本的tetris.zl中添加了myDetectRemoveNumForMid自定义函数用来检测某行方块需要下落的格数:

/*
    该函数是用在当需要消除某行时,上方的vy行元素需要下落几格,因为需要消除的行不一定就是连续的,可能vy+1和vy-1刚好满了一行,而中间的vy没满,
    那么vy行的元素就只需下降一行。而vy-1上方的元素则需要下降两行。
*/

fun myDetectRemoveNumForMid(vy)
    global gameMainBg;
    clsGameMainBg gameMainBg;
    num = 0; //num变量表示需要下落的格数
    for(i=0;i<gameMainBg.needRemoveNum;i++)
        if(vy < gameMainBg.remove_line_array[i]) //gameMainBg类的remove_line_array数组成员中存放着所有需要消除的行索引,当vy在这些需要消除行的上方时,就将num加一。
            num++;
        endif
    endfor
    return num;
endfun

    上方棕色注释是这里额外添加的需要注意的地方,在myRemoveMainBgFixTetris函数中将会用到上面函数的返回值作为需要下降的行数:

/*
    消除所有装满小方块的行,再将其上方的元素下移。
*/

fun myRemoveMainBgFixTetris()

    ....................... //省略N行代码

    mixvy = -1;
    for(vy = GameMainHeightNum-1 ; vy >= 0 ; vy--) //循环消除所有满行的元素
        if(gameMainBg.line_count_array[vy] == GameMainWidthNum)
            end = (vy+1) * GameMainWidthNum;
            for(index = vy * GameMainWidthNum ; index < end ; index++) //将这些行里的元素占用位设为0,即消除这些元素。
                gameMainBg.fix_tetris[index].occupy = 0;
            endfor
            gameMainBg.line_count_array[vy] = 0; //将行所拥有的方块数设为0
            if(mixvy == -1) //mixvy是需要消除的最低下的行
                topvy = mixvy = vy;
            else
                topvy = vy; //topvy是需要消除的最上端的行
            endif
        endif
    endfor

    ....................... //省略N行代码

    if(vy < topvy) //如果是在topvy的上方,则消除了多少行,就下降多少行
        needRemoveNum = gameMainBg.needRemoveNum;
    elif(vy < mixvy) //如果是在消除行的中间,则通过myDetectRemoveNumForMid函数决定要下降多少格。
        needRemoveNum = myDetectRemoveNumForMid(vy);
    else
        continue; //如果是消除行的下方的元素则保持不变
    endif

    ....................... //省略N行代码

endfun

    例如上面这种情况(上图只是个示例),20行和18行已经满行了需要消除,那么,中间的第19行就只需下降一行,而18行以上的方块则需要下降两行。如果是以前的版本,那么19行就不会发生下降,从而会空出一行。

    至于脚本中的其他代码都在重要的部分加了注释,可以结合注释和调试器进行分析。

   
OK,下节介绍v9的版本,休息,休息一下 O(∩_∩)O~

上下篇

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

上一篇: zengl俄罗斯方块v7 添加暂停功能

相关文章

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

zengl俄罗斯方块v2 初始化七种形状

zengl俄罗斯方块v5 简单消行法

zengl俄罗斯方块v1 入门篇

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

zengl俄罗斯方块v7 添加暂停功能