shake.js
上传用户:pzy1211
上传日期:2022-04-09
资源大小:23k
文件大小:7k
源码类别:

其他智力游戏

开发平台:

JavaScript

  1. // JavaScript Document
  2. var gridSize = 8; //定义小方块的宽度和高度
  3. var borderWidth = 20; //定义每行的方块数
  4. var borderHeight = 12; //定义每列的方块数
  5. var browserSize = ADS.getBrowserWindowSize();
  6. var sWidth = browserSize.width; //浏览器窗口区域宽度
  7. var sHeight = browserSize.height; //浏览器窗口区域高度
  8. var start = 0; //设置标志位
  9. var moveSpeed = 200; //设置贪吃蛇的速度
  10. var squareNumber = 0; //设置吃掉的小方块数
  11. //创建限制区域
  12. function createLimitedArea()
  13. {
  14. var borderEle = document.getElementById('border'); //获得对限制区域DIV的控制
  15. borderEle.style.width = gridSize*borderWidth + 'px';
  16. borderEle.style.height = gridSize*borderHeight + 'px';
  17. borderEle.style.border = '1px solid #000';
  18. borderEle.style.position = 'absolute';
  19. //设置限制区域在浏览器窗口水平垂直位置居中
  20. borderEle.style.left = parseInt((sWidth - gridSize*borderWidth)/2) +'px'; 
  21. borderEle.style.top = parseInt((sHeight - gridSize*borderHeight)/2) + 'px';
  22. limitedArea = new Array();
  23. for(var x=0;x<borderWidth;x++)
  24. {
  25. limitedArea[x] = new Array();
  26. for(var y = 0; y<borderHeight;y++)
  27. {
  28. limitedArea[x][y] = '0'; //设置限制区域的每个像素都为空
  29. }
  30. }
  31. snakeXL = parseInt(Math.random()*borderWidth); //随机产生一个介于0到borderWidth之间的数
  32. snakeYL = parseInt(Math.random()*borderHeight); //随机产生一个介于0到borderHeight之间的数
  33. square(); //创建小方块
  34. snake(); //创建贪吃蛇
  35. snakeTag = borderEle.getElementsByTagName('DIV');
  36. squareTag = borderEle.getElementsByTagName('SPAN');
  37. }
  38. //创建小方块
  39. function square()
  40. {
  41. var sXL = parseInt(Math.random()*borderWidth); //随机产生一个介于0到borderWidth之间的数
  42. var sYL = parseInt(Math.random()*borderHeight); //随机产生一个介于0到borderHeight之间的数
  43. if(limitedArea[sXL][sYL] == '0') //假如限制区域中为空的话创建小方块
  44. {
  45. var squareArea = document.createElement('SPAN'); //创建一个小方块
  46. var borderEle = document.getElementById('border'); //获得对限制区域DIV的控制
  47. squareArea.style.width = gridSize + 'px';
  48. squareArea.style.height = gridSize + 'px';
  49. squareArea.style.overflow = 'hidden'; //为了在IE中显示小于最小高度值,必须将溢出设置为隐藏
  50. squareArea.style.background = '#76b900';
  51. squareArea.style.position = 'absolute';
  52. squareArea.style.left = gridSize*sXL + 'px';
  53. squareArea.style.top = gridSize*sYL + 'px';
  54. borderEle.appendChild(squareArea); //将小方块加入到限制区域中
  55. limitedArea[sXL][sYL] = 'square'; //将当前区域设置为存在小方块
  56. }
  57. else //如果当前区域存在蛇或者小方块则重新调用square()方法,直至创建小方块为止
  58. {
  59. square();
  60. }
  61. }
  62. //创建贪吃蛇
  63. function snake()
  64. {
  65. var snakeArea = document.createElement('DIV'); //创建贪吃蛇
  66. var borderEle = document.getElementById('border'); //获得对限制区域DIV的控制
  67. snakeArea.setAttribute('x',snakeXL);
  68. snakeArea.setAttribute('y',snakeYL);
  69. snakeArea.style.width = gridSize + 'px';
  70. snakeArea.style.height = gridSize + 'px';
  71. snakeArea.style.overflow = 'hidden'; //为了在IE中显示小于最小高度值,必须将溢出设置为隐藏
  72. snakeArea.style.background = '#FF6700';
  73. snakeArea.style.position = 'absolute';
  74. snakeArea.style.left = gridSize*snakeXL + 'px';
  75. snakeArea.style.top = gridSize*snakeYL + 'px';
  76. borderEle.appendChild(snakeArea); //将贪吃蛇加入到限制区域中
  77. limitedArea[snakeXL][snakeYL] = 'snake'; //将当前区域设置为存在贪吃蛇
  78. }
  79. //控制贪吃蛇的方向
  80. function keyDown(W3CEvent)
  81. {
  82. var eventEle = ADS.getEventObject(W3CEvent);
  83. var keycode = eventEle.keyCode;
  84. switch (keycode)
  85. {
  86. case 37: //向左
  87. direction(-1,0);
  88. break;
  89. case 38: //向上
  90. direction(0,-1);
  91. break;
  92. case 39: //向右
  93. direction(1,0);
  94. break;
  95. case 40: //向下
  96. direction(0,1);
  97. break;
  98. }
  99. return false;
  100. }
  101. //方向控制
  102. function direction(x,y)
  103. {
  104. goX = x;
  105. goY = y;
  106. if(start == 0 ) //假如标志位为0时,蛇开始移动
  107. {
  108. start = 1; //蛇移动就置标志位为1
  109. snakeMove();
  110. }
  111. }
  112. //控制蛇的移动
  113. function snakeMove()
  114. {
  115. snakeXL += goX; //snakeXL加上根据键盘的移动获取的当前一次X方向位移量
  116. snakeYL += goY; //snakeYL加上根据键盘的移动获取的当前一次Y方向位移量
  117. if(snakeXL < 0 || snakeXL > borderWidth || snakeYL < 0 || snakeYL > borderHeight )
  118. {
  119. restart(); //假如蛇跑到边界外面则重新游戏
  120. }
  121. else
  122. {
  123. snakefront = limitedArea[snakeXL][snakeYL]; //获取当前位置限制区的状态
  124. if(snakefront == '0') //假如限制区的状态为空时调用snakeMove_empty()
  125. {
  126. snakeMove_empty();
  127. }
  128. else
  129. {
  130. if(snakefront == 'square') //假如限制区的状态为空时调用snakeMove_square()
  131. {
  132. snakeMove_square();
  133. eatSquare();
  134. }
  135. else //否则重新游戏,即撞到自身
  136. {
  137. restart();
  138. }
  139. }
  140. }
  141. }
  142. //假如蛇前面没有东西时蛇的运动
  143. function snakeMove_empty()
  144. {
  145. limitedArea[snakeTag[0].getAttribute('x')][snakeTag[0].getAttribute('y')] = '0'; //清空当前限制区的标志,置为0,即空地
  146. var borderEle = document.getElementById('border'); //获得对限制区域DIV的控制
  147. borderEle.removeChild(snakeTag[0]); //移除蛇的最后一节
  148. snake(); //在新位置新建一节蛇,以实现蛇的向前移动
  149. setTimeout('snakeMove()',moveSpeed);
  150. }
  151. //假如蛇前面是小方块时蛇的运动
  152. function snakeMove_square()
  153. {
  154. snake(); //前面是方块时在方块位置新建一节蛇
  155. var borderEle = document.getElementById('border'); //获得对限制区域DIV的控制
  156. borderEle.removeChild(squareTag[0]); //移除小方块
  157. square(); //重建一个小方块
  158. setTimeout('snakeMove()',moveSpeed);
  159. }
  160. //重新开始游戏
  161. function restart()
  162. {
  163. restart = confirm('游戏结束,共吃掉了' + squareNumber + '个小方块' + ',重新开始游戏?');
  164. if(restart)
  165. {
  166. window.location.reload(); //刷新页面,重新开始游戏
  167. }
  168. }
  169. //计算吃掉的小方块
  170. function eatSquare()
  171. {
  172. squareNumber ++; //每吃掉一个小方块吃掉的小方块数加一
  173. var sn = document.getElementById('sn');
  174. sn.style.width = gridSize*borderWidth + 2 + 'px';
  175. sn.style.height = '30px';
  176. sn.style.lineHeight = '30px';
  177. sn.style.position = 'absolute';
  178. snWidth = parseInt(sn.style.width);
  179. snHeight = parseInt(sn.style.height);
  180. //显示标记水平垂直居中
  181. sn.style.left = parseInt((sWidth-snWidth)/2) + 1 + 'px';
  182. sn.style.top = parseInt((sHeight + gridSize*borderHeight)/2 + 1) + 'px';
  183. sn.innerHTML = '吃掉' + squareNumber + '个方块';
  184. }
  185. ADS.addEvent(window,'load',createLimitedArea); //文档载入时加载createLimitedArea函数
  186. ADS.addEvent(document,'keydown',keyDown); //键盘在文档上按下时加载keyDown函数