javascript版2048小游戏
没有技术含量,只是用来练习代码逻辑的。为了代码结构清晰,我把逻辑控制部分写在全局变量里,用户界面操作封装在UI对象里,大概就这样了。仅供参考。工作时候,我的编码风格有人吐槽太乱了,所以我想试着写一个不是那么乱的东西出来。。
<HTML>
<head>
<title>2048DEMO</title>
<metacharset='utf-8'/>
<!--
708616javascriptpresent
http://treemonster.sinaapp.com
1696292264@qq.com
-->
<head>
<divid='box'>
MSIEisSB
<script>
//全局方法用于逻辑控制
functionx4(n){
vart=[];
while(n-->0)t.push([]);
returnt;
}
functionxx(f){
for(vari=0;i<UI.nw;i++){
for(varj=0;j<UI.nw;j++){
f(i,j);
}
}
}
functionmake(n){
return{
number:n,
moveStep:0,
newNumber:n,
needKill:0
};
}
functiontran(_arr,md){
varundo=x4(UI.nw);
varout=x4(UI.nw);
varud=UI.undo;
if(ud.push(undo)>32)ud.shift();
for(vari=0;i<UI.nw;i++){
vart=[],o=md%2^1;
for(vark=0;k<UI.nw;k++){
undo[i][k]=_arr[i][k].number;
if(md<3)t.push(_arr[i][k]);elset.push(_arr[k][i]);
}
o&&t.reverse();
t=trans(t);
if(o)t[0].reverse(),t[1].reverse();
for(varj=0;j<UI.nw;j++){
varx=i,y=j;
if(md>2)x=j,y=i;
_arr[x][y]=t[0][j];
out[x][y]=t[1][j];
}
}
return[_arr,out];
}
functiontrans(arr){
for(vari=0,m=0;i<UI.nw;i++){
if(arr[i].number===0)m++;elsearr[i].moveStep+=m;
var_i=arr[i];
for(varj=i-1;j>=0;j--){
if(!arr[j].number)continue;
if(arr[j].needKill)break;
if(arr[j].number==_i.number){
arr[j].needKill=1;
arr[i].newNumber*=2;
arr[i].moveStep++;
m++;
}
}
}
varout=[];
for(vari=UI.nw;i--;){
!arr[i].needKill&&arr[i].number&&out.unshift(arr[i].newNumber);
}
while(out.length<UI.nw)out.push(0);
return[arr,out];
}
//界面操作开始,界面操作的参数通过全局方法来获得
function$(a){returndocument.getElementById(a);}
UI={};
UI.update=function(d){
if(UI.locked)return;
varmap=this.map;
varn=this.times;
UI.locked=1;//未完成动画之前阻止用户动作
varout=tran(map,d)[1];
var_n=0,_begin=x4(UI.nw);
(function(){
if(_n>n){
var_q=0;
xx(function(i,j){
_q=_q||this.map[i][j].moveStep;
varo=$('i'+i+'j'+j);
o.innerHTML=out[i][j]||'';
o.className='xr'+o.innerText;
this.map[i][j]=make(out[i][j]);
o=o.style;
o.display='block';
o.left=UI.size*j+"px";
o.top=UI.size*i+"px";
});
return_q?UI.addNew():(UI.locked=0);
}
xx(function(i,j){
varo=$('i'+i+'j'+j),t,o1=o.style,s=d<3?'left':'top';
if(t=map[i][j][_n==n?'newNumber':'number'])o.innerHTML=t;elseo1.display='none';
if(_begin[i][j]===undefined)_begin[i][j]=parseInt(o1[s]);
o1[s]=(_begin[i][j]+(map[i][j].moveStep*100/n*_n)*Math.pow(-1,d))+'px';
});
_n++;
setTimeout(arguments.callee,10);
})();
}
UI.undo=[];
UI.addNew=function(_q){
UI.locked=1;
varr=[];
xx(function(i,j){
this.map[i][j].number||r.push([i,j]);
});
if(!r.length)returnUI.locked=0;
varq=newDate%r.length;q=r[q];
varb=$('i'+q[0]+'j'+q[1]);
varm=this.map[q[0]][q[1]];
b.innerHTML=m.number=m.newNumber=2<<newDate%2;
b.className='xr'+b.innerText;
varo=0,q=5;
(function(){
if(o<100)setTimeout(arguments.callee,10);
b.style.opacity=Math.min(o+=q++,100)/100;
})();
UI.locked=0;//解除锁定
};
//创建
UI.init=function(nw,maxUndo,size,times){
UI.times=times||8;//动画过度次数
UI.nw=nw||5;//方阵边长
UI.map=map=x4(UI.nw);//创建数字块对象
UI.size=size||100;//单元格宽度
UI.maxUndo=maxUndo||5;//最大撤销步数
$('box').innerHTML='';
xx(function(i,j){
map[i][j]=make(0);
document.write("<divclass='x'id='i"+i+"j"+j+"'\
style='left:"+(UI.size*j)+"px;top:"+(UI.size*i)+"px;'></div>\
<divclass='y'\
style='left:"+(UI.size*j)+"px;top:"+(UI.size*i)+"px;'></div>");
});
UI.addNew();
UI.addNew();
};
UI.init(6,3,100,20);
//自动播放,仅用来做演示的。没有做事件绑定
setInterval(function(){UI.update([1,2,3,4][Math.random()*4|0]);},200);
</script>
</div>
<style>
#box{position:absolute;left:50%;top:50%;margin-left:-300px;margin-top:-300px;}
.x,.y{background:#ddd;position:absolute;width:80px;height:80px;font-size:30px;text-align:center;line-height:80px;font-weight:700;font-family:arial;z-index:1;}
.x{z-index:30;}
.r2{background:#eee4da;}
.r4{background:#ede0c8;}
.r8{color:#f9f6f2;background:#f2b179;}
.r16{color:#f9f6f2;
background:#f59563;}
.r32{color:#f9f6f2;
background:#f67c5f;}
.r64{color:#f9f6f2;
background:#f65e3b;}
.r128{ color:#f9f6f2;
background:#edcf72;}
.r256{ color:#f9f6f2;
background:#edcc61;}
.r512{ color:#f9f6f2;
background:#edc850;}
.r1024{color:#f9f6f2;
background:#edc53f;}
.r2048{ color:#f9f6f2;
background:#edc22e;}
</style>
以上就是本文所述的全部内容了,希望大家能够喜欢。