之前的版本当需要消除的行是非连续时,就无法处理,本节的版本就对该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~