当前位置:   article > 正文

小游戏——原生JS写贪吃蛇玩玩(超详细代码)_js+画布写一个贪吃蛇小游戏的代码

js+画布写一个贪吃蛇小游戏的代码

最近玩贪吃蛇尝试自己写个玩玩,于是就有了如下代码:

哈哈,大家可以复制粘贴,直接运行即可食用。

里面部分注释,有一定js基础的可以看看,超简单。。。。哈哈

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>原生JS贪吃蛇小游戏源码 - 孙也</title>
  8. <style>
  9. canvas{ border: 1px solid #000000;}
  10. </style>
  11. </head>
  12. <body>
  13. <canvas width="980" height="600" id="canvas"></canvas>
  14. <script>
  15. //初始化变量
  16. var foods = new Array(); //存放食物坐标
  17. var gameover = false; //游戏结束
  18. var gridWidth = 10; //正方形长度
  19. var canvas = document.getElementById("canvas");
  20. var ctx = canvas.getContext("2d"); //构建画布
  21. //食物定时器、蛇定时器、场景、蛇对象
  22. var food_interval,snake_interval,Farm,Snake;
  23. //方格对象
  24. function node(x,y,w)
  25. {
  26. var self = this;
  27. self.x = x;
  28. self.y = y;
  29. self.w = w;
  30. //食物初始化
  31. self.foodInit = function()
  32. {
  33. ctx.fillStyle = "#FF0000";
  34. ctx.fillRect(self.x,self.y,self.w,self.w);
  35. }
  36. //蛇的初始化
  37. self.snakeInit = function()
  38. {
  39. ctx.fillStyle = "#000000";
  40. ctx.strokeStyle = "#FFFFFF";
  41. ctx.fillRect(x,y,w,w);
  42. ctx.strokeRect(x,y,w,w);
  43. }
  44. //判断两个方块是否重合
  45. self.equals = function(node)
  46. {
  47. if(self.x == node.x && self.y == node.y)
  48. {
  49. return true;
  50. }else{
  51. return false;
  52. }
  53. }
  54. //清除格子 让格子跟背景颜色一样
  55. self.clear = function()
  56. {
  57. ctx.fillStyle = "#E8FFFF";
  58. ctx.strokeStyle = "#E8FFFF";
  59. ctx.fillRect(x,y,w,w);
  60. ctx.strokeRect(x,y,w,w);
  61. }
  62. }
  63. //创建场景对象
  64. function farm()
  65. {
  66. //保存作用域
  67. var self = this;
  68. ctx.fillStyle = "#E8FFFF"; //填充的场景颜色
  69. ctx.fillRect(0,0,canvas.width,canvas.height);
  70. //增加食物的方法
  71. self.addFood = function()
  72. {
  73. if(gameover)
  74. {
  75. return gameOver(); //游戏结束方法
  76. }else{
  77. //计算随机位置
  78. var x = parseInt(canvas.width/gridWidth*Math.random())*gridWidth;
  79. var y = parseInt(canvas.height/gridWidth*Math.random())*gridWidth;
  80. //实例化一个方格对象
  81. var food = new node(x,y,gridWidth);
  82. //得到对象之后,要把食物画到界面上面
  83. food.foodInit();
  84. //追加到数组里面
  85. foods.push(food);
  86. }
  87. }
  88. }
  89. //蛇对象
  90. function snake(x,y,len,speed)
  91. {
  92. var self = this;
  93. self.init = function()
  94. {
  95. self.len = len; //身体长度
  96. self.nodes = new Array(); //蛇的身体数组
  97. self.dir = "R"; //方向
  98. self.speed = speed; //速度
  99. //从右往左,逐格把蛇画出来
  100. var nx =x ,ny=y; //蛇的坐标点
  101. for(var i=0;i<len;i++)
  102. {
  103. //创建一个方格对象
  104. var tmpNode = new node(nx,ny,gridWidth);
  105. //把蛇的身体存放起来
  106. self.nodes[i] = tmpNode;
  107. //存放完了之后,把蛇画出来
  108. tmpNode.snakeInit();
  109. nx -= gridWidth; //往左边画
  110. }
  111. //让蛇动起来定时器
  112. snake_interval = setInterval(self.move,self.speed);
  113. //给蛇绑定方向按键
  114. document.onkeydown = function(e)
  115. {
  116. //按键的值
  117. var code = e.keyCode;
  118. //记录一下旧的方向
  119. self.odir = self.dir;
  120. switch(code)
  121. {
  122. //一组方向键 一组字母 WASD
  123. case 65:self.dir = "L";break;
  124. case 87:self.dir = "U";break;
  125. case 68:self.dir = "R";break;
  126. case 83:self.dir = "D";break;
  127. case 37:self.dir = "L";break;
  128. case 38:self.dir = "U";break;
  129. case 39:self.dir = "R";break;
  130. case 40:self.dir = "D";break;
  131. }
  132. }
  133. }
  134. //蛇移动方法
  135. self.move = function()
  136. {
  137. var len = self.len; //获取蛇的身体长度
  138. var head = self.nodes[0];//头部
  139. switch(self.dir)
  140. {
  141. //右边
  142. case "R":
  143. if(head.x + head.w >=canvas.width)
  144. {
  145. //撞墙
  146. return gameOver();
  147. }else{
  148. //新的头部
  149. var newHead = new node(head.x+head.w,head.y,head.w);
  150. }
  151. break;
  152. //左边
  153. case "L":
  154. if(head.x - head.w < 0)
  155. {
  156. //撞墙
  157. return gameOver();
  158. }else{
  159. //新的头部
  160. var newHead = new node(head.x-head.w,head.y,head.w);
  161. }
  162. break;
  163. case "U":
  164. if(head.y -head.w < 0)
  165. {
  166. //撞墙
  167. return gameOver();
  168. }else{
  169. //新的头部
  170. var newHead = new node(head.x,head.y-head.w,head.w);
  171. }
  172. break;
  173. case "D":
  174. if(head.y + head.w >= canvas.height)
  175. {
  176. //撞墙
  177. return gameOver();
  178. }else{
  179. //新的头部
  180. var newHead = new node(head.x,head.y+head.w,head.w);
  181. }
  182. }
  183. //禁止运行反方向
  184. if(self.nodes[1].equals(newHead))
  185. {
  186. self.dir = self.odir;
  187. return false;
  188. }
  189. ///禁止穿过自身,否则gameover
  190. for(var i=0;i<self.len;i++)
  191. {
  192. if(self.nodes[i].equals(newHead))
  193. {
  194. return gameOver();
  195. }
  196. }
  197. //初始化为蛇头
  198. newHead.snakeInit();
  199. //同时把蛇尾去掉
  200. self.nodes[self.len-1].clear();
  201. //将数组中的最后一个元素删除
  202. self.nodes.pop();
  203. //蛇身向前走
  204. for(var i=len-1;i>0;i--)
  205. {
  206. self.nodes[i] = self.nodes[i-1];
  207. }
  208. //干掉蛇的尾部 其余部分往后篡位 把头部空出来 让newHead塞进去
  209. self.nodes[0] = newHead;
  210. //判断是否吃到食物
  211. for(var i=0;i<foods.length;i++)
  212. {
  213. //让数组中的每个食物跟头部判断是否重合
  214. if(foods[i].equals(newHead))
  215. {
  216. //给蛇增加身体长度
  217. self.addNode();
  218. foods.pop(newHead); //foods[i]
  219. //调整速度 越来越快
  220. self.speed = self.speed>20?self.speed-10:self.speed;
  221. //调完速度要重新设置定时器
  222. clearInterval(snake_interval);
  223. snake_interval = setInterval(Snake.move,self.speed);
  224. break;
  225. }
  226. }
  227. }
  228. //给蛇身体添加长度
  229. self.addNode = function()
  230. {
  231. var tail1 = self.nodes[self.len-1]; //倒数第一个
  232. var tail2 = self.nodes[self.len-2]; //倒数第二个
  233. if(tail1.x == tail2.x)
  234. {
  235. //上下方向
  236. var addNode;
  237. if(tail1.y > tail2.y)
  238. {
  239. //往上
  240. addNode = new node(tail1.x,tail1.y+gridWidth,gridWidth);
  241. }else{
  242. //往下
  243. addNode = new node(tail1.x,tail1.y-gridWidth,gridWidth)
  244. }
  245. }else{
  246. //左右方向
  247. if(tail1.x > tail2.x)
  248. {
  249. //往左
  250. addNode = new node(tail1.x+gridWidth,tail1.y,gridWidth)
  251. }else{
  252. //往右
  253. addNode = new node(tail1.x-gridWidth,tail1.y,gridWidth)
  254. }
  255. }
  256. //新的身体画出来
  257. addNode.snakeInit();
  258. //将新的身体放到蛇的数组里面
  259. self.nodes[self.len] = addNode;
  260. self.len +=1; //把身体长度加一
  261. }
  262. }
  263. //游戏结束
  264. function gameOver()
  265. {
  266. gameover = true;
  267. //停止添加食物和蛇的跑动
  268. clearInterval(snake_interval);
  269. clearInterval(food_interval);
  270. var res = confirm("游戏结束,是否重新开始");
  271. if(res)
  272. {
  273. gameStart();
  274. }
  275. }
  276. //游戏开始
  277. function gameStart()
  278. {
  279. foods = new Array(); //清空存放食物坐标
  280. gameover = false;
  281. //初始化场地
  282. Farm = new farm();
  283. //添加定时器,定时增加食物 每隔3秒钟出一个食物
  284. food_interval = setInterval(Farm.addFood,50);
  285. //初始化一条蛇出来
  286. Snake = new snake(200,200,5,150);
  287. Snake.init();
  288. }
  289. gameStart();
  290. </script>
  291. </body>
  292. </html>

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

闽ICP备14008679号