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

代码展示:@大花猫

本人介绍:大花猫,Android工程师   24岁

创作思路:在原版的基础上将文字进行修改,变成一个升职版的2048,体验一下升职加薪,当上总经理的感觉!

任务

与原版2048相比作品的优势:添加了一个后台服务,记录当前用户成绩并存入排行榜,这样玩家就可以跟来自不同地方的玩家进行PK了。

  1. <!doctype html>
  2. <html>
  3. <head>
  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>Devis‘s 2048</title>
  8.  
  9. <link rel="stylesheet" type="text/css" href="2048.css"/>
  10.  
  11. <link rel="stylesheet" href="http://img1.sycdn.imooc.com//down/53ec35230001bcd000000000.css" />
  12. <script type="text/javascript" src="http://img1.sycdn.imooc.com//down/53ec35ad00013c9100000000.js"></script>
  13. <script type="text/javascript" src="http://img1.sycdn.imooc.com//down/53ec355b00013c6600000000.js"></script>
  14.  
  15.  
  16. <script type="text/javascript" src="support2048.js"></script>
  17. <script type="text/javascript" src="showanimation2048.js"></script>
  18. <script type="text/javascript" src="main2048.js"></script>
  19.  
  20. </head>
  21. <body>
  22. <style type="text/css">
  23.  
  24. #backgroundDiv {height:100%; width:100%; background-color:#000000;}
  25. </style>
  26. <script type="text/javascript">
  27. //页面初始化
  28. $(document).bind("mobileinit", function(){
  29. $.extend($.mobile , {
  30. defaultPageTransition: 'flow',
  31. defaultDialogTransition: 'flip'
  32. });
  33. });
  34. $.mobile.buttonMarkup.hoverDelay = "false";//按钮延迟问题的解决
  35. $(document).ready(function(){
  36. $("#newGameBtn").click(function(){
  37. canScroll = false;
  38. newgame();
  39. });
  40.  
  41. $("#continueGameBtn").click(function(){
  42. canScroll = false;
  43. });
  44.  
  45. $(".backHome").click(function(){
  46. canScroll = true;
  47. });
  48.  
  49. $("#uploadBtn").click(function(){
  50. getCharts();
  51. });
  52. });
  53.  
  54. //显示等待进度框
  55. function showProgressDialog() {
  56. $.mobile.loadingMessageTextVisible = true;
  57. $.mobile.showPageLoadingMsg('0. 0', "Please wait...");
  58. }
  59. //隐藏等待进度框
  60. function cancelProgressDialog() {
  61. $.mobile.hidePageLoadingMsg();
  62. }
  63.  
  64. function getCharts(){
  65.  
  66. showProgressDialog();
  67. $.get("server2048.php?playerName=Devis1&time=1999-11-11&bestPosition=11经理&bestSalary=11123&comment=hah1111ahaha", function(data){
  68. parseData(data);
  69. cancelProgressDialog();
  70. });
  71. }
  72.  
  73. //解析结果
  74. function parseData(data) {
  75.  
  76. var array = new Array();
  77. array = data.split("-=^=-", 10);
  78. for(var i=0; i<array.length; i++){
  79. var arr = array[i].split("=&=");
  80. $("#li"+i).text((i+1)+" "+arr[0]+" "+arr[2]+" "+arr[3]+"万年");
  81. }
  82.  
  83. if(data == '数据获取失败,请重新获取!'){
  84. return data;
  85. }else{
  86. return data;
  87. }
  88. }
  89.  
  90. </script>
  91. <!-- 我的主页 -->
  92. <div data-role="page" id="pageHome" data-theme="b">
  93. <div data-role="header" data-theme="b" data-tap-toggle="false" data-position="fixed" data-id="myheader">
  94. <h1>2048(升职版)</h1>
  95. </div>
  96.  
  97. <div data-role="content" >
  98.  
  99. <a id="newGameBtn" href="#page2048" data-role="button" data-transition="slide" data-corners="false" data-theme="c" >新游戏</a>
  100. <a id="continueGameBtn" href="#page2048" data-role="button" data-transition="slide" data-corners="false" data-theme="c">继续游戏</a>
  101. <a id="chartsBtn" href="#pageCharts" data-role="button" data-transition="flow" data-corners="false" data-theme="c">排行榜</a>
  102. <a id="helpBtn" href="#pageHelp" data-role="button" data-transition="slide" data-corners="false" data-theme="c">帮助</a>
  103. <!-- <a id="uploadBtn" data-role="button" data-transition="slide" data-corners="false" data-theme="c">上传成绩(测试)</a> -->
  104.  
  105. </div>
  106.  
  107. <div data-role="footer" data-tap-toggle="false" data-theme="b" data-position="fixed" data-id="myfooter">
  108. <h1>╮(╯▽╰)╭</h1>
  109. </div>
  110. </div>
  111.  
  112. <!-- 2048(升职版) -->
  113. <div data-role="page" id="page2048" data-theme="b">
  114. <div data-role="header" data-tap-toggle="false" data-position="fixed" data-theme="b">
  115. <a class="backHome" href="#pageHome" data-role="button" data-icon="home" data-transition="slide" data-direction="reverse">首页</a>
  116. <h1 id="title"></h1>
  117. </div>
  118.  
  119. <div data-role="content">
  120. <a href="javascript:newgame();" id="newgamebutton">新工作</a>
  121. <p id="scoreText">你是<span id="position">小白</span>--年薪: <span id="score">0</span></p>
  122. <div id="grid-container">
  123. <div class="grid-cell" id="grid-cell-0-0"></div>
  124. <div class="grid-cell" id="grid-cell-0-1"></div>
  125. <div class="grid-cell" id="grid-cell-0-2"></div>
  126. <div class="grid-cell" id="grid-cell-0-3"></div>
  127.  
  128. <div class="grid-cell" id="grid-cell-1-0"></div>
  129. <div class="grid-cell" id="grid-cell-1-1"></div>
  130. <div class="grid-cell" id="grid-cell-1-2"></div>
  131. <div class="grid-cell" id="grid-cell-1-3"></div>
  132.  
  133. <div class="grid-cell" id="grid-cell-2-0"></div>
  134. <div class="grid-cell" id="grid-cell-2-1"></div>
  135. <div class="grid-cell" id="grid-cell-2-2"></div>
  136. <div class="grid-cell" id="grid-cell-2-3"></div>
  137.  
  138. <div class="grid-cell" id="grid-cell-3-0"></div>
  139. <div class="grid-cell" id="grid-cell-3-1"></div>
  140. <div class="grid-cell" id="grid-cell-3-2"></div>
  141. <div class="grid-cell" id="grid-cell-3-3"></div>
  142. </div>
  143. </div>
  144.  
  145. <div data-role="footer" data-tap-toggle="false" data-position="fixed" data-theme="b">
  146. <h1>╮(╯▽╰)╭</h1>
  147. </div>
  148. </div>
  149.  
  150. <!-- 排行榜 -->
  151. <div data-role="page" id="pageCharts" data-theme="b">
  152. <div data-role="header" data-tap-toggle="false" data-position="fixed" data-theme="b">
  153. <a class="backHome" href="#pageHome" data-role="button" data-icon="home" data-transition="flow" data-direction="reverse">首页</a>
  154. <h1 id="title">排行榜</h1>
  155. </div>
  156.  
  157. <div data-role="content" id="chartsDiv" data-theme="d">
  158. <ul data-role="listview" data-inset="true">
  159. <li><a href="#" id="li0">Diana</a></li>
  160. <li><a href="#" id="li1">Adele</a></li>
  161. <li><a href="#" id="li2">Agnes</a></li>
  162. <li><a href="#" id="li3">Albert</a></li>
  163. <li><a href="#" id="li4">Billy</a></li>
  164. <li><a href="#" id="li5">Bob</a></li>
  165. <li><a href="#" id="li6">Calvin</a></li>
  166. <li><a href="#" id="li7">Cameron</a></li>
  167. <li><a href="#" id="li8">Chloe</a></li>
  168. <li><a href="#" id="li9">Christina</a></li>
  169. </ul>
  170.  
  171. </div>
  172.  
  173. <div data-role="footer" data-tap-toggle="false" data-position="fixed" data-theme="b">
  174. <h1>╮(╯▽╰)╭</h1>
  175. </div>
  176. </div>
  177.  
  178. <!-- 帮助 -->
  179. <div data-role="page" id="pageHelp" data-theme="b">
  180. <div data-role="header" data-tap-toggle="false" data-position="fixed" data-theme="b">
  181. <a class="backHome" href="#pageHome" data-role="button" data-icon="home" data-transition="slide" data-direction="reverse">首页</a>
  182. <h1 id="title">帮助</h1>
  183. </div>
  184.  
  185. <div data-role="content">
  186. <p id="charts">呵呵! 这么简单的游戏,没啥好帮助的。给你个诀窍,尽量把大的职位放到角落去。在一些配置不是特别好的机子上完可能会有点卡,别见怪,毕竟这是网页游戏~~~~</p>
  187.  
  188. </div>
  189.  
  190. <div data-role="footer" data-tap-toggle="false" data-position="fixed" data-theme="b">
  191. <h1>╮(╯▽╰)╭</h1>
  192. </div>
  193. </div>
  194.  
  195. <!-- 上传成绩 -->
  196. <div data-role="page" id="pageUpload" data-theme="b">
  197. <div data-role="header" data-tap-toggle="false" data-position="fixed" data-theme="b">
  198. <a class="backHome" href="#pageHome" data-role="button" data-icon="home" data-transition="slide" data-direction="reverse">首页</a>
  199. <h1 id="title">上传成绩</h1>
  200. </div>
  201.  
  202. <div data-role="content">
  203. <form action="server2048.php" method="post">
  204. <input type=text name="playerName" value="昵称呵呵"/><br/>
  205. <input type=text name="time" value="1999-12-08"/><br/>
  206. <input type=text name="bestPosition" value="董事长"/><br/>
  207. <input type=text name="bestSalary" value=1000/><br/>
  208. <input type=text name="comment" value="评论"/><br/>
  209. <input type=submit name="submit" value="提交" >
  210. </form>
  211.  
  212. </div>
  213.  
  214. <div data-role="footer" data-tap-toggle="false" data-position="fixed" data-theme="b">
  215. <h1>╮(╯▽╰)╭</h1>
  216. </div>
  217. </div>
  218.  
  219. <!-- 黑色背景 -->
  220. <div id="backgroundDiv">
  221.  
  222. </body>
  223. </html>
  1. #title{
  2. font-family: Arial;
  3. font-size: 16px;
  4. /* font-weight: bold;
  5. */ text-shadow:none;
  6. margin:10px auto;
  7. }
  8.  
  9. #newgamebutton{
  10. display: block;
  11. margin: 10px auto;
  12. width: 100px;
  13. padding: 5px 5px;
  14. background-color: #8f7a66;
  15.  
  16. font-family: Arial;
  17. color: white;
  18. border-radius: 8px;
  19. text-decoration: none;
  20. text-align: center;
  21. text-shadow:none;
  22. }
  23. #newgamebutton:hover{
  24. background-color: #9f8b77;
  25. }
  26. #scoreText{
  27. font-family: Arial;
  28. font-size: 16px;
  29. color: gray;
  30. margin: 8px auto;
  31. text-align: center;
  32. text-shadow:none;
  33. }
  34.  
  35. #grid-container{
  36. width: gridContainerWidth;
  37. height: gridContainerWidth;
  38. padding: cellSpace;
  39. margin: 10px auto;
  40. background-color: #bbada0;
  41. border-radius: 10px;
  42. position: relative;
  43. }
  44.  
  45. .grid-cell{
  46. width: cellSideLength;
  47. height: cellSideLength;
  48. border-radius: 10px;
  49. background-color: #ccc0b3;
  50. position: absolute;
  51. text-shadow:none;
  52. }
  53.  
  54. .number-cell{
  55. border-radius: 10px;
  56. font-family: Arial;
  57. font-weight: bold;
  58. font-size: cellSideLength/5;
  59. line-height: cellSideLength;
  60. text-align: center;
  61. text-shadow:none;
  62. position: absolute;
  63. }
  64.  
  65. /*弹窗样式
  66. .black_overlay{
  67. display: none;
  68. position: absolute;
  69. top: 0%;
  70. left: 0%;
  71. width: 100%;
  72. height: 100%;
  73. background-color: black;
  74. z-index:1001;
  75. -moz-opacity: 0.8;
  76. opacity:.80;
  77. filter: alpha(opacity=88);
  78. }
  79. .white_content {
  80. display: none;
  81. position: absolute;
  82. top: 20%;
  83. left: 20%;
  84. width: 50%;
  85. height: 50%;
  86. padding: 5%;
  87. border: 0px solid gray;
  88. background-color: white;
  89. z-index:1002;
  90. overflow: auto;
  91. } */
  1. documentWith = window.screen.availWidth < window.screen.availHeight ? window.screen.availWidth:window.screen.availHeight;
  2. gridContainerWidth = 0.79 * documentWith;
  3. cellSideLength = 0.16 * documentWith;
  4. cellSpace = 0.03 * documentWith;
  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.  
  16. switch(number){
  17. case 2: return "#eee4da"; break;
  18. case 4: return "#ede0c8"; break;
  19. case 8: return "#f2b179"; break;
  20. case 16: return "#f59563"; break;
  21. case 32: return "#f07c5f"; break;
  22. case 64: return "#ff5e3b"; break;
  23. case 128: return "#edcf72"; break;
  24. case 256: return "#fd0361"; break;
  25. case 512: return "#9c0"; break;
  26. case 1024: return "#33b5e5"; break;
  27. case 2048: return "#09c"; break;
  28. case 4096: return "#a6c"; break;
  29. case 8192: return "#93c"; break;
  30. case 16384: return "#888"; break;
  31. default: return "#111";break;
  32. }
  33.  
  34. return "black";
  35. }
  36.  
  37.  
  38. function getTextValue(number){
  39. switch(number){
  40. case 2: return "小白"; break;
  41. case 4: return "实习僧"; break;
  42. case 8: return "码农"; break;
  43. case 16: return "程序猿"; break;
  44. case 32: return "攻城狮"; break;
  45. case 64: return "项目经理"; break;
  46. case 128: return "部门主管"; break;
  47. case 256: return "经理秘书"; break;
  48. case 512: return "总经理"; break;
  49. case 1024: return "执行官"; break;
  50. case 2048: return "董事长"; break;
  51. case 4096: return "嘉诚女婿"; break;
  52. case 8192: return "盖茨基友"; break;
  53. case 16384: return "~神~"; break;
  54. case 16384: return "~超神~"; break;
  55. default: return "END";break;
  56. }
  57. return "black";
  58. }
  59.  
  60. function getNumberColor(number){
  61. if(number <= 4){
  62. return "#776e65";
  63. }
  64. return "white";
  65. }
  66.  
  67. function nospace(board){
  68. for(var i=0; i<4; i++){
  69. for(var j=0; j<4; j++){
  70. if(board[i][j] == 0){
  71. return false;
  72. }
  73. }
  74. }
  75. return true;
  76. }
  77.  
  78. function canMoveLeft(board){
  79. for(var i=0; i<4; i++){
  80. for(var j=1; j<4; j++){
  81. if(board[i][j] != 0){
  82. if(board[i][j-1] == 0
  83. || board[i][j-1] == board[i][j]){
  84. return true;
  85. }
  86. }
  87. }
  88. }
  89. return false;
  90. }
  91. function canMoveRight(board){
  92. for(var i=0; i<4; i++){
  93. for(var j=2; j>=0; j--){
  94. if(board[i][j] != 0){
  95. if(board[i][j+1] == 0
  96. || board[i][j+1] == board[i][j]){
  97. return true;
  98. }
  99. }
  100. }
  101. }
  102. return false;
  103. }
  104.  
  105. function canMoveUp(board){
  106. for(var j=0; j<4; j++){
  107. for(var i=1; i<4; i++){
  108. if(board[i][j] != 0){
  109. if(board[i-1][j] == 0
  110. || board[i-1][j] == board[i][j]){
  111. return true;
  112. }
  113. }
  114. }
  115. }
  116. return false;
  117. }
  118.  
  119. function canMoveDown(board){
  120. for(var j=0; j<4; j++){
  121. for(var i=2; i>=0; i--){
  122. if(board[i][j] != 0){
  123. if(board[i+1][j] == 0
  124. || board[i+1][j] == board[i][j]){
  125. return true;
  126. }
  127. }
  128. }
  129. }
  130. return false;
  131. }
  132.  
  133. function noBlockHorizontal(row, col1, col2, board){
  134. for(var i=col1+1; i<col2; i++){
  135. if(board[row][i] != 0){
  136. return false;
  137. }
  138. }
  139. return true;
  140. }
  141. function noBlockVertical(row1, row2, col, board){
  142. for(var i=row1+1; i<row2; i++){
  143. if(board[i][col] != 0){
  144. return false;
  145. }
  146. }
  147. return true;
  148. }
  149.  
  150. function noMove(board){
  151. if(canMoveDown(board)
  152. ||canMoveUp(board)
  153. ||canMoveRight(board)
  154. ||canMoveLeft(board)){
  155. return false;
  156. }
  157. return true;
  158. }
  159.  
  160. function uploadGrade(){
  161.  
  162.  
  163. }
  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(getTextValue(randNumber));
  8.  
  9. numberCell.animate({
  10. width:cellSideLength*1.2,
  11. height:cellSideLength*1.2,
  12. top:getPosTop(i, j)-cellSideLength*0.1,
  13. left:getPosLeft(i, j)-cellSideLength*0.1
  14. }, 100);
  15.  
  16. numberCell.animate({
  17. width:cellSideLength,
  18. height:cellSideLength,
  19. top:getPosTop(i, j),
  20. left:getPosLeft(i, j)
  21. }, 100);
  22. }
  23.  
  24. function showMoveAnimation(fromx, fromy, tox, toy){
  25. var numberCell = $('#number-cell-'+fromx+"-"+fromy);
  26. numberCell.animate({
  27. top:getPosTop(tox, toy),
  28. left:getPosLeft(tox, toy)
  29. }, 200);
  30. }
  31.  
  32. function updateScore(score, currentScore){
  33. $("#score").text(score);
  34. if(currentPosition < currentScore){
  35. currentPosition = currentScore;
  36. $("#position").text(getTextValue(currentPosition));
  37. }
  38. }
  1. var board = new Array();
  2. var score = 0;//分数
  3. var currentPosition = 0;//当前职位
  4. var hasConflicted = new Array();//冲突事件
  5. var isGameOverFlag = false;//是否结束
  6. var isMoving = false;//关闭操作
  7. var canScroll = true;//禁用滚屏
  8.  
  9. $(document).ready(function(){
  10. prepareForMobile();
  11. newgame();
  12. });
  13.  
  14. function prepareForMobile(){
  15. if( documentWith > 400){
  16. //documentWith = 400;
  17. gridContainerWidth = 316;
  18. cellSpace = 12;
  19. cellSideLength = 64;
  20. }
  21. $('#grid-container').css('width', gridContainerWidth - 2*cellSpace);
  22. $('#grid-container').css('height', gridContainerWidth - 2*cellSpace);
  23. $('#grid-container').css('padding', cellSpace);
  24. $('#grid-container').css('border-radius', 0.02*gridContainerWidth);
  25.  
  26. $('.grid-cell').css('width', cellSideLength);
  27. $('.grid-cell').css('height', cellSideLength);
  28. $('.grid-cell').css('border-radius', 0.02*cellSideLength);
  29. }
  30. function newgame(){
  31. isGameOverFlag = false;
  32. currentPosition = 0;
  33. score = 0;
  34. init();
  35. generateOneNumber();
  36. generateOneNumber();
  37. }
  38.  
  39. function init(){
  40. updateScore(score, 2)
  41. for(var i=0; i<4; i++){
  42. for (var j= 0; j < 4; j++) {
  43. var gridCell = $('#grid-cell-'+i+"-"+j);
  44. gridCell.css('top',getPosTop(i, j));
  45. gridCell.css('left',getPosLeft(i, j));
  46. }
  47. }
  48. for(var i=0; i<4; i++){
  49. board[i] = new Array();
  50. hasConflicted[i] = new Array();
  51. for(var j=0; j<4; j++){
  52. board[i][j] = 0;
  53. hasConflicted[i][j] = false;
  54. }
  55. }
  56. updateBoardView();
  57.  
  58.  
  59. }
  60.  
  61. function updateBoardView(){
  62. $(".number-cell").remove();
  63. for(var i=0; i<4; i++){
  64. for(var j=0; j<4; j++){
  65. $("#grid-container").append('<div class="number-cell" id="number-cell-'+i+'-'+j+'"></div>');
  66. var theNumberCell = $('#number-cell-'+i+'-'+j);
  67. if(board[i][j] == 0){
  68. theNumberCell.css('width', '0px');
  69. theNumberCell.css('height', '0px');
  70. theNumberCell.css('top', getPosTop(i, j)+cellSideLength/2);
  71. theNumberCell.css('left', getPosLeft(i, j)+cellSideLength/2);
  72. }else{
  73. theNumberCell.css('width', cellSideLength);
  74. theNumberCell.css('height', cellSideLength);
  75. theNumberCell.css('top', getPosTop(i, j));
  76. theNumberCell.css('left', getPosLeft(i, j));
  77. theNumberCell.css('background-color', getNumberBackgroundColor(board[i][j]));
  78. theNumberCell.css('color', getNumberColor(board[i][j]));
  79. theNumberCell.text(getTextValue(board[i][j]));
  80. }
  81. hasConflicted[i][j] = false;
  82. }
  83. }
  84. $('.number-cell').css('line-height', cellSideLength+'px');
  85. $('.number-cell').css('font-size', 0.2 * cellSideLength+'px');
  86. // $('.number-cell').css('text-shadow', 'none');
  87. }
  88. function generateOneNumber(){
  89. //判断是否可以继续进行
  90. if(nospace(board)){
  91. return false;
  92.  
  93. }
  94. //随机位置
  95. var randx = parseInt(Math.floor(Math.random() * 4));
  96. var randy = parseInt(Math.floor(Math.random() * 4));
  97.  
  98. var times = 0;
  99. while(times < 50){
  100. if(board[randx][randy] == 0){
  101. break;
  102. }
  103. randx = parseInt(Math.floor(Math.random() * 4));
  104. randy = parseInt(Math.floor(Math.random() * 4));
  105. times++;
  106. }
  107. if(times == 50){
  108. for(var i=0; i<4; i++){
  109. for(var j=0; j<4; j++){
  110. if(board[i][j] == 0){
  111. randx = i;
  112. randy = j;
  113.  
  114. }
  115. }
  116. }
  117. }
  118. //随机一个数字
  119. var randNumber = Math.random() < 0.5 ? 2 : 4;
  120. //显示随机数字
  121. board[randx][randy] = randNumber;
  122. updateScore(score, randNumber);
  123. //动画
  124. showNumberWithAnimation(randx, randy, randNumber);
  125. //开启操作
  126. isMoving = false;
  127. return true;
  128.  
  129. }
  130.  
  131. $(document).keydown(function(event){
  132. if(!canScroll){
  133. switch(event.keyCode){
  134. case 37:
  135. event.preventDefault();//remove按键默认效果
  136. if(!isGameOverFlag){
  137. if(!isMoving){
  138. if(moveLeft()){
  139. isMoving = true;
  140. setTimeout("generateOneNumber()", 210);
  141. setTimeout("isGameOver()", 300);
  142. }
  143. }
  144.  
  145. }else{
  146. gameOver();
  147. }
  148.  
  149. break;
  150. case 38:
  151. event.preventDefault();//remove按键默认效果
  152. if(!isGameOverFlag){
  153. if(!isMoving){
  154. if(moveUp()){
  155. isMoving = true;//关闭操作
  156. setTimeout("generateOneNumber()", 210);
  157. setTimeout("isGameOver()", 300);
  158. }
  159. }
  160. }else{
  161. gameOver();
  162. }
  163. break;
  164. case 39:
  165. event.preventDefault();//remove按键默认效果
  166. if(!isGameOverFlag){
  167. if(!isMoving){
  168. if(moveRight()){
  169. isMoving = true;
  170. setTimeout("generateOneNumber()", 210);
  171. setTimeout("isGameOver()", 300);
  172. }
  173. }
  174. }else{
  175. gameOver();
  176. }
  177. break;
  178. case 40:
  179. event.preventDefault();//remove按键默认效果
  180. if(!isGameOverFlag){
  181. if(!isMoving){
  182. if(moveDown()){
  183. isMoving = true;
  184. setTimeout("generateOneNumber()", 210);
  185. setTimeout("isGameOver()", 300);
  186. }
  187. }
  188. }else{
  189. gameOver();
  190. }
  191. break;
  192. default:
  193. break;
  194. }
  195. }
  196.  
  197. })
  198.  
  199. document.addEventListener('touchstart',function(event){
  200. startx = event.touches[0].pageX;
  201. starty = event.touches[0].pageY;
  202. });
  203. document.addEventListener('touchmove',function(event){
  204. if(!canScroll){
  205. event.preventDefault();//remove按键默认效果
  206. }
  207. });
  208.  
  209.  
  210. document.addEventListener('touchend',function(event){
  211. endx = event.changedTouches[0].pageX;
  212. endy = event.changedTouches[0].pageY;
  213.  
  214. var deltax = endx - startx;
  215. var deltay = endy - starty;
  216. var moveLength = 0.05*documentWith;
  217. if(moveLength > 30){
  218. moveLength = 30;
  219. }
  220. if(Math.abs(deltax)<moveLength && Math.abs(deltay)<moveLength){
  221. return;
  222. }
  223. if(!canScroll){
  224. if(Math.abs(deltax) >= Math.abs(deltay)){
  225. if(deltax > 0){
  226. if(!isGameOverFlag){
  227. if(!isMoving){
  228. if(moveRight()){
  229. isMoving = true;
  230. setTimeout("generateOneNumber()", 210);
  231. setTimeout("isGameOver()", 550);
  232. }
  233. }
  234. }else{
  235. gameOver();
  236. }
  237. }else{
  238. if(!isGameOverFlag){
  239. if(!isMoving){
  240. if(moveLeft()){
  241. isMoving = true;
  242. setTimeout("generateOneNumber()", 210);
  243. setTimeout("isGameOver()", 550);
  244. }
  245. }
  246. }else{
  247. gameOver();
  248. }
  249. }
  250. }else{
  251. if(deltay > 0){
  252. if(!isGameOverFlag){
  253. if(!isMoving){
  254. if(moveDown()){
  255. isMoving = true;
  256. setTimeout("generateOneNumber()", 210);
  257. setTimeout("isGameOver()", 550);
  258. }
  259. }
  260. }else{
  261. gameOver();
  262. }
  263. }else{
  264. if(!isGameOverFlag){
  265. if(!isMoving){
  266. if(moveUp()){
  267. isMoving = true;
  268. setTimeout("generateOneNumber()", 210);
  269. setTimeout("isGameOver()", 550);
  270. }
  271. }
  272. }else{
  273. gameOver();
  274. }
  275. }
  276. }
  277. }
  278.  
  279. });
  280.  
  281.  
  282. function isGameOver(){
  283. if(nospace(board) && noMove(board)){
  284. gameOver();
  285. }
  286.  
  287. }
  288. function gameOver(){
  289. isGameOverFlag = true;
  290. alert("老板说不给你涨了!\n换个公司重新来过吧!");
  291. }
  292.  
  293. function moveLeft(){
  294. if(!canMoveLeft(board)){
  295. return false;
  296. }
  297. for(var i=0; i<4; i++){
  298. for(var j=1; j<4; j++){
  299. if(board[i][j] != 0){
  300. for(var k=0; k<j; k++){
  301. if(board[i][k] == 0 && noBlockHorizontal(i,k,j,board)){
  302. showMoveAnimation(i, j, i, k);
  303. board[i][k] = board[i][j];
  304. board[i][j] = 0;
  305. continue;
  306. }else if(board[i][k] == board[i][j] && noBlockHorizontal(i,k,j,board)&& !hasConflicted[i][k]){
  307. showMoveAnimation(i, j, i, k);
  308. board[i][k] += board[i][j];
  309. board[i][j] = 0;
  310. score+=board[i][k];
  311. updateScore(score, board[i][k]);
  312. hasConflicted[i][k] = true;
  313. continue;
  314. }
  315. }
  316. }
  317. }
  318. }
  319. setTimeout("updateBoardView()", 200);
  320. return true;
  321. }
  322.  
  323. function moveRight(){
  324. if(!canMoveRight(board)){
  325. return false;
  326. }
  327. for(var i=0; i<4; i++){
  328. for(var j=2; j>=0; j--){
  329. if(board[i][j] != 0){
  330. for(var k=3; k>j; k--){
  331. if(board[i][k] == 0 && noBlockHorizontal(i,j,k,board)){
  332. showMoveAnimation(i, j, i, k);
  333. board[i][k] = board[i][j];
  334. board[i][j] = 0;
  335. continue;
  336. }else if(board[i][k] == board[i][j] && noBlockHorizontal(i,j,k,board) && !hasConflicted[i][k]){
  337. showMoveAnimation(i, j, i, k);
  338. board[i][k] += board[i][j];
  339. board[i][j] = 0;
  340. score+=board[i][k];
  341. updateScore(score, board[i][k]);
  342. hasConflicted[i][k] = true;
  343. continue;
  344. }
  345. }
  346. }
  347. }
  348. }
  349. setTimeout("updateBoardView()", 200);
  350. return true;
  351. }
  352.  
  353. function moveUp(){
  354. if(!canMoveUp(board)){
  355. return false;
  356. }
  357. for(var j=0; j<4; j++){
  358. for(var i=1; i<4; i++){
  359. if(board[i][j] != 0){
  360. for(var k=0; k<i; k++){
  361. if(board[k][j] == 0 && noBlockVertical(k,i,j,board)){
  362. showMoveAnimation(i, j, k, j);
  363. board[k][j] = board[i][j];
  364. board[i][j] = 0;
  365. continue;
  366. }else if(board[k][j] == board[i][j] && noBlockVertical(k,i,j,board)&& !hasConflicted[k][j]){
  367. showMoveAnimation(i, j, k, j);
  368. board[k][j] += board[i][j];
  369. board[i][j] = 0;
  370. score+=board[k][j];
  371. updateScore(score, board[k][j]);
  372. hasConflicted[k][j] = true;
  373. continue;
  374. }
  375. }
  376. }
  377. }
  378. }
  379. setTimeout("updateBoardView()", 200);
  380. return true;
  381. }
  382.  
  383. function moveDown(){
  384. if(!canMoveDown(board)){
  385. return false;
  386. }
  387. for(var j=0; j<4; j++){
  388. for(var i=2; i>=0; i--){
  389. if(board[i][j] != 0){
  390. for(var k=3; k>i; k--){
  391. if(board[k][j] == 0 && noBlockVertical(i,k,j,board)){
  392. showMoveAnimation(i, j, k, j);
  393. board[k][j] = board[i][j];
  394. board[i][j] = 0;
  395. continue;
  396. }else if(board[k][j] == board[i][j] && noBlockVertical(i,k,j,board)&& !hasConflicted[k][j]){
  397. showMoveAnimation(i, j, k, j);
  398. board[k][j] += board[i][j];
  399. board[i][j] = 0;
  400. score+=board[k][j];
  401. updateScore(score, board[k][j]);
  402. hasConflicted[k][j] = true;
  403. continue;
  404. }
  405. }
  406. }
  407. }
  408. }
  409. setTimeout("updateBoardView()", 200);
  410. return true;
  411. }
下一节