8-2 代码展示:@return
本节编程练习不计算学习进度,请电脑登录imooc.com操作

代码展示:@return

本人介绍:return,学生,就读于浙江温州大学计算机学院。

创作思路:跟着老师的路线走,部分函数自己想办法实现。比如up down left right 这些函数,我是先看了下老师的up函数,然后其余三个自己来写。

任务

与原版2048相比作品的优势:生成的时候的算法进行了优化。具体就是原来是先死循环50次,如果还不能找到位置的话,就一次遍历,直到找到个合适的,选择它为生成位置。我的算法就是先把所有可以生成的位置放到一个数组里去,然后在这个数组里进行随机选择,选择出的位置即为生成位置,相比于原函数,生成速度更快,随机性也更强。

 

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