当前位置:   article > 正文

【前端笔记】js简单代码实现贪吃蛇~~~_js贪吃蛇代码截图

js贪吃蛇代码截图

贪吃蛇是前端人入门且必须的技能。今天闲下来整理介绍一下~~~

首先,先要确定贪吃蛇小游戏的需求:

  • 背景墙   确定行列
  • 创建蛇头
  • 蛇头移动
  • 蛇头变相
  • 创建实物
  • 碰撞检测
  • 增加身体
  • 食物消失 随机创建新的
  • 身体蛇头一起移动

我们首先通过创建一些div元素来生成网格轨道背景:

然后创建蛇头(我们让蛇头位置是固定的,食物是随机产生的)

接下来是蛇头的自动移动(我们设置一个定时器来实现蛇头的自动移动):

蛇头的变向操作(使用到了键盘事件 我们使用上下左右键来移动 判断keycode值来改变蛇头位置)

接下来创建随机食物:

食物和蛇头的碰撞检测:

注意食物不能成成在身体上,所以我们需要添加条件判断:

吃掉食物后产生身体块

身体块随着头移动

把创建头 食物 身体 封装到一起(共有的地方)

让几个函数需要的参数是一致的,不一样的在内部实现

接下来还要优化以下~判断蛇头是否碰撞了边界和自己的身体,也要不让蛇可以回退移动;随机产生不同分值的食物,获得一定分值后的速度也要变快

