main.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. /**
  2. * @Description:main,js
  3. * @Author:LCore
  4. */
  5. //4*4格子
  6. var board = new Array();
  7. var score = 0;
  8. var topScore = 0;
  9. var hasConflicted = new Array();
  10. var direction = {
  11. left: 1,
  12. up: 2,
  13. down: 3,
  14. right: 4
  15. };
  16. $(function () {
  17. prepareForMobile(); //为移动端
  18. newGame();
  19. });
  20. function prepareForMobile() {
  21. if (documentWidth > 500) {
  22. //web端
  23. gridContainerWidth = 500;
  24. cellSpace = 20;
  25. cellSideLength = 100;
  26. headerWidth = 500;
  27. }
  28. $('#grid-container').css('width', gridContainerWidth - 2 * cellSpace);
  29. $('#grid-container').css('height', gridContainerWidth - 2 * cellSpace);
  30. $('#grid-container').css('padding', cellSpace);
  31. $('#grid-container').css('border-radius', 0.02 * gridContainerWidth);
  32. $('.grid-cell').css('width', cellSideLength);
  33. $('.grid-cell').css('height', cellSideLength);
  34. $('.grid-cell').css('border-radius', 0.02 * cellSideLength);
  35. //设置头部
  36. // alert(headerWidth);
  37. headerWidth = headerWidth * 0.92;
  38. $('.header').css('width', headerWidth);
  39. $('#newGame').css('width', headerWidth * 0.20 + 'px');
  40. $('#topScore').css('width', headerWidth * 0.40 * 0.90 + 'px');
  41. }
  42. function newGame() {
  43. //初始化棋盘格
  44. init();
  45. //在随机两个格子生成数字
  46. generateOneNumber();
  47. generateOneNumber();
  48. updateBoardView();
  49. score = 0;
  50. $("#score").text(0);
  51. }
  52. function init() {
  53. for (var i = 0; i < 4; i++) {
  54. for (var j = 0; j < 4; j++) {
  55. var gridCell = $("#grid-cell-" + i + j);
  56. gridCell.css("top", getPostionTop(i, j));
  57. gridCell.css("left", getPostionLeft(i, j));
  58. }
  59. }
  60. //初始化棋盘
  61. for (var i = 0; i < 4; i++) {
  62. board[i] = new Array();
  63. hasConflicted[i] = new Array();
  64. for (var j = 0; j < 4; j++) {
  65. board[i][j] = 0;
  66. hasConflicted[i][j] = false;
  67. }
  68. }
  69. // console.log(board);
  70. //更新面板
  71. updateBoardView();
  72. }
  73. function updateBoardView() {
  74. $(".number-cell").remove(); //更新之前先删除元素
  75. for (var i = 0; i < 4; i++) {
  76. for (var j = 0; j < 4; j++) {
  77. //重新生成16个number-cell,并添加到容器中
  78. $("#grid-container").append('<div class="number-cell" id="number-cell-' + i + j + '"></div>');
  79. var numberCell = $("#number-cell-" + i + j);
  80. if (board[i][j] == 0) {
  81. //设置居中且"不可见"
  82. numberCell.css({
  83. "width": "0px",
  84. "height": "0px",
  85. "top": getPostionTop(i, j) + cellSideLength / 2,
  86. "left": getPostionLeft(i, j) + cellSideLength / 2
  87. });
  88. } else {
  89. numberCell.css({
  90. "width": cellSideLength,
  91. "height": cellSideLength,
  92. "top": getPostionTop(i, j),
  93. "left": getPostionLeft(i, j)
  94. });
  95. //根据数字颜色设置器背景色
  96. numberCell.css("background-color", getBackgroundColorByNum(board[i][j]));
  97. //设置前景是
  98. numberCell.css("color", getPreColorByNum(board[i][j]));
  99. //显示数字
  100. numberCell.text(getShowTextByNum(board[i][j]));
  101. hasConflicted[i][j] = false;
  102. }
  103. }
  104. }
  105. $('.number-cell').css('line-height', cellSideLength + 'px');
  106. // $('.number-cell').css('font-size',0.6*cellSideLength+'px');
  107. $('.number-cell').css('font-size', 0.2 * cellSideLength + 'px');
  108. }
  109. function generateOneNumber() {
  110. if (isNoSpace(board)) {
  111. return false;
  112. }
  113. //随机一个位置
  114. var randx = parseInt(Math.floor(Math.random() * 4));
  115. var randy = parseInt(Math.floor(Math.random() * 4));
  116. //判断生成的坐标是否合理(若果该坐标存在了值,即不合理)
  117. while (true) {
  118. if (board[randx][randy] === 0)
  119. break;
  120. //继续生成随机一个位置
  121. randx = parseInt(Math.floor(Math.random() * 4));
  122. randy = parseInt(Math.floor(Math.random() * 4));
  123. }
  124. //随机一个数字
  125. var randNum = Math.random() < 0.5 ? 2 : 4;
  126. board[randx][randy] = randNum;
  127. showNumberWithAnimation(randx, randy, randNum);
  128. return true;
  129. }
  130. //按键处理
  131. $(document).keydown(function (event) {
  132. switch (event.keyCode) {
  133. case 37: //left
  134. if (moveLeft()) {
  135. setTimeout("generateOneNumber()", 210);
  136. setTimeout("isGameOver()", 300);
  137. }
  138. break;
  139. case 38: //up
  140. if (moveUp()) {
  141. setTimeout("generateOneNumber()", 210);
  142. setTimeout("isGameOver()", 300);
  143. }
  144. break;
  145. case 39: //right
  146. if (moveRight()) {
  147. setTimeout("generateOneNumber()", 210);
  148. setTimeout("isGameOver()", 300);
  149. }
  150. break;
  151. case 40: //down
  152. if (moveDown()) {
  153. setTimeout("generateOneNumber()", 210);
  154. setTimeout("isGameOver()", 300);
  155. }
  156. break;
  157. default:
  158. break;
  159. }
  160. });
  161. function moveLeft() {
  162. if (!canMove(board, direction.left))
  163. return false;
  164. //左移
  165. for (var i = 0; i < 4; i++) {
  166. for (var j = 1; j < 4; j++) {
  167. if (board[i][j] !== 0) {
  168. for (var k = 0; k < j; k++)
  169. //可以一次移动多个格子
  170. if (board[i][k] == 0 && noBlockHorizontal(i, k, j, board)) {
  171. //move
  172. showMoveAnimation(i, j, i, k);
  173. board[i][k] = board[i][j];
  174. board[i][j] = 0;
  175. continue;
  176. } else if (board[i][k] == board[i][j] && noBlockHorizontal(i, k, j, board) && !hasConflicted[i][k]) {
  177. //move
  178. showMoveAnimation(i, j, i, k);
  179. //add
  180. board[i][k] += board[i][j];
  181. board[i][j] = 0;
  182. var element = $("#grid-cell-" + i + k);
  183. anp(element, board[i][k])
  184. score += board[i][k];
  185. updateScore(score);
  186. updateTopScore(score);
  187. continue;
  188. }
  189. }
  190. }
  191. }
  192. setTimeout('updateBoardView()', 200); //等待200在执行更新面板操作,避免动画效果被冲掉
  193. return true
  194. }
  195. function moveRight() {
  196. if (!canMove(board, direction.right))
  197. return false;
  198. //右移
  199. for (var i = 3; i >= 0; i--) {
  200. for (var j = 2; j >= 0; j--) {
  201. //该位置不等于0即可进行移动
  202. if (board[i][j] != 0)
  203. for (var k = 3; k > j; k--) {
  204. //如果可以一次移动多个格子
  205. if (board[i][k] == 0 && noBlockHorizontal(i, j, k, board)) {
  206. //move
  207. showMoveAnimation(i, j, i, k);
  208. board[i][k] = board[i][j];
  209. board[i][j] = 0;
  210. continue;
  211. } else if (board[i][k] == board[i][j] && noBlockHorizontal(i, j, k, board) && !hasConflicted[i][k]) {
  212. //move
  213. showMoveAnimation(i, j, i, k);
  214. //add
  215. board[i][k] += board[i][j];
  216. board[i][j] = 0;
  217. score += board[i][k];
  218. var element = $("#grid-cell-" + i + k);
  219. anp(element, board[i][k])
  220. updateScore(score);
  221. updateTopScore(score);
  222. continue;
  223. }
  224. }
  225. }
  226. }
  227. setTimeout('updateBoardView()', 200); //等待200在执行更新面板操作,避免动画效果被冲掉
  228. return true
  229. }
  230. function isGameOver() {
  231. if (isNoSpace(board) && !cavMoveAll(board)) {
  232. gameOver();
  233. }
  234. }
  235. function gameOver() {
  236. alert("游戏结束!");
  237. }
  238. /**
  239. 先判断第一列*/
  240. function moveUp() {
  241. if (!canMove(board, direction.up))
  242. return false;
  243. for (var i = 0; i < 4; i++) {
  244. for (var j = 1; j < 4; j++) {
  245. //该位置不为0即可进行移动
  246. if (board[j][i] != 0) {
  247. for (var k = 0; k < j; k++) {
  248. if (board[k][i] == 0 && noBlockVectal(i, k, j, board)) {
  249. //move
  250. showMoveAnimation(j, i, k, i);
  251. board[k][i] = board[j][i];
  252. board[j][i] = 0;
  253. continue;
  254. } else if (board[k][i] == board[j][i] && noBlockVectal(i, k, j, board) && !hasConflicted[k][i]) {
  255. //move
  256. showMoveAnimation(j, i, k, i);
  257. board[k][i] += board[j][i];
  258. board[j][i] = 0;
  259. score += board[k][i];
  260. var element = $("#grid-cell-" + k + i);
  261. anp(element, board[k][i])
  262. updateScore(score);
  263. updateTopScore(score);
  264. continue;
  265. }
  266. }
  267. }
  268. }
  269. }
  270. setTimeout('updateBoardView()', 200); //等待200在执行更新面板操作,避免动画效果被冲掉
  271. return true
  272. }
  273. /**
  274. 先判断第一列*/
  275. function moveDown() {
  276. if (!canMove(board, direction.down))
  277. return false;
  278. for (var i = 3; i >= 0; i--) {
  279. for (var j = 2; j >= 0; j--) {
  280. //该位置不为0即可进行移动
  281. if (board[j][i] != 0) {
  282. for (var k = 3; k > j; k--) {
  283. if (board[k][i] == 0 && noBlockVectal(i, j, k, board)) {
  284. //move
  285. showMoveAnimation(j, i, k, i);
  286. board[k][i] = board[j][i];
  287. board[j][i] = 0;
  288. continue;
  289. } else if (board[k][i] == board[j][i] && noBlockVectal(i, j, k, board) && !hasConflicted[k][i]) {
  290. //move
  291. showMoveAnimation(j, i, k, i);
  292. board[k][i] += board[j][i];
  293. board[j][i] = 0;
  294. score += board[k][i];
  295. var element = $("#grid-cell-" + k + i);
  296. anp(element, board[k][i])
  297. updateScore(score);
  298. updateTopScore(score);
  299. continue;
  300. }
  301. }
  302. }
  303. }
  304. }
  305. setTimeout('updateBoardView()', 200); //等待200在执行更新面板操作,避免动画效果被冲掉
  306. return true
  307. }
  308. /**
  309. * 滑动处理 1, 左滑; 2, 上滑, 3, 右滑; 4, 下滑
  310. */
  311. function slideDirection(numm) {
  312. switch (numm) {
  313. case 1: //left
  314. if (moveLeft()) {
  315. setTimeout("generateOneNumber()", 210);
  316. setTimeout("isGameOver()", 300);
  317. }
  318. break;
  319. case 2: //up
  320. if (moveUp()) {
  321. setTimeout("generateOneNumber()", 210);
  322. setTimeout("isGameOver()", 300);
  323. }
  324. break;
  325. case 3: //right
  326. if (moveRight()) {
  327. setTimeout("generateOneNumber()", 210);
  328. setTimeout("isGameOver()", 300);
  329. }
  330. break;
  331. case 4: //down
  332. if (moveDown()) {
  333. setTimeout("generateOneNumber()", 210);
  334. setTimeout("isGameOver()", 300);
  335. }
  336. break;
  337. default:
  338. break;
  339. }
  340. }
  341. /**
  342. *
  343. * 更新最高分数
  344. */
  345. function updateTopScore(score) {
  346. if (topScore<score) {
  347. $("#top_score").text(score);
  348. topScore = score;
  349. } else {
  350. $("#top_score").text(topScore);
  351. }
  352. }