2048

技术:

-HTML

-CSS

-Javascript

-JQuery

下面是代码内容

index.html

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <meta name="viewport"
 6           content="width=device-width, height=device-height, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
 7     <title>2048</title>
 8     <link rel="stylesheet" type="text/css" href="2048.css" />
 9 
10     <script type="text/javascript" src="jquery.min.js"></script>
11     <script type="text/javascript" src="support2048.js"></script>
12     <script type="text/javascript" src="showanimation2048.js"></script>
13     <script type="text/javascript" src="main2048.js"></script>
14 </head>
15 <body>
16 <header>
17     <h1><img src="yjcheng.png" width="35" height="35" alt="yjcheng">私人订制2048</h1>
18     <p>——made by yjcheng</p>
19     <a href="javascript:newgame();" id="newgamebutton">新游戏</a>
20     <p>score: <span id="score">0</span></p>
21 </header>
22 
23 <div id="grid-container">
24     <div class="grid-cell" id="grid-cell-0-0"></div>
25     <div class="grid-cell" id="grid-cell-0-1"></div>
26     <div class="grid-cell" id="grid-cell-0-2"></div>
27     <div class="grid-cell" id="grid-cell-0-3"></div>
28 
29     <div class="grid-cell" id="grid-cell-1-0"></div>
30     <div class="grid-cell" id="grid-cell-1-1"></div>
31     <div class="grid-cell" id="grid-cell-1-2"></div>
32     <div class="grid-cell" id="grid-cell-1-3"></div>
33 
34     <div class="grid-cell" id="grid-cell-2-0"></div>
35     <div class="grid-cell" id="grid-cell-2-1"></div>
36     <div class="grid-cell" id="grid-cell-2-2"></div>
37     <div class="grid-cell" id="grid-cell-2-3"></div>
38 
39     <div class="grid-cell" id="grid-cell-3-0"></div>
40     <div class="grid-cell" id="grid-cell-3-1"></div>
41     <div class="grid-cell" id="grid-cell-3-2"></div>
42     <div class="grid-cell" id="grid-cell-3-3"></div>
43 </div>
44 </body>
45 </html>

2048.css

 1 header{
 2     display:block;
 3     margin:0 auto;
 4     width:100%;
 5     text-align:center;
 6 }
 7 
 8 header h1{
 9     font-family:Arial;
10     font-size:40px;
11     font-weight:bold;
12     margin: 10px auto;
13 }
14 
15 header #newgamebutton{
16     display:block;
17     margin:0px auto;
18 
19     width:100px;
20     padding:10px 10px;
21     background-color:#8f7a66;
22 
23     font-family:Arial;
24     color:white;
25 
26     border-radius:10px;
27 
28     text-decoration:none;
29 }
30 header #newgamebutton:hover{
31     background-color:#9f8b77;
32 }
33 
34 header p{
35     font-family:Arial;
36     font-size:25px;
37     margin:20px auto;
38 }
39 
40 #grid-container{
41     width:460px;
42     height:460px;
43     padding:20px;
44 
45     margin:50px auto;
46     background-color:#bbada0;
47 
48     border-radius: 10px;
49     position: relative;
50 }
51 
52 .grid-cell{
53     width:100px;
54     height:100px;
55     border-radius: 6px;
56     background-color:#ccc0b3;
57 
58     position: absolute;
59 }
60 
61 .number-cell{
62     border-radius: 6px;
63 
64     font-family: Arial;
65     font-weight:bold;
66     font-size:60px;
67     line-height:100px;
68     text-align:center;
69 
70     position:absolute;
71 }