以下是具体代码实现:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>贪吃蛇</title>
  6. <style>
  7. .out{
  8. width: 500px;
  9. height: 500px;
  10. background: #ccc;
  11. border: 1px solid blue;
  12. position: relative;
  13. overflow: hidden;
  14. }
  15. p{
  16. display: inline-block;
  17. }
  18. span{
  19. display: block;
  20. }
  21. </style>
  22. </head>
  23. <body>
  24. <div class="out">
  25. </div>
  26. <button onclick="reset()">再玩一局</button>
  27. &nbsp;&nbsp;&nbsp;&nbsp;得分:<p></p>
  28. <span>得分大于等于5,改变速度。得分大于等于10,改变速度。</span>
  29. <script src="./snake.js"></script>
  30. <script>
  31. var col=10;
  32. var row=10;
  33. var w=50;
  34. var h=50;
  35. var out=$('.out')[0];
  36. var score=$('p')[0];
  37. var bodys=[];
  38. var num=0;
  39. var time=1000;//速度
  40. //背景
  41. createBg(out,col,row)
  42. // 蛇头
  43. var head=createNode(1,out)
  44. // 食物
  45. var food=createNode(2,out)//createFood(out,w,h,col,row,1)
  46. createKeyEvent(head);
  47. //计时器
  48. var timer=setInterval(play,time)
  49. //
  50. function play() {
  51. //身体移动
  52. moveBody(bodys,head)
  53. //头部移动
  54. moveHead(head);
  55. var checkstate=check(head,food);
  56. if(checkstate){
  57. //计算分数
  58. num+=Number(food.getAttribute('value'));
  59. score.innerHTML=num+"分"
  60. //判断分数 改变速度
  61. if (num>=5&&num<10) {
  62. time=600;
  63. clearInterval(timer);
  64. timer=setInterval(play,time);
  65. }
  66. else if(num>=10){
  67. time=300;
  68. clearInterval(timer);
  69. timer=setInterval(play,time);
  70. }
  71. //删除food
  72. out.removeChild(food);
  73. //创建food(food不能创建在身体上)
  74. food=createNode(2,out)
  75. //创建身体
  76. if (bodys.length>0) {
  77. // var body=createBody(out,w,h,bodys[bodys.length-1])
  78. var body=createNode(3,out,bodys[bodys.length-1])
  79. console.log(body)
  80. }else{
  81. // var body=createBody(out,w,h,head)
  82. var body=createNode(3,out,head)
  83. console.log(body)
  84. }
  85. bodys.push(body)
  86. }
  87. var bodycheckstate=checkbody(head,bodys);
  88. if (bodycheckstate==false) {
  89. clearInterval(timer);
  90. alert("咬到自己了!")
  91. }
  92. var borderstate=checkBorder(head,out);
  93. if (borderstate==false) {
  94. clearInterval(timer);
  95. alert("game over!")
  96. }
  97. }
  98. </script>
  99. </body>
  100. </html>
  101. <!--
  102. 1.背景墙 确定行列
  103. 2.创建蛇头
  104. 3.蛇头移动
  105. 4.蛇头变相
  106. 5.创建实物
  107. 6.碰撞检测
  108. 7.增加身体
  109. 8.食物消失 随机创建新的
  110. 9身体蛇头一起移动
  111. -------完成-------
  112. -->

 

  1. //获取元素方法
  2. function $(string){
  3. var tag=string.charAt(0);
  4. var ele=null;
  5. switch(tag){
  6. case ".":
  7. ele=document.getElementsByClassName(string.slice(1))
  8. break;
  9. case "#":
  10. ele=document.getElementById(string.slice(1))
  11. break;
  12. default:
  13. ele=document.getElementsByTagName(string);
  14. break;
  15. }
  16. return ele;
  17. }
  18. //创建背景方法
  19. function createBg(parent,col,row){
  20. //创建表格
  21. parent.style.width=row*50+"px";
  22. parent.style.height=col*50+"px";
  23. for (var i = 0; i < row; i++) {
  24. for (var j = 0; j < col; j++) {
  25. var div =document.createElement('div')
  26. div.style.width="48px"
  27. div.style.height="48px"
  28. div.style.border="1px solid white"
  29. div.style.float='left'
  30. parent.appendChild(div);
  31. }
  32. }
  33. }
  34. //事件监听
  35. function createKeyEvent(head){
  36. document.onkeyup=function(event){
  37. console.log(event)
  38. var event=event||window.event
  39. var key=event.keyCode;
  40. if (head.className=='top'&&key==40) {
  41. return;
  42. }
  43. else if (head.className=='right'&&key==37) {
  44. return;
  45. }
  46. else if (head.className=='down'&&key==38) {
  47. return;
  48. }
  49. else if (head.className=='left'&&key==39) {
  50. return;
  51. }
  52. switch(key){
  53. case 40:
  54. head.className='down'
  55. break;
  56. case 37:
  57. head.className="left"
  58. break;
  59. case 38:
  60. head.className="top"
  61. break;
  62. case 39:
  63. head.className="right"
  64. break;
  65. }
  66. }
  67. }
  68. //身体碰撞检测
  69. function checkbody(obj1,arr) {
  70. for (var i = 1; i < arr.length; i++) {
  71. if (obj1.offsetTop==arr[i].offsetTop&&obj1.offsetLeft==arr[i].offsetLeft) {
  72. return false;
  73. }
  74. }
  75. }
  76. //碰撞检测
  77. function check(obj1,obj2){
  78. if (obj1.offsetLeft==obj2.offsetLeft&&obj1.offsetTop==obj2.offsetTop) {
  79. return true;
  80. }
  81. return false;
  82. }
  83. //头部移动
  84. function moveHead(head){
  85. var left=0;
  86. var top=0;
  87. switch(head.className){
  88. case 'left':
  89. left=head.offsetLeft-50;
  90. top=head.offsetTop
  91. break;
  92. case 'right':
  93. left=head.offsetLeft+50;
  94. top=head.offsetTop
  95. break;
  96. case 'top':
  97. left=head.offsetLeft;
  98. top=head.offsetTop-50
  99. break;
  100. case 'down':
  101. left=head.offsetLeft;
  102. top=head.offsetTop+50
  103. break;
  104. }
  105. head.style.left=left+'px'
  106. head.style.top=top+'px'
  107. }
  108. //移动body
  109. function moveBody(array){
  110. if (array.length>0) {
  111. for (var i = array.length - 1; i >= 0; i--) {
  112. switch(array[i].className){
  113. case 'left':
  114. x=array[i].offsetLeft-50;
  115. y=array[i].offsetTop
  116. break;
  117. case 'right':
  118. x=array[i].offsetLeft+50;
  119. y=array[i].offsetTop
  120. break;
  121. case 'top':
  122. x=array[i].offsetLeft;
  123. y=array[i].offsetTop-50
  124. break;
  125. case 'down':
  126. x=array[i].offsetLeft;
  127. y=array[i].offsetTop+50
  128. break;
  129. }
  130. array[i].style.left=x+"px";
  131. array[i].style.top=y+'px'
  132. if (i==0) {
  133. array[i].className=head.className
  134. }else{
  135. array[i].className=array[i-1].className
  136. }
  137. }
  138. }
  139. }
  140. /*
  141. 检测坐标是否重合
  142. */
  143. function checkfood(x,y,array){
  144. console.log(head)
  145. if (x==head.offsetLeft&&y==head.offsetTop) {
  146. return false
  147. }
  148. for (var i = 0; i < array.length; i++) {
  149. // 检测到重复
  150. if (array[i].offsetLeft==x&&array[i].offsetTop==y) {
  151. return false;
  152. }
  153. if (i==array.length-1) {
  154. return true;
  155. }
  156. }
  157. return true;
  158. }
  159. /*
  160. 创建节点对象
  161. type 1 蛇头 2 food 3 身体
  162. */
  163. function createNode(type,parent,preObj){
  164. var x=0;
  165. var y=0;
  166. var w=50;
  167. var h=50;
  168. var bgColor;
  169. var fen;
  170. var className="";
  171. var preObj=preObj?preObj:null
  172. switch(type){
  173. case 1:
  174. bgColor="red"
  175. className="right"
  176. break;
  177. case 2:
  178. var foodtype=parseInt(Math.random()*10)%3
  179. var foods=[['yellow',1],['skyblue',2],['pink',3]]
  180. bgColor=foods[foodtype][0]
  181. fen=foods[foodtype][1]
  182. var array=bodys;
  183. // console.log(array)
  184. test();
  185. function test(){
  186. var a=parseInt(Math.random()*row)*50;
  187. var b=parseInt(Math.random()*col)*50;
  188. var state=checkfood(a,b,array)
  189. if (state) {
  190. x=a;
  191. y=b;
  192. }else{
  193. test();
  194. }
  195. }
  196. break;
  197. case 3:
  198. switch(preObj.className){
  199. case 'left':
  200. x=preObj.offsetLeft+50;
  201. y=preObj.offsetTop
  202. break;
  203. case 'right':
  204. x=preObj.offsetLeft-50;
  205. y=preObj.offsetTop
  206. break;
  207. case 'top':
  208. x=preObj.offsetLeft;
  209. y=preObj.offsetTop+50
  210. break;
  211. case 'down':
  212. x=preObj.offsetLeft;
  213. y=preObj.offsetTop-50
  214. break;
  215. }
  216. className=preObj.className;
  217. bgColor='black'
  218. break ;
  219. default:
  220. break
  221. }
  222. var node=document.createElement('div');
  223. node.style.background=bgColor;
  224. node.style.position="absolute";
  225. node.style.left=x+"px";
  226. node.style.top=y+"px";
  227. node.style.width=w+"px";
  228. node.style.height=h+"px";
  229. node.style.zIndex=999;
  230. node.className=className;
  231. node.setAttribute("value",fen)
  232. parent.appendChild(node)
  233. return node;
  234. }
  235. function reset(){
  236. window.location.reload();
  237. }
  238. //检测碰撞到边界框
  239. function checkBorder(obj1,obj2) {
  240. if (obj1.offsetLeft>obj2.offsetWidth||obj1.offsetLeft<0||obj1.offsetTop<0||obj1.offsetTop>obj2.offsetHeight) {
  241. return false;
  242. }
  243. return true;
  244. }
'
运行

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

闽ICP备14008679号