可使用的简易版俄罗斯方块
待优化的简易版俄罗斯方块
控制对象变化
在前一篇“失败的俄罗斯方块”文章中是使用数组来存储当前的方块的点位的,现在换成对象来存储当前方块的所有点位。
1、对象控制与数组控制的区别
- 使用数组cell存储当前方块点位时,由于数组中所有元素还是数组对象
[[1,1],[1,2],[1,3],[1,4]] ;
当 cell 的坐标发生改变的时候就会污染模板中的值。所以当下一次再随机到该对象时就会得到错误的信息;
- 应对方法
使用对象来存储当前俄罗斯方块中的所有点位。由于前面已经完成了大量的判断等操作,若是改写所有的判断赋值、判断等操作过于繁琐,于是将新的对象 cell 的属性按照数组的操作习惯来改写。
// cellCtrl 中的方法,生成新的方块
var cell={};
F.random=function(){
var index=Math.floor(Math.random()*6+1);
for(var i=0,len=cells[(index-1)].length;i<len;i++){
cell[i]=[];
cell[i][0]=cells[(index-1)][i][0];
cell[i][1]=cells[(index-1)][i][1];
}
cell.length=cells[(index-1)].length;
cell=mapCtrl.receiveCell(cell);
if(!cell||cell==[]){
alert('游戏结束');
}
mapCtrl.renderMap();
}
- 改写完就可以运行了
2、总结
- bug 目前没有发现,不过依然有瑕疵。
该游戏输了一次后需刷新以重新开始,并没有添加开新游戏的功能。也没有添加查看游戏历史成绩的功能,也没有添加存储游戏进度的功能 - 最大的瑕疵在于方块的翻转,由于使用数学公式计算方块的中心点,俄罗斯方块顺时针90度翻转后的坐标往往带小数点,小数数值不论是向上取整还是向下取整亦或是四舍五入,俄罗斯方块的翻转总会发生偏移。目前的解决方法是以模板中第二个点为中心旋转(方块都能转动。。。)。目前有两个思路,a) 每一个方块模板备4种型态,每次方块都取一种形态进行坐标计算。b) 计算时进行选择计算即 if-else。
- 目前可以预见需要解决问题应该都可以优化解决,所以就不去深究了。
- 感受:此次单独做此页面感觉还是挺有意思的,有许多自己本应提早警觉到的问题却在报错后才发现,因此也花费了大量的时间。