main2048.js

  1 var board = new Array();
  2 var score = 0;
  3 var hasConflicted = new Array();
  4 
  5 var startx = 0;
  6 var starty = 0;
  7 var endx = 0;
  8 var endy = 0;
  9 
 10 $(document).ready(function(){
 11     prepareForMobile();
 12     newgame();
 13 });
 14 
 15 function prepareForMobile(){
 16 
 17     if( documentWidth > 500 ){
 18         gridContainerWidth = 500;
 19         cellSpace = 20;
 20         cellSideLength = 100;
 21     }
 22 
 23     $('#grid-container').css('width',gridContainerWidth - 2*cellSpace);
 24     $('#grid-container').css('height',gridContainerWidth - 2*cellSpace);
 25     $('#grid-container').css('padding', cellSpace);
 26     $('#grid-container').css('border-radius',0.02*gridContainerWidth);
 27 
 28     $('.grid-cell').css('width',cellSideLength);
 29     $('.grid-cell').css('height',cellSideLength);
 30     $('.grid-cell').css('border-radius',0.02*cellSideLength);
 31 }
 32 
 33 function newgame(){
 34     //初始化棋盘格
 35     init();
 36     //在随机两个格子生成数字
 37     generateOneNumber();
 38     generateOneNumber();
 39 }
 40 
 41 function init(){
 42     for( var i = 0 ; i < 4 ; i ++ )
 43         for( var j = 0 ; j < 4 ; j ++ ){
 44 
 45             var gridCell = $('#grid-cell-'+i+"-"+j);
 46             gridCell.css('top', getPosTop( i , j ) );
 47             gridCell.css('left', getPosLeft( i , j ) );
 48         }
 49 
 50     for( var i = 0 ; i < 4 ; i ++ ){
 51         board[i] = new Array();
 52         hasConflicted[i] = new Array();
 53         for( var j = 0 ; j < 4 ; j ++ ) {
 54             board[i][j] = 0;
 55             hasConflicted[i][j] = false;
 56         }
 57     }
 58 
 59     updateBoardView();
 60 
 61     score = 0;
 62     $('#score').text( score );
 63 }
 64 
 65 function updateBoardView(){
 66 
 67     $(".number-cell").remove();
 68     for( var i = 0 ; i < 4 ; i ++ )
 69         for( var j = 0 ; j < 4 ; j ++ ){
 70             $("#grid-container").append( '<div class="number-cell" id="number-cell-'+i+'-'+j+'"></div>' );
 71             var theNumberCell = $('#number-cell-'+i+'-'+j);
 72 
 73             if( board[i][j] == 0 ){
 74                 theNumberCell.css('width','0px');
 75                 theNumberCell.css('height','0px');
 76                 theNumberCell.css('top',getPosTop(i,j) + cellSideLength/2 );
 77                 theNumberCell.css('left',getPosLeft(i,j) + cellSideLength/2 );
 78             }
 79             else{
 80                 theNumberCell.css('width',cellSideLength );
 81                 theNumberCell.css('height',cellSideLength );
 82                 theNumberCell.css('top',getPosTop(i,j));
 83                 theNumberCell.css('left',getPosLeft(i,j));
 84                 theNumberCell.css('background-color',getNumberBackgroundColor( board[i][j] ) );
 85                 theNumberCell.css('color',getNumberColor( board[i][j] ) );
 86                 theNumberCell.text( getNumberText(board[i][j]) );
 87             }
 88 
 89             hasConflicted[i][j] = false;
 90         }
 91 
 92     $('.number-cell').css('line-height',cellSideLength+'px');
 93     $('.number-cell').css('font-size',0.3 * cellSideLength+'px');
 94 }
 95 
 96 function generateOneNumber() {
 97 
 98     if (nospace(board))
 99         return false;
100 
101     //随机一个位置
102     var randx = parseInt( Math.floor( Math.random()  * 4 ) );
103     var randy = parseInt( Math.floor( Math.random()  * 4 ) );
104 
105     var times = 0;
106     while( times < 50 ){
107         if( board[randx][randy] == 0 )
108             break;
109 
110         randx = parseInt( Math.floor( Math.random()  * 4 ) );
111         randy = parseInt( Math.floor( Math.random()  * 4 ) );
112 
113         times ++;
114     }
115     if(times == 50){
116         for( var i = 0 ; i < 4 ; i ++ )
117             for( var j = 0 ; j < 4 ; j ++ ){
118                 if( board[i][j] == 0 ){
119                     randx = i;
120                     randy = j;
121                 }
122             }
123     }
124 
125     //随机一个数字
126     var randNumber = Math.random() < 0.5 ? 2 : 4;
127 
128     //在随机位置显示随机数字
129     board[randx][randy] = randNumber;
130     showNumberWithAnimation( randx , randy , randNumber );
131 
132     return true;
133 }
134 
135 $(document).keydown( function( event ) {
136 
137     switch( event.keyCode ) {
138         case 37: //left
139             event.preventDefault();
140             if (moveLeft()) {
141                 setTimeout("generateOneNumber()", 210);
142                 setTimeout("isgameover()", 300);
143             }
144             break;
145         case 38: //up
146             event.preventDefault();
147             if (moveUp()) {
148                 setTimeout("generateOneNumber()", 210);
149                 setTimeout("isgameover()", 300);
150             }
151             break;
152         case 39: //right
153             event.preventDefault();
154             if (moveRight()) {
155                 setTimeout("generateOneNumber()", 210);
156                 setTimeout("isgameover()", 300);
157             }
158             break;
159         case 40: //down
160             event.preventDefault();
161             if (moveDown()) {
162                 setTimeout("generateOneNumber()", 210);
163                 setTimeout("isgameover()", 300);
164             }
165             break;
166         default: //default
167             break;
168     }
169 });
170 
171 document.addEventListener('touchstart',function(event){
172     startx = event.touches[0].pageX;
173     starty = event.touches[0].pageY;
174 });
175 
176 document.addEventListener('touchmove',function(even){
177     event.preventDefault();
178 });
179 
180 document.addEventListener('touchend',function(event){
181     endx = event.changedTouches[0].pageX;
182     endy = event.changedTouches[0].pageY;
183 
184     var deltax = endx - startx;
185     var deltay = endy - starty;
186 
187     if ( Math.abs( deltax ) < 0.3 * documentWidth && Math.abs( deltay ) < 0.3 * documentWidth )
188         return;
189 
190     //x
191     if ( Math.abs(deltax) >= Math.abs(deltay) ) {
192 
193         if ( deltax > 0 ) {
194             //move right
195             if (moveRight()) {
196                 setTimeout("generateOneNumber()", 210);
197                 setTimeout("isGameOver()", 300);
198             }
199         }
200         else{
201             //move left
202             if (moveLeft()) {
203                 setTimeout("generateOneNumber()", 210);
204                 setTimeout("isGameOver()", 300);
205             }
206         }
207     }
208     //y
209     else {
210 
211         if ( deltay > 0 ){
212             //move down
213             if (moveDown()) {
214                 setTimeout("generateOneNumber()", 210);
215                 setTimeout("isGameOver()", 300);
216             }
217         }
218         else{
219             //move up
220             if (moveUp()) {
221                 setTimeout("generateOneNumber()", 210);
222                 setTimeout("isGameOver()", 300);
223             }
224         }
225     }
226 });
227 
228 function isgameover(){
229     if( nospace( board ) && nomove( board ) ){
230         gameover();
231     }
232 }
233 
234 function gameover(){
235     alert('gameover!');
236 }
237 
238 function moveLeft(){
239 
240     if( !canMoveLeft( board ) )
241         return false;
242 
243     //moveLeft
244     for( var i = 0 ; i < 4 ; i ++ )
245         for( var j = 1 ; j < 4 ; j ++ ){
246             if( board[i][j] != 0 ){
247 
248                 for( var k = 0 ; k < j ; k ++ ){
249                     if( board[i][k] == 0 && noBlockHorizontal( i , k , j , board ) ){
250                         //move
251                         showMoveAnimation( i , j , i , k );
252                         board[i][k] = board[i][j];
253                         board[i][j] = 0;
254                         continue;
255                     }
256                     else if( board[i][k] == board[i][j] && noBlockHorizontal( i , k , j , board )  && !hasConflicted[i][k] ){
257                         //move
258                         showMoveAnimation( i , j , i , k );
259                         //add
260                         board[i][k] += board[i][j];
261                         board[i][j] = 0;
262                         //add score
263                         score += board[i][k];
264                         updateScore( score );
265 
266                         hasConflicted[i][k] = true;
267                         continue;
268                     }
269                 }
270             }
271         }
272 
273     setTimeout("updateBoardView()",200);
274     return true;
275 }
276 
277 function moveRight(){
278 
279     if( !canMoveRight( board ) )
280         return false;
281 
282     //moveRight
283     for( var i = 0 ; i < 4 ; i ++ )
284         for( var j = 2 ; j >= 0 ; j -- ){
285             if( board[i][j] != 0 ){
286 
287                 for( var k = 3 ; k > j ; k -- ){
288                     if( board[i][k] == 0 && noBlockHorizontal( i , j , k , board ) ){
289                         //move
290                         showMoveAnimation( i , j , i , k );
291                         board[i][k] = board[i][j];
292                         board[i][j] = 0;
293                         continue;
294                     }
295                     else if( board[i][k] == board[i][j] && noBlockHorizontal( i , j , k , board ) && !hasConflicted[i][k] ){
296                         //move
297                         showMoveAnimation( i , j , i , k );
298                         //add
299                         board[i][k] += board[i][j];
300                         board[i][j] = 0;
301                         //add score
302                         score += board[i][k];
303                         updateScore( score );
304 
305                         hasConflicted[i][k] = true;
306                         continue;
307                     }
308                 }
309             }
310         }
311 
312     setTimeout("updateBoardView()",200);
313     return true;
314 }
315 
316 function moveUp(){
317 
318     if( !canMoveUp( board ) )
319         return false;
320 
321     //moveUp
322     for( var j = 0 ; j < 4 ; j ++ )
323         for( var i = 1 ; i < 4 ; i ++ ){
324             if( board[i][j] != 0 ){
325 
326                 for( var k = 0 ; k < i ; k ++ ){
327                     if( board[k][j] == 0 && noBlockVertical( j , k , i , board ) ){
328                         //move
329                         showMoveAnimation( i , j , k , j );
330                         board[k][j] = board[i][j];
331                         board[i][j] = 0;
332                         continue;
333                     }
334                     else if( board[k][j] == board[i][j] && noBlockVertical( j , k , i , board ) && !hasConflicted[k][j] ){
335                         //move
336                         showMoveAnimation( i , j , k , j );
337                         //add
338                         board[k][j] += board[i][j];
339                         board[i][j] = 0;
340                         //add score
341                         score += board[k][j];
342                         updateScore( score );
343 
344                         hasConflicted[k][j] = true;
345                         continue;
346                     }
347                 }
348             }
349         }
350 
351     setTimeout("updateBoardView()",200);
352     return true;
353 }
354 
355 function moveDown(){
356 
357     if( !canMoveDown( board ) )
358         return false;
359 
360     //moveDown
361     for( var j = 0 ; j < 4 ; j ++ )
362         for( var i = 2 ; i >= 0 ; i -- ){
363             if( board[i][j] != 0 ){
364 
365                 for( var k = 3 ; k > i ; k -- ){
366                     if( board[k][j] == 0 && noBlockVertical( j , i , k , board ) ){
367                         //move
368                         showMoveAnimation( i , j , k , j );
369                         board[k][j] = board[i][j];
370                         board[i][j] = 0;
371                         continue;
372                     }
373                     else if( board[k][j] == board[i][j] && noBlockVertical( j , i , k , board ) && !hasConflicted[k][j] ){
374                         //move
375                         showMoveAnimation( i , j , k , j );
376                         //add
377                         board[k][j] += board[i][j];
378                         board[i][j] = 0;
379                         //add score
380                         score += board[k][j];
381                         updateScore( score );
382 
383                         hasConflicted[k][j] = true;
384                         continue;
385                     }
386                 }
387             }
388         }
389 
390     setTimeout("updateBoardView()",200);
391     return true;
392 }

