本人介绍:return,学生,就读于浙江温州大学计算机学院。
创作思路:跟着老师的路线走,部分函数自己想办法实现。比如up down left right 这些函数,我是先看了下老师的up函数,然后其余三个自己来写。
与原版2048相比作品的优势:生成的时候的算法进行了优化。具体就是原来是先死循环50次,如果还不能找到位置的话,就一次遍历,直到找到个合适的,选择它为生成位置。我的算法就是先把所有可以生成的位置放到一个数组里去,然后在这个数组里进行随机选择,选择出的位置即为生成位置,相比于原函数,生成速度更快,随机性也更强。
<!DOCTYPE html> <html> <head> <meta charset="UTP-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 rel="stylesheet" type="text/css" href="2048.css" /> <script type="text/javascript" src="http://libs.baidu.com/jquery/1.9.0/jquery.min.js"></script> <script type="text/javascript" src="support2048.js"></script> <script type="text/javascript" src="showanimation2048.js"></script> <script type="text/javascript" src="main2048.js"></script> </head> <body> <header> <h1>2048</h1> <a href="javascript:newgame();" id="newgamebutton">New Game</a> <p>score : <span id="score">0</span></p> </header> <div id="grid-container"> <div class="grid-cell" id="grid-cell-0-0"></div> <div class="grid-cell" id="grid-cell-0-1"></div> <div class="grid-cell" id="grid-cell-0-2"></div> <div class="grid-cell" id="grid-cell-0-3"></div> <div class="grid-cell" id="grid-cell-1-0"></div> <div class="grid-cell" id="grid-cell-1-1"></div> <div class="grid-cell" id="grid-cell-1-2"></div> <div class="grid-cell" id="grid-cell-1-3"></div> <div class="grid-cell" id="grid-cell-2-0"></div> <div class="grid-cell" id="grid-cell-2-1"></div> <div class="grid-cell" id="grid-cell-2-2"></div> <div class="grid-cell" id="grid-cell-2-3"></div> <div class="grid-cell" id="grid-cell-3-0"></div> <div class="grid-cell" id="grid-cell-3-1"></div> <div class="grid-cell" id="grid-cell-3-2"></div> <div class="grid-cell" id="grid-cell-3-3"></div> </div> </body> </html>
/** * Created by liuyubobobo on 14-4-11. * my site: http://www.liuyubobobo.com */ header{ display:block; margin:0 auto; width:100%; text-align:center; } header h1{ font-family:Arial; font-size:40px; font-weight:bold; margin:0 auto; } header #newgamebutton{ display:block; margin:10px auto; width:100px; padding:10px 10px; background-color:#8f7a66; font-family:Arial; color:white; border-radius:10px; text-decoration:none; } header #newgamebutton:hover{ background-color:#9f8b77; } header p{ font-family:Arial; font-size:25px; margin:10px auto; } #grid-container{ width:460px; height:460px; padding:20px; margin:10px auto; background-color:#bbada0; border-radius: 10px; position: relative; } .grid-cell{ width:100px; height:100px; border-radius: 6px; background-color:#ccc0b3; position: absolute; } .number-cell{ border-radius: 6px; font-family: Arial; font-weight:bold; font-size:60px; line-height:100px; text-align:center; position:absolute; }
/** * Created by liuyubobobo on 14-4-11. * my site: http://www.liuyubobobo.com */ var board = new Array(); var score = 0; var startx=0; var starty=0; var endx=0; var endy=0; var hasConflicted = new Array(); $(document).ready(function(){ prepareForMobile(); newgame(); }); function prepareForMobile(){ if( documentWidth > 500 ){ gridContainerWidth = 500; cellSpace = 20; cellSideLength = 100; } $('#grid-container').css('width',gridContainerWidth - 2*cellSpace); $('#grid-container').css('height',gridContainerWidth - 2*cellSpace); $('#grid-container').css('padding', cellSpace); $('#grid-container').css('border-radius',0.02*gridContainerWidth); $('.grid-cell').css('width',cellSideLength); $('.grid-cell').css('height',cellSideLength); $('.grid-cell').css('border-radius',0.02*cellSideLength); } function newgame(){ //初始化棋盘格 init(); //在随机两个格子生成数字 generateOneNumber(); generateOneNumber(); } function init(){ for( var i = 0 ; i < 4 ; i ++ ) for( var j = 0 ; j < 4 ; j ++ ){ var gridCell = $('#grid-cell-'+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 ++ ){ $("#grid-container").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','0px'); theNumberCell.css('height','0px'); 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( board[i][j] ); } hasConflicted[i][j] = false; } $('.number-cell').css('line-height',cellSideLength+'px'); $('.number-cell').css('font-size',0.6*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( board[i][j] == 0 ){ randx = i; randy = j; } } }*/ var count=0; var temporary=new Array(); for(var i=0;i<4;i++) for(var j=0;j<4;j++) { if(board[i][j]==0) { temporary[count]=i*4+j; count++; } } var pos= parseInt( Math.floor( Math.random() * count ) ); randx=Math.floor(temporary[pos]/4); randy=Math.floor(temporary[pos]%4); //随机一个数字 var randNumber = Math.random() < 0.5 ? 2 : 4; //在随机位置显示随机数字 board[randx][randy] = randNumber; showNumberWithAnimation( randx , randy , randNumber ); return true; } $(document).keydown( function( event ){ //event.preventDefault(); switch( event.keyCode ){ case 37: //left if( moveLeft() ){ setTimeout("generateOneNumber()",210); setTimeout("isgameover()",300); } break; case 38: //up if( moveUp() ){ setTimeout("generateOneNumber()",210); setTimeout("isgameover()",300); } break; case 39: //right if( moveRight() ){ setTimeout("generateOneNumber()",210); setTimeout("isgameover()",300); } break; case 40: //down if( moveDown() ){ setTimeout("generateOneNumber()",210); setTimeout("isgameover()",300); } break; default: //default break; } }); document.addEventListener('touchstart',function(event) { startx=event.touches[0].pageX; starty=event.touches[0].pageY; } ); 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; if(Math.abs(deltax)>=Math.abs(deltay)) { if(deltax>0)//right { if(moveRight()) { generateOneNumber(); isGameOver(); } }else//left { if(moveLeft()) { setTimeout("generateOneNumber()",210); setTimeout("isGameOver()",300); } } } else { if(deltay>0)//down { if(moveDown()) { generateOneNumber(); isGameOver(); } }else//up { if(moveUp()) { generateOneNumber(); isGameOver(); } } } } ); function isgameover(){ if( nospace( board ) && nomove( board ) ){ gameover(); } } function gameover(){ alert('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; //add score 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 , j , k , 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] += board[i][j]; board[i][j] = 0; //add score 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 ) ){ //move 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] ){ //move showMoveAnimation( i , j , k , j ); //add board[k][j] += board[i][j]; board[i][j] = 0; //add score 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 , i , k , board ) ){ //move 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] ){ //move showMoveAnimation( i , j , k , j ); //add board[k][j] += board[i][j]; board[i][j] = 0; //add score score += board[k][j]; updateScore( score ); hasConflicted[k][j] = true; continue; } } } } setTimeout("updateBoardView()",200); return true; }
/** * Created by liuyubobobo on 14-4-11. * my site: http://www.liuyubobobo.com */ function showNumberWithAnimation( i , j , randNumber ){ var numberCell = $('#number-cell-' + i + "-" + j ); numberCell.css('background-color',getNumberBackgroundColor( randNumber ) ); numberCell.css('color',getNumberColor( randNumber ) ); numberCell.text( randNumber ); numberCell.animate({ width:cellSideLength, height:cellSideLength, top:getPosTop( i , j ), left:getPosLeft( i , j ) },500); } 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); }
/** * Created by liuyubobobo on 14-4-11. * my site: http://www.liuyubobobo.com */ 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 getNumberColor( number ){ if( number <= 4 ) return "#776e65"; return "white"; } 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=1;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=0;j<3;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 i=1;i<4;i++) for(var j=0;j<4;j++) { 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 i=0;i<3;i++) for(var j=0;j<4;j++) { 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,col1,col2,board) { for(var i=col1+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)|| canMoveDown(board)|| canMoveRight(board)) return false; return true; }