本人介绍:一杯热茶,网站前端, 18岁。
创作思路:思路上基本上是模仿案例,按视频里来的
和原版相比的优势:原版点击重新按钮后游戏的数据并没有立即清零,只有当再次累加数据后才会清零,我把重新开始的按钮添加了一个立即清零。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width,height=device-height,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/> <title>2048</title> <link href="style.css" type="text/css" rel="stylesheet" /> <script src="http://libs.baidu.com/jquery/1.9.0/jquery.min.js" type="text/javascript"></script> <script src="Support.js"></script> <script src="animation.js" type="text/javascript"></script> <script src="main.js" type="text/javascript"></script> </head> <body> <header> <h1>私人 2048</h1> <a href="javascript:newgame();" id="bot">New Game</a> <p>score:<span id="score">0</span></p> </header> <div id="main"> <div class="main-box" id="box-0-0"></div> <div class="main-box" id="box-0-1"></div> <div class="main-box" id="box-0-2"></div> <div class="main-box" id="box-0-3"></div> <div class="main-box" id="box-1-0"></div> <div class="main-box" id="box-1-1"></div> <div class="main-box" id="box-1-2"></div> <div class="main-box" id="box-1-3"></div> <div class="main-box" id="box-2-0"></div> <div class="main-box" id="box-2-1"></div> <div class="main-box" id="box-2-2"></div> <div class="main-box" id="box-2-3"></div> <div class="main-box" id="box-3-0"></div> <div class="main-box" id="box-3-1"></div> <div class="main-box" id="box-3-2"></div> <div class="main-box" id="box-3-3"></div> </div> <!-- <div class="over"> <div class="over-frame">GAMEMOVE!</div> </div>--> </body> </html>
*{ padding:0; margin:0;} header{ display:block; width:100%; margin:0 auto; text-align:center;} header h1{ font-family:Arial; font-size:40px; font-weight:bold;} header #bot{ display:block; margin:20px auto; width:100px; padding:10px; background:#8f7a66; font-family:Arial; color:#fff; border-radius:10px; text-decoration:none;} header #bot:hover{ background:#9f8b77;} header p{ font-family:Arial; font-size:25px; margin:25px auto;} #main{ width:460px;height:460px;padding:20px; margin:50px auto; background:#bbada0; border-radius:10px; position:relative;} .main-box{ width:100px; height:100px; border-radius:6px; background:#ccc0b3; position:absolute;} .number-cell{ border-radius:6px; font-family:Arial; font-weight:bold; font-size:30px; line-height:100px; text-align:center; position:absolute; color:#000;} .over{ width:100%; height:100%; background:rgba(204,204,204,0.5); position:absolute; top:0; left:0; display:none;} .over-frame{ width:500px; height:200px; margin:0 auto; margin-top:20%; font-size:90px; text-align:center; line-height:200px; cursor:pointer;}
function showNumberWithAnimation(i,j,randNumber){ var numberCell=$('#number-cell-'+i+"-"+j); numberCell.css("background-color",getNumberBackgroundColor(randNumber)) numberCell.css("color",getNumberColor(randNumber)) numberCell.text(getNumberText( randNumber )) numberCell.animate({ width:cellSideLength, height:cellSideLength, top:getPosTop(i,j), left:getPosLeft(i,j) },50); } function showMoveAnimation( fromx , fromy , tox, toy ){ var numberCell = $('#number-cell-' + fromx + '-' + fromy ); numberCell.animate({ top:getPosTop(tox,toy), left:getPosLeft(tox,toy) },200) } function updateScore(score){ $("#score").text(score) } $(function(){ $("#bot").click(function(){ updateScore(0) }) })
var board=new Array(); var score=0; var hasConflicted=new Array(); var startx=0; var starty=0; var endx=0; var endy=0; $(document).ready(function(){ prepareForMobile(); newgame(); score=0; updateScore(score); }) function prepareForMobile(){ if(documentWidth>500){ gridContainerWidth=500; cellSpace=20; cellSideLength=100; } $("#main").css("width",gridContainerWidth-2*cellSpace); $("#main").css("height",gridContainerWidth-2*cellSpace); $("#main").css("padding",cellSpace); $("#main").css("border-radius",0.01*gridContainerWidth); $(".main-box").css("width",cellSideLength); $(".main-box").css("height",cellSideLength); $(".main-box").css("border-radius",0.01*cellSideLength); } function newgame(){ //初始化棋盘格 init(); //随机生成两个数字 generateOneNumber(); generateOneNumber(); } function init(){ for(var i=0;i<4;i++){ for(var j=0;j<4;j++){ var gridCell=$("#box-"+i+"-"+j) gridCell.css("top",getPosTop(i,j)) gridCell.css("left",getPosLeft(i,j)) } } for(var i=0;i<4;i++){ board[i]=new Array(); hasConflicted[i]=new Array(); for(var j=0;j<4;j++){ board[i][j]=0; hasConflicted[i][j]=false; } } updateBoardView(); score=0; } function updateBoardView(){ $(".number-cell").remove(); for(var i=0; i<4;i++){ for(var j=0;j<4;j++){ $("#main").append('<div class="number-cell" id="number-cell-'+i+'-'+j+'"></div>') var theNumberCell=$('#number-cell-'+i+'-'+j) if(board[i][j]==0){ theNumberCell.css({"width":"0","height":"0"}) theNumberCell.css("top",getPosTop(i,j)+cellSideLength/2) theNumberCell.css("left",getPosLeft(i,j)+cellSideLength/2) }else{ theNumberCell.css('width',cellSideLength); theNumberCell.css('height',cellSideLength); theNumberCell.css('top',getPosTop(i,j)); theNumberCell.css('left',getPosLeft(i,j)); theNumberCell.css('background-color',getNumberBackgroundColor( board[i][j] ) ); theNumberCell.css('color',getNumberColor( board[i][j] ) ); theNumberCell.text( getNumberText( board[i][j] ) ); } hasConflicted[i][j]=false; } $(".number-cell").css("line-height",cellSideLength+"px"); $(".number-cell").css("font-size",0.3*cellSideLength+"px"); } } function generateOneNumber(){ if(nospace(board)) return false; //随机一个位置 var randx=parseInt(Math.floor(Math.random()*4)); var randy=parseInt(Math.floor(Math.random()*4)) var times=0; while(times<50){ if(board[randx][randy]==0) break; randx=parseInt(Math.floor(Math.random()*4)); randy=parseInt(Math.floor(Math.random()*4)) times++; } if(times==50){ for(var i=0;i<4;i++) for(var j=0; j<4; j++){ if(doard[i][j]==0){ randx=i; randy=j; } } } //随机一个数字 var randNumber=Math.random()<0.5? 2:4; //在随机的位置上显示数字 board[randx][randy]=randNumber; showNumberWithAnimation(randx,randy,randNumber) return true; } $(document).keydown(function(event){ switch(event.keyCode){ case 37://left event.preventDefault() if(moveLeft()){ setTimeout("generateOneNumber()",210); setTimeout("isgameover()",300); } break; case 38://up event.preventDefault() if(moveUp()){ setTimeout("generateOneNumber()",210); setTimeout("isgameover()",300); } break; case 39://right event.preventDefault() if(moveRight()){ setTimeout("generateOneNumber()",210); setTimeout("isgameover()",300); } break; case 40://down event.preventDefault() if(moveDown()){ setTimeout("generateOneNumber()",210); setTimeout("isgameover()",300); } break; } }) document.addEventListener('touchstart',function(event){ startx=event.touches[0].pageX; starty=event.touches[0].pageY; }) document.addEventListener('touchmove',function(event){ event.preventDefault() }) document.addEventListener('touchend',function(event){ endx=event.changedTouches[0].pageX; endy=event.changedTouches[0].pageY; var deltax=endx-startx; var deltay=endy-starty; if(Math.abs(deltax)<0.3*documentWidth && Math.abs(deltay)<0.3*documentWidth) return; //x轴进行滑动 if(Math.abs(deltax)>=Math.abs(deltay)){ if(deltax>0){ //move right if(moveRight()){ setTimeout("generateOneNumber()",210); setTimeout("isgameover()",300); } }else{ //move left if(moveLeft()){ setTimeout("generateOneNumber()",210); setTimeout("isgameover()",300); } } } //y轴进行滑动 else{ if(deltay>0){ //move down if(moveDown()){ setTimeout("generateOneNumber()",210); setTimeout("isgameover()",300); } }else{ //move up if(moveUp()){ setTimeout("generateOneNumber()",210); setTimeout("isgameover()",300); } } } }) function isgameover(){ if(nospace(board) && nomove(board)){ gameover(); } } function moveLeft(){ if(!canMoveLeft(board)) return false; //moveLeft for(var i=0; i<4;i++) for(var j=1; j<4;j++){ if(board[i][j]!=0){ for(var k=0; k<j;k++){ if(board[i][k]==0 && noBlockHorizontal(i,k,j,board)){ //move showMoveAnimation(i,j,i,k) board[i][k]=board[i][j] board[i][j]=0; continue }else if(board[i][k]==board[i][j] && noBlockHorizontal(i,k,j,board) && !hasConflicted[i][k]){ //move showMoveAnimation(i,j,i,k) //add board[i][k]+=board[i][j] board[i][j]=0; //addscore score+=board[i][k] updateScore(score) hasConflicted[i][k]=true; continue } } } } setTimeout("updateBoardView()",200) return true; } function moveRight(){ if(!canMoveRight(board)) return false; //moveRight for(var i=0; i<4;i++) for(var j=2; j>=0;j--){ if(board[i][j]!=0){ for(var k=3; k>j;k--){ if(board[i][k]==0 && noBlockHorizontal(i,k,j,board)){ //move showMoveAnimation(i,j,i,k) board[i][k]=board[i][j] board[i][j]=0; continue }else if(board[i][k]==board[i][j] && noBlockHorizontal(i,j,k,board) && !hasConflicted[i][k]){ //move showMoveAnimation(i,j,i,k) //add board[i][k] *= 2; board[i][j] = 0; //addscore score += board[i][k] updateScore(score) hasConflicted[i][k]=true; continue } } } } setTimeout("updateBoardView()",200) return true; } function moveUp(){ if( !canMoveUp( board ) ) return false; //moveUp for( var j = 0 ; j < 4 ; j ++ ) for( var i = 1 ; i < 4 ; i ++ ){ if( board[i][j] != 0 ){ for( var k = 0 ; k < i ; k ++ ){ if( board[k][j] == 0 && noBlockVertical( j , k , i , board ) ){ showMoveAnimation( i , j , k , j ); board[k][j] = board[i][j]; board[i][j] = 0; continue; } else if( board[k][j] == board[i][j] && noBlockVertical( j , k , i , board ) && !hasConflicted[k][j]){ showMoveAnimation( i , j , k , j ); board[k][j] *= 2; board[i][j] = 0; //addscore score+=board[k][j] updateScore(score) hasConflicted[k][j]=true; continue; } } } } setTimeout("updateBoardView()",200); return true; } function moveDown(){ if( !canMoveDown( board ) ) return false; //moveDown for( var j = 0 ; j < 4 ; j ++ ) for( var i = 2 ; i>=0 ; i -- ){ if( board[i][j] != 0 ){ for( var k = 3 ; k >i ; k -- ){ if( board[k][j] == 0 && noBlockVertical( j , k , i , board ) ){ showMoveAnimation( i , j , k , j ); board[k][j] = board[i][j]; board[i][j] = 0; continue; } else if( board[k][j] == board[i][j] && noBlockVertical( j , i , k , board ) && !hasConflicted[k][j]){ showMoveAnimation( i , j , k , j ); board[k][j] *= 2; board[i][j] = 0; //addscore score+=board[k][j] updateScore(score) hasConflicted[k][j] = true; continue; } } } } setTimeout("updateBoardView()",200); return true; } function gameover(){ $(".over").show(); $(document).click(function(){ $(".over").hide() }) } $("#bot").click(function(){ score=0; updateScore(score) })
documentWidth=window.screen.availWidth; gridContainerWidth=0.92*documentWidth; cellSideLength=0.18*documentWidth; cellSpace=0.04*documentWidth; function getPosTop(i,j){ return cellSpace+i*(cellSpace+cellSideLength); } function getPosLeft(i,j){ return cellSpace+j*(cellSpace+cellSideLength); } function getNumberBackgroundColor(number){ switch(number){ case 2:return "#eee4da"; break ; case 4:return "#ede0c8"; break ; case 8:return "#f2b179"; break ; case 16:return "#f59563"; break; case 32:return "#f67c5f"; break; case 64:return "#f65e3b"; break; case 128:return "#edcf72"; break; case 256:return "#edcc61"; break; case 512:return "#9c0"; break; case 1024:return "#33b5e5"; break; case 2048:return "#09c"; break ; case 4096:return "#a6c"; break ; case 8192:return "#93c"; break ; } return "black" } function getNumberText(number){ switch(number){ case 2:return "小白"; break; case 4:return "实习生"; break; case 8:return "程序员"; break; case 16:return "工程师"; break; case 32:return "主管"; break; case 64:return "经理"; break; case 128:return "总监"; break; case 256:return "总经理"; break; case 512:return "副总裁"; break; case 1024:return "CEO"; break; case 2048:return "总裁"; break ; case 4096:return "董事长"; break ; case 8192:return "乔布斯"; break ; } return "black"; } function getNumberColor(number){ if(number<=4) return "#776e65"; return "#ded0c2" } function nospace( board ){ for( var i = 0 ; i < 4 ; i ++ ) for( var j = 0 ; j < 4 ; j ++ ) if( board[i][j] == 0 ) return false; return true; } function canMoveLeft(board){ for(var i=0; i<4;i++) for(var j=0; j<4;j++) if(board[i][j]!=0) if(board[i][j-1]==0 || board[i][j-1]==board[i][j]) return true; return false; } function canMoveRight(board){ for(var i=0; i<4;i++) for(var j=2; j>=0;j--) if(board[i][j]!=0) if(board[i][j+1]==0 || board[i][j+1]==board[i][j]) return true; return false; } function canMoveUp( board ){ for( var j = 0 ; j < 4 ; j ++ ) for( var i = 1 ; i < 4 ; i ++ ) if( board[i][j] != 0 ) if( board[i-1][j] == 0 || board[i-1][j] == board[i][j] ) return true; return false; } function canMoveDown( board ){ for( var j = 0 ; j < 4 ; j ++ ) for( var i = 2 ; i >= 0 ; i -- ) if( board[i][j] != 0 ) if( board[i+1][j] == 0 || board[i+1][j] == board[i][j] ) return true; return false; } function noBlockHorizontal(row,coll,col2,board){ for(var i=coll+1;i<col2;i++) if(board[row][i]!=0) return false; return true; } function noBlockVertical( col , row1 , row2 , board ){ for( var i = row1 + 1 ; i < row2 ; i ++ ) if( board[i][col] != 0 ) return false; return true; } function nomove(board){ if(canMoveLeft(board)|| canMoveRight(board)|| canMoveUp(board)|| canMoveDown(board)) return false; return true; }