基于jQuery的俄罗斯方块
代码是其次,可能有很多不足,而且有一个功能没有实现,那就是方块的变形,没有想到一个很完美的解决方案。下面说一下我的思路,因为当时做的时候,并没有看其他人
的思路,故而不知道自己是否走了弯路,先制作四个基础小方块model,所有的积木都是由这四个方块组合而成。感觉问题的难点就在于判定运动终止,这里我设定了一条基线,
最开始基线的值就是为整个框架的高度,当model的top值等于整个高度时,运动停止,而判定左右运动的条件同理,当运动落至底部的时候,更新基线,即将四个model的坐标,插入基线之中,不过这里考虑了消除功能,故而插入的时候,根据top值不同,插入一个以top值为属性名的对象之中。其逻辑关系整体如下,当方块每一次移动,都预先判断,下一个坐标是否在基线之中,如果是,则停止运动,并且将该坐标插入基线之中,达到更新基线的目的,反之则继续运动。而当方块运动停止后,需要判断保存基线的对象的每一个属性值是否构筑城完整的数字链,即同一行中,每一列都有方块存在,如果存在即进行消去操作,消去之后,需要进行更新基线操作。
领悟,感觉JS真的是单线程的语言,很明显的是,当我向两侧运动,并且碰触到框架两侧,一直按着向右或者向左的方向键时,方块根本不能会下坠,会一直执行向两侧运动的程序,不知道是不是我的方案有错。。
下面贴代码,仅提供思路。。
define(function(require,exports,module){
require("jquery");
var fly={
time:null, //定时器
state:1, //控制状态,判定能否继续运动
moving:0, //是否处于运动过程中
movingxy:[], //运动坐标
mode:[], //四个运动模块
stopAxis:{
}, //基线坐标
xyz:{
1:[[60,0],[80,0],[100,0],[120,0]],
2:[[100,0],[100,20],[100,40],[100,60]],
3:[[80,0],[100,0],[80,20],[100,20]], //田 |
4:[[100,0],[80,20],[100,20],[120,20]], //土
5:[[120,0],[80,20],[100,20],[120,20]],
6:[[80,0],[80,20],[100,20],[100,40]],
7:[[100,0],[80,20],[100,20],[80,40]]
},
creat:function(x){
var md="<a class=‘mode‘></a>";
this.mode[0]=($(md).css({"left":x[0][0]+"px","top":x[0][1]+"px"}));
this.mode[1]=($(md).css({"left":x[1][0]+"px","top":x[1][1]+"px"}));
this.mode[2]=($(md).css({"left":x[2][0]+"px","top":x[2][1]+"px"}));
this.mode[3]=($(md).css({"left":x[3][0]+"px","top":x[3][1]+"px"}));
},
start:function(x,y,wh){
this.movingxy[0]=([this.mode[0].css("left").replace("px",""),this.mode[0].css("top").replace("px","")])
this.movingxy[1]=([this.mode[1].css("left").replace("px",""),this.mode[1].css("top").replace("px","")])
this.movingxy[2]=([this.mode[2].css("left").replace("px",""),this.mode[2].css("top").replace("px","")])
this.movingxy[3]=([this.mode[3].css("left").replace("px",""),this.mode[3].css("top").replace("px","")])
for(var i=0;i<4;i++){
fly.ifmove(fly.movingxy[i],x,y)
if(this.state==0){
break;
}
}
//console.log(fly.state)
if (fly.state == 1) {
$(".mode").css({
"left": "+=" + x,
"top": "+=" + y
});
}
else {
clearInterval(fly.time);
fly.state = 1;
if (wh == false) {
$(".mode").attr("class", "mode_stop"); //移除MODE,变化为普通方块
fly.insert(fly.movingxy);
if(fly.delet()){
alert("GAME OVER");
return false;
}
this.moving=0;
if(this.moving==0){
fly.creat(fly.xyz[Math.floor(Math.random()*7+1)]);
$("#fy").append(fly.mode[0],fly.mode[1],fly.mode[2],fly.mode[3]);
fly.time=setInterval(function(){
fly.start(0,20,false)
},700)
fly.moving=1;
}
}else{
fly.time=setInterval(function(){
fly.start(0,20,false)
},700)
fly.moving=1;
}
}
},
control:function(){
$(document).bind("keydown",function(event){
switch(event.keyCode){
case 37:
fly.start(-20,0,true);break;
case 39:
fly.start(20,0,true);break;
case 40:
fly.start(0,20,false);break;
case 17:
}
})
},
ifmove:function(axis,x,y){
rexy=[parseInt(axis[0])+x,parseInt(axis[1])+y];
if(rexy[0]==-20||rexy[0]==200||rexy[1]==300){
fly.state=0;
return false;
}
if(fly.stopAxis.hasOwnProperty(rexy[1])){
for(var n=0;n<fly.stopAxis[rexy[1]].length;n++){
if(rexy.join("")==fly.stopAxis[rexy[1]][n].join("")){
fly.state=0;
return false;
}
}
}
return false;
/* for(var i in fly.stopAxis){
if(rexy.join("")==fly.stopAxis[i].join("")){
fly.state=0;
return false;
}
}*/
},
insert:function(array){ //插入基线
for(var i=0;i<4;i++){
//console.log(array[i][0]+"||"+array[i][1])
if(!fly.stopAxis.hasOwnProperty(array[i][1])){
fly.stopAxis[array[i][1]]=new Array();
}
fly.stopAxis[array[i][1]].push(array[i]);
fly.mode[i].attr("topName",fly.movingxy[i][1]);
//console.log(fly.stopAxis)
}
},
delet: function(){ //消去模块
var kzy = {};
for (var i in fly.stopAxis) {
if(i==0){
return true;
}
if (fly.stopAxis[i].length == 10) {
fly.stopAxis[i] = [];
$(".mode_stop[topName=" + i + "]").remove(); //消除基线
var score=parseInt($("#oo").text())+10;
$("#oo").text(score);
for (var x in fly.stopAxis) { //整体下降
if (x < i) {
$(".mode_stop[topName=" + x + "]").css("top", "+=20");
for (var k = 0; k < fly.stopAxis[x].length; k++) {
fly.stopAxis[x][k][1] = parseInt(fly.stopAxis[x][k][1]) + 20;
}
//console.log(x)
kzy[parseInt(x) + 20] = fly.stopAxis[x];
fly.stopAxis[x]=[];
}
}
}
}
for(var m in fly.stopAxis){ //重构基线
if(kzy.hasOwnProperty(m)){
fly.stopAxis[m]=kzy[m];
}
}
},
};
$(function(){
$("#start").bind("click",function(){
if(fly.moving==0){
this.mode=[];
fly.creat(fly.xyz[Math.floor(Math.random()*7+1)]);
clearInterval(fly.time);
$("#fy").append(fly.mode[0],fly.mode[1],fly.mode[2],fly.mode[3]);
fly.time=setInterval(function(){
fly.start(0,+20,false);
},700);
fly.moving=1;
}
})
fly.control()
$("#stop").bind("click",function(){
clearInterval(fly.time);
})
})
})
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。