showanimation2048.js

 1 function showNumberWithAnimation( i , j , randNumber ){
 2 
 3     var numberCell = $('#number-cell-' + i + "-" + j );
 4 
 5     numberCell.css('background-color',getNumberBackgroundColor( randNumber ) );
 6     numberCell.css('color',getNumberColor( randNumber ) );
 7     numberCell.text( getNumberText(randNumber) );
 8 
 9     numberCell.animate({
10         cellSideLength,
11         height:cellSideLength,
12         top:getPosTop( i , j ),
13         left:getPosLeft( i , j )
14     },50);
15 }
16 
17 function showMoveAnimation(fromx ,fromy,tox,toy) {
18 
19     var numberCell = $('#number-cell-' + fromx + '-' + fromy);
20     numberCell.animate({
21         top: getPosTop(tox, toy),
22         left: getPosLeft(tox, toy)
23     }, 200);
24 }
25 
26 function updateScore(score){
27     $('#score').text(score);
28 }

support2048.js

  1 documentWidth = window.screen.availWidth;
  2 gridContainerWidth = 0.92 * documentWidth;
  3 cellSideLength = 0.18 * documentWidth;
  4 cellSpace = 0.04 * documentWidth;
  5 
  6 function getPosTop( i , j ){
  7     return cellSpace + i*(cellSpace+cellSideLength);
  8 }
  9 
 10 function getPosLeft( i , j ){
 11     return cellSpace + j*(cellSpace+cellSideLength);
 12 }
 13 
 14 function getNumberBackgroundColor( number ){
 15     switch( number ){
 16         case 2:return "#eee4da";break;
 17         case 4:return "#ede0c8";break;
 18         case 8:return "#f2b179";break;
 19         case 16:return "#f59563";break;
 20         case 32:return "#f67c5f";break;
 21         case 64:return "#f65e3b";break;
 22         case 128:return "#edcf72";break;
 23         case 256:return "#edcc61";break;
 24         case 512:return "#9c0";break;
 25         case 1024:return "#33b5e5";break;
 26         case 2048:return "#09c";break;
 27         case 4096:return "#a6c";break;
 28         case 8192:return "#93c";break;
 29     }
 30 
 31     return "black";
 32 }
 33 
 34 function getNumberText(number){
 35     switch(number){
 36         case 2:return "A"; break;
 37         case 4:return "B"; break;
 38         case 8:return "C"; break;
 39         case 16:return "D"; break;
 40         case 32:return "E"; break;
 41         case 64:return "F"; break;
 42         case 128:return "G"; break;
 43         case 256:return "H"; break;
 44         case 512:return "I"; break;
 45         case 1024:return "J"; break;
 46         case 2048:return "K"; break;
 47         case 4096:return "L"; break;
 48         case 8192:return "M"; break;
 49         case 16384:return "N"; break;
 50         case 32768:return "O"; break;
 51         case 65536:return "P"; break;
 52     }
 53 
 54     return "神经病";
 55 }
 56 
 57 function getNumberColor( number ){
 58     if( number <= 4 )
 59         return "#776e65";
 60 
 61     return "white";
 62 }
 63 
 64 function nospace( board ){
 65 
 66     for( var i = 0 ; i < 4 ; i ++ )
 67         for( var j = 0 ; j < 4 ; j ++ )
 68             if( board[i][j] == 0 )
 69                 return false;
 70 
 71     return true;
 72 }
 73 
 74 function canMoveLeft( board ) {
 75 
 76     for (var i = 0; i < 4; i++)
 77         for (var j = 1; j < 4; j++)
 78             if (board[i][j] != 0)
 79                 if (board[i][j - 1] == 0 || board[i][j - 1] == board[i][j])
 80                     return true;
 81 
 82     return false;
 83 }
 84 
 85 function canMoveRight( board ) {
 86 
 87     for (var i = 0; i < 4; i++)
 88         for (var j = 2; j >= 0; j--)
 89             if (board[i][j] != 0)
 90                 if (board[i][j + 1] == 0 || board[i][j + 1] == board[i][j])
 91                     return true;
 92 
 93     return false;
 94 }
 95 
 96 function canMoveUp( board ) {
 97 
 98     for (var j = 0; j < 4; j++)
 99         for (var i = 1; i < 4; i++)
100             if (board[i][j] != 0)
101                 if (board[i - 1][j] == 0 || board[i - 1][j] == board[i][j])
102                     return true;
103 
104     return false;
105 }
106 
107 function canMoveDown( board ) {
108 
109     for (var j = 0; j < 4; j++)
110         for (var i = 2; i >= 0; i--)
111             if (board[i][j] != 0)
112                 if (board[i + 1][j] == 0 || board[i + 1][j] == board[i][j])
113                     return true;
114 
115     return false;
116 }
117 
118 function noBlockHorizontal(row,col1,col2,board) {
119     for (var i = col1 + 1; i < col2; i++)
120         if (board[row][i] != 0)
121             return false;
122     return true;
123 }
124 
125 function noBlockVertical(col,row1,row2,board) {
126     for (var i = row1 + 1; i < row2; i++)
127         if (board[i][col] != 0)
128             return false;
129     return true;
130 }
131 
132 function nomove( board ) {
133     if (canMoveLeft(board) ||
134         canMoveRight(board) ||
135         canMoveDown(board) ||
136         canMoveRight(board))
137         return false;
138 
139     return true;
140 }

jquery.min.js(来自http://libs.baidu.com/jquery/1.9.0/jquery.min.js

yjcheng.png

最终游戏效果:

Web端:

 

移动端:

原文地址:https://www.cnblogs.com/jacen789/p/4734658.html