当前位置:   article > 正文

JS实现的贪吃蛇游戏完整实例_基于js的贪吃蛇小游戏

基于js的贪吃蛇小游戏

这篇文章主要介绍了JS实现的贪吃蛇游戏,结合完整实例形式分析了javascript实现贪吃蛇游戏的具体步骤、原理与相关操作技巧,需要的朋友可以参考下

本文实例讲述了JS实现的贪吃蛇游戏。分享给大家供大家参考,具体如下:

思想:

1、设计蛇:属性有宽、高、方向、状态(有多少节),方法:显示,跑

2、设计食物:属性宽、高

3、显示蛇:根据状态向地图里加元素

4、蛇跑起来:下一节到前一节的位置,蛇头根据方向变,删除原来的蛇,新建蛇;当出界时,死亡,初始化;当蛇头吃到自己的时候,死亡,初始化

5、食物被吃掉,蛇加一节,去掉原来的食物,生成新的食物

6、添加定时器,绑定按键

完整示例:

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport"
  6. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  7. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8. <title>Document</title>
  9. <style type="text/css">
  10. body {
  11. margin: 0;
  12. padding: 0;
  13. }
  14. .main {
  15. width: 800px;
  16. height: 400px;
  17. margin: 50px auto;
  18. }
  19. .btn {
  20. width: 100px;
  21. height: 40px;
  22. }
  23. .map {
  24. position: relative;
  25. width: 800px;
  26. height: 400px;
  27. background: #ccc;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div class="main">
  33. <button class="btn" id="begin">开始游戏</button>
  34. <div class="map" id="map"></div>
  35. <script type="text/javascript">
  36. var map = document.getElementById('map');
  37. // 使用构造方法创建蛇,
  38. function Snake()
  39. {
  40. // 设置蛇的宽、高、默认走的方向
  41. this.width = 10;
  42. this.height = 10;
  43. this.direction = 'right';
  44. // 记住蛇的状态,当吃完食物的时候,就要加一个,初始为3个小点为一个蛇,
  45. this.body = [
  46. {x:2, y:0}, // 蛇头,第一个点
  47. {x:1, y:0}, // 蛇脖子,第二个点
  48. {x:0, y:0} // 蛇尾,第三个点
  49. ];
  50. // 显示蛇
  51. this.display = function() {
  52. // 创建蛇
  53. for (var i=0; i<this.body.length; i++) {
  54. if (this.body[i].x != null) { // 当吃到食物时,x==null,不能新建,不然会在00处新建一个
  55. var s = document.createElement('div');
  56. // 将节点保存到状态中,以便于后面删除
  57. this.body[i].flag = s;
  58. // 设置宽高
  59. s.style.width = this.width + 'px';
  60. s.style.height = this.height + 'px';
  61. s.style.borderRadius = "50%";
  62. s.style.background = "rgb(" + Math.floor(Math.random()*256) + "," + Math.floor(Math.random()*256) + "," + Math.floor(Math.random()*256) + ")";
  63. // 设置位置
  64. s.style.position = 'absolute';
  65. s.style.left = this.body[i].x * this.width + 'px';
  66. s.style.top = this.body[i].y * this.height + 'px';
  67. // 添加进去
  68. map.appendChild(s);
  69. }
  70. }
  71. };
  72. // 让蛇跑起来,后一个元素到前一个元素的位置
  73. // 蛇头根据方向处理,所以i不能等于0
  74. this.run = function() {
  75. // 后一个元素到前一个元素的位置
  76. for (var i=this.body.length-1; i>0; i--) {
  77. this.body[i].x = this.body[i-1].x;
  78. this.body[i].y = this.body[i-1].y;
  79. }
  80. // 根据方向处理蛇头
  81. switch(this.direction)
  82. {
  83. case "left":
  84. this.body[0].x -= 1;
  85. break;
  86. case "right":
  87. this.body[0].x += 1;
  88. break;
  89. case "up":
  90. this.body[0].y -= 1;
  91. break;
  92. case "down":
  93. this.body[0].y += 1;
  94. break;
  95. }
  96. // 判断是否出界,一蛇头判断,出界的话,
  97. if (this.body[0].x < 0 || this.body[0].x > 79 || this.body[0].y < 0 || this.body[0].y > 39) {
  98. clearInterval(timer); // 清除定时器,
  99. alert("你瞎吗?撞死了!");
  100. // 删除旧的
  101. for (var i=0; i<this.body.length; i++) {
  102. if (this.body[i].flag != null) { // 如果刚吃完就死掉,会加一个值为null
  103. map.removeChild(this.body[i].flag);
  104. }
  105. }
  106. this.body = [ // 回到初始状态,
  107. {x:2, y:0},
  108. {x:1, y:0},
  109. {x:0, y:0}
  110. ];
  111. this.direction = 'right';
  112. this.display(); // 显示初始状态
  113. return false; // 结束
  114. }
  115. // 判断蛇头吃到食物,xy坐标重合,
  116. if (this.body[0].x == food.x && this.body[0].y == food.y) {
  117. // 蛇加一节,因为根据最后节点定,下面display时,会自动赋值的
  118. this.body.push({x:null, y:null, flag: null});
  119. // 清除食物,重新生成食物
  120. map.removeChild(food.flag);
  121. food.display();
  122. }
  123. // 吃到自己死亡,从第五个开始与头判断,因为前四个永远撞不到
  124. for (var i=4; i<this.body.length; i++) {
  125. if (this.body[0].x == this.body[i].x && this.body[0].y == this.body[i].y) {
  126. clearInterval(timer); // 清除定时器,
  127. alert("傻子!你怎么能吃自己呢?");
  128. // 删除旧的
  129. for (var i=0; i<this.body.length; i++) {
  130. if (this.body[i].flag != null) { // 如果刚吃完就死掉,会加一个值为null
  131. map.removeChild(this.body[i].flag);
  132. }
  133. }
  134. this.body = [ // 回到初始状态,
  135. {x:2, y:0},
  136. {x:1, y:0},
  137. {x:0, y:0}
  138. ];
  139. this.direction = 'right';
  140. this.display(); // 显示初始状态
  141. return false; // 结束
  142. }
  143. }
  144. // 先删掉初始的蛇,在显示新蛇
  145. for (var i=0; i<this.body.length; i++) {
  146. if (this.body[i].flag != null) { // 当吃到食物时,flag是等于null,且不能删除
  147. map.removeChild(this.body[i].flag);
  148. }
  149. }
  150. // 重新显示蛇
  151. this.display();
  152. }
  153. }
  154. // 构造食物
  155. function Food()
  156. {
  157. this.width = 10;
  158. this.height = 10;
  159. this.display = function() {
  160. var f = document.createElement('div');
  161. this.flag = f;
  162. f.style.width = this.width + 'px';
  163. f.style.height = this.height + 'px';
  164. f.style.background = 'red';
  165. f.style.borderRadius = '50%';
  166. f.style.position = 'absolute';
  167. this.x = Math.floor(Math.random()*80);
  168. this.y = Math.floor(Math.random()*40);
  169. f.style.left = this.x * this.width + 'px';
  170. f.style.top = this.y * this.height + 'px';
  171. map.appendChild(f);
  172. }
  173. }
  174. var snake = new Snake();
  175. var food = new Food();
  176. snake.display(); // 初始化显示
  177. food.display();
  178. // 给body加按键事件,上下左右
  179. document.body.onkeydown = function(e) {
  180. // 有事件对象就用事件对象,没有就自己创建一个,兼容低版本浏览器
  181. var ev = e || window.event;
  182. switch(ev.keyCode)
  183. {
  184. case 38:
  185. if (snake.direction != 'down') { // 不允许返回,向上的时候不能向下
  186. snake.direction = "up";
  187. }
  188. break;
  189. case 40:
  190. if (snake.direction != "up") {
  191. snake.direction = "down";
  192. }
  193. break;
  194. case 37:
  195. if (snake.direction != "right") {
  196. snake.direction = "left";
  197. }
  198. break;
  199. case 39:
  200. if (snake.direction != "left") {
  201. snake.direction = "right";
  202. }
  203. break;
  204. }
  205. };
  206. // 点击开始时,动起来
  207. var begin = document.getElementById('begin');
  208. var timer;
  209. begin.onclick = function() {
  210. clearInterval(timer);
  211. // timer = setInterval(snake.run(), 500); // 先执行run函数,把执行得到的结果,每500毫秒执行一次,不会在执行内部代码
  212. timer = setInterval("snake.run()", 500); // 小技巧,每500毫秒执行字符串,字符串执行内部代码
  213. };
  214. </script>
  215. </div>
  216. </body>
  217. </html>

使用在线HTML/CSS/JavaScript代码运行工具http://tools.jb51.net/code/HtmlJsRun测试上述代码,可得到如下运行效果:希望本文所述对大家JavaScript程序设计有所帮助。

希望本文所述对大家JavaScript程序设计有所帮助。 谢谢

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/1001530
推荐阅读
相关标签
  

闽ICP备14008679号