两个晚上做了一个2048,还不是很完善,核心功能做出来了,代码写的不是很简洁
期间遇到一个问题,关于jquery的animate阻塞的问题,比如
$("#div").animate({top:'-=70px'});
$("#div").css({"opacity":"0"});
这样写的话慢慢上移的效果压根就不出现,但是在for循环里面又不会能用animate的回调函数,所以最后animate没有加进来,后果就是没有移动的效果,代码里面没有注释(so sorry),改天加上可怜
上代码
<!DOCTYPE html>
<html>
<head>
<title>GF.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="css/style.css" type="text/css" />
<script type="text/javascript" src="css/jquery-1.5.2.min.js"></script>
</head>
<script>
$(document).ready(function() {
var sum=0;
//初始化一个二维数组
var qp=new Array();
for(var i=0;i<4;i++){
qp[i]=new Array();
for(var j=0;j<4;j++){
qp[i][j]=0;
}
}
//随机生成一个方块
function sandFK(){
if(sum==16)
{
alert("Game over!!");
return;
}
var rand=Math.floor(Math.random()*16)+1; //生成0-15的随机数
var randCp=rand;
var i=0,j=0;
for(;i<4;i++){ //遍历二维数组,决定在哪个点出方格
if(rand==0)
break;
for(j=0;j<4;j++){
if(qp[i][j]==0)
rand--;
if(i==3&&j==3&&rand!=0)
i=-1;
if(rand==0)
break;
}
}
qp[i-1][j]=1; //将这个点设为有方格
sum++;
var name="GF0"+((i-1)*4+j+1); //找到这个div的id
var left=110*j+28+"px";
var top=110*(i-1)+28+"px";
$("#"+name).css({
"top":top,
"left":left
});
if(randCp>10) //如果rand大于10则出现4
$("#"+name).html("4");
else //否则出现2
$("#"+name).html("2");
$("#"+name).animate({opacity:'1'},100); //出现
}
sandFK();
sandFK();
function btnClick(obj){ //这个是按上下左右的的时候出现的效果,直接略过
$(obj).animate({
top:'-=3px',
left:'-=3px',
height:'+=6px',
width:'+=6px'},50,function(){
$(obj).animate({
top:'+=3px',
left:'+=3px',
height:'-=6px',
width:'-=6px'},50);
});
}
$("#up").stop().click(function(){ //核心代码
btnClick(this);
//上移,去空格,div复位
var isChange=0;
var markX=0,isBlack=0;
for(var y=0;y<4;y++){ //这个for是在上移过程中去掉所有上移过程中的方格之间的空格
for(var x=0;x<4;x++){
if(qp[x][y]==0&&isBlack==0){
isBlack=1;
markX=x;
}
else if(qp[x][y]!=0&&isBlack==1){
for(var upX=x;upX<4;upX++){
if(qp[upX][y]!=0){
var name1="GF0"+(upX*4+y+1);
var nameReal="GF0"+((markX+upX-x)*4+y+1);
var left=110*y+28+"px";
var top=110*(markX+upX-x)+28+"px";
$("#"+nameReal).css({"top":top,"left":left});
$("#"+nameReal).css({"opacity":"1"});
$("#"+nameReal).html($("#"+name1).html());
qp[upX][y]=0;
qp[markX+upX-x][y]=1;
$("#"+name1).css({"opacity":"0"});
$("#"+name1).html("");
isChange=1;
}
}
isBlack=0;
}
}
markX=0;
isBlack=0;
}
for(var y=0;y<4;y++){ //这个for是用来判断相邻的两个方格是不是相等的,是相等就合并
for(var x=0;x<3;x++){
if(qp[x][y]==0)
break;
var name="GF0"+(x*4+y+1);
var name2="GF0"+((x+1)*4+y+1);
if($("#"+name).html()==$("#"+name2).html()){
$("#"+name).html(parseInt($("#"+name).html())*2);
$("#"+name2).css({"opacity":"0"});
isChange=1;
$("#"+name2).html("");
qp[x+1][y]=0;
sum--;
for(var upX=x+2;upX<4;upX++){
if(qp[upX][y]!=0){
var name1="GF0"+(upX*4+y+1);
var nameReal="GF0"+((upX-1)*4+y+1);
var left=110*y+28+"px";
var top=110*(upX-1)+28+"px";
$("#"+nameReal).css({"top":top,"left":left});
$("#"+nameReal).css({"opacity":"1"});
$("#"+nameReal).html($("#"+name1).html());
qp[upX][y]=0;
qp[upX-1][y]=1;
$("#"+name1).css({"opacity":"0"});
$("#"+name1).html("");
}
else
break;
}
}
}
}
if(isChange==1)
sandFK();
});
$("#down").click(function(){
btnClick(this);
var isChange=0;
var markX=0,isBlack=0;
for(var y=0;y<4;y++){
for(var x=3;x>=0;x--){
if(qp[x][y]==0&&isBlack==0){
isBlack=1;
markX=x;
}
else if(qp[x][y]!=0&&isBlack==1){
for(var upX=x;upX>=0;upX--){
if(qp[upX][y]!=0){
var name1="GF0"+(upX*4+y+1);
var nameReal="GF0"+((markX+upX-x)*4+y+1);
var left=110*y+28+"px";
var top=110*(markX+upX-x)+28+"px";
$("#"+nameReal).css({"top":top,"left":left});
$("#"+nameReal).css({"opacity":"1"});
$("#"+nameReal).html($("#"+name1).html());
qp[upX][y]=0;
qp[markX+upX-x][y]=1;
$("#"+name1).css({"opacity":"0"});
$("#"+name1).html("");
isChange=1;
}
}
isBlack=0;
}
}
markX=0;
isBlack=0;
}
/*******************************************************************/
for(var y=0;y<4;y++){
for(var x=3;x>0;x--){
if(qp[x][y]==0)
break;
var name="GF0"+(x*4+y+1);
var name2="GF0"+((x-1)*4+y+1);
if($("#"+name).html()==$("#"+name2).html()){
$("#"+name).html(parseInt($("#"+name).html())*2);
$("#"+name2).css({"opacity":"0"});
$("#"+name2).html("");
isChange=1;
qp[x-1][y]=0;
sum--;
for(var upX=x-2;upX>=0;upX--){
if(qp[upX][y]!=0){
var name1="GF0"+(upX*4+y+1);
var nameReal="GF0"+((upX+1)*4+y+1);
var left=110*y+28+"px";
var top=110*(upX+1)+28+"px";
$("#"+nameReal).css({"top":top,"left":left});
$("#"+nameReal).css({"opacity":"1"});
$("#"+nameReal).html($("#"+name1).html());
qp[upX][y]=0;
qp[upX+1][y]=1;
$("#"+name1).css({"opacity":"0"});
$("#"+name1).html("");
}
else
break;
}
}
}
}
if(isChange==1)
sandFK();
});
$("#left").click(function(){
btnClick(this);
var isChange=0;
var markY=0,isBlack=0;
for(var x=0;x<4;x++){
for(var y=0;y<4;y++){
if(qp[x][y]==0&&isBlack==0){
isBlack=1;
markY=y;
}
else if(qp[x][y]!=0&&isBlack==1){
for(var upY=y;upY<4;upY++){
if(qp[x][upY]!=0){
var name1="GF0"+(x*4+upY+1);
var nameReal="GF0"+(x*4+(markY+upY-y)+1);
var left=110*(markY+upY-y)+28+"px";
var top=110*x+28+"px";
$("#"+nameReal).css({"top":top,"left":left});
$("#"+nameReal).css({"opacity":"1"});
$("#"+nameReal).html($("#"+name1).html());
qp[x][upY]=0;
qp[x][markY+upY-y]=1;
$("#"+name1).css({"opacity":"0"});
$("#"+name1).html("");
isChange=1;
}
}
isBlack=0;
}
}
markY=0;
isBlack=0;
}
/*******************************************************************/
for(var x=0;x<4;x++){
for(var y=0;y<3;y++){
if(qp[x][y]==0)
break;
var name="GF0"+(x*4+y+1);
var name2="GF0"+(x*4+y+1+1);
if($("#"+name).html()==$("#"+name2).html()){
$("#"+name).html(parseInt($("#"+name).html())*2);
$("#"+name2).css({"opacity":"0"});
$("#"+name2).html("");
isChange=1;
qp[x][y+1]=0;
sum--;
for(var upY=y+2;upY<4;upY++){
if(qp[x][upY]!=0){
var name1="GF0"+(x*4+upY+1);
var nameReal="GF0"+(x*4+upY-1+1);
var left=110*(upY-1)+28+"px";
var top=110*x+28+"px";
$("#"+nameReal).css({"top":top,"left":left});
$("#"+nameReal).css({"opacity":"1"});
$("#"+nameReal).html($("#"+name1).html());
qp[x][upY]=0;
qp[x][upY-1]=1;
$("#"+name1).css({"opacity":"0"});
$("#"+name1).html("");
}
else
break;
}
}
}
}
if(isChange==1)
sandFK();
});
$("#right").click(function(){
btnClick(this);
var isChange=0;
var markY=0,isBlack=0;
for(var x=0;x<4;x++){
for(var y=3;y>=0;y--){
if(qp[x][y]==0&&isBlack==0){
isBlack=1;
markY=y;
}
else if(qp[x][y]!=0&&isBlack==1){
for(var upY=y;upY>=0;upY--){
if(qp[x][upY]!=0){
var name1="GF0"+(x*4+upY+1);
var nameReal="GF0"+(x*4+(markY+upY-y)+1);
var left=110*(markY+upY-y)+28+"px";
var top=110*x+28+"px";
$("#"+nameReal).css({"top":top,"left":left});
$("#"+nameReal).css({"opacity":"1"});
$("#"+nameReal).html($("#"+name1).html());
qp[x][upY]=0;
qp[x][markY+upY-y]=1;
$("#"+name1).css({"opacity":"0"});
$("#"+name1).html("");
isChange=1;
}
}
isBlack=0;
}
}
markY=0;
isBlack=0;
}
/*******************************************************************/
for(var x=0;x<4;x++){
for(var y=3;y>0;y--){
if(qp[x][y]==0)
break;
var name="GF0"+(x*4+y+1);
var name2="GF0"+(x*4+y-1+1);
if($("#"+name).html()==$("#"+name2).html()){
$("#"+name).html(parseInt($("#"+name).html())*2);
$("#"+name2).css({"opacity":"0"});
$("#"+name2).html("");
isChange=1;
qp[x][y-1]=0;
sum--;
for(var upY=y-2;upY>=0;upY--){
if(qp[x][upY]!=0){
var name1="GF0"+(x*4+upY+1);
var nameReal="GF0"+(x*4+upY+1+1);
var left=110*(upY+1)+28+"px";
var top=110*x+28+"px";
$("#"+nameReal).css({"top":top,"left":left});
$("#"+nameReal).css({"opacity":"1"});
$("#"+nameReal).html($("#"+name1).html());
qp[x][upY]=0;
qp[x][upY+1]=1;
$("#"+name1).css({"opacity":"0"});
$("#"+name1).html("");
}
else
break;
}
}
}
}
if(isChange==1)
sandFK();
});
});
</script>
<body>
<div id="QP2048">
<div id="GF01" class="GFILU" style="opacity:0;"></div>
<div id="GF02" class="GFILU" style="opacity:0;"></div>
<div id="GF03" class="GFILU" style="opacity:0;"></div>
<div id="GF04" class="GFILU" style="opacity:0;"></div>
<div id="GF05" class="GFILU" style="opacity:0;"></div>
<div id="GF06" class="GFILU" style="opacity:0;"></div>
<div id="GF07" class="GFILU" style="opacity:0;"></div>
<div id="GF08" class="GFILU" style="opacity:0;"></div>
<div id="GF09" class="GFILU" style="opacity:0;"></div>
<div id="GF010" class="GFILU" style="opacity:0;"></div>
<div id="GF011" class="GFILU" style="opacity:0;"></div>
<div id="GF012" class="GFILU" style="opacity:0;"></div>
<div id="GF013" class="GFILU" style="opacity:0;"></div>
<div id="GF014" class="GFILU" style="opacity:0;"></div>
<div id="GF015" class="GFILU" style="opacity:0;"></div>
<div id="GF016" class="GFILU" style="opacity:0;"></div>
</div>
<div id="up" class="GF_FX">上</div>
<div id="down" class="GF_FX">下</div>
<div id="left" class="GF_FX">左</div>
<div id="right" class="GF_FX">右</div>
</body>
</html>
其实上下左右的代码是一样的,大家能给点意见吗,感激不尽
能够的运行的代码在这个这个地方下载