最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

使用js实现贪吃蛇游戏的代码

来源:动视网 责编:小采 时间:2020-11-27 19:33:37
文档

使用js实现贪吃蛇游戏的代码

使用js实现贪吃蛇游戏的代码:这篇文章主要介绍了关于使用js实现贪吃蛇游戏的代码,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下13行常规(700bytes)shortest snake game.html压缩后的500bytes(当然两处document还是可以用eval压缩的)index.500bytes
推荐度:
导读使用js实现贪吃蛇游戏的代码:这篇文章主要介绍了关于使用js实现贪吃蛇游戏的代码,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下13行常规(700bytes)shortest snake game.html压缩后的500bytes(当然两处document还是可以用eval压缩的)index.500bytes


这篇文章主要介绍了关于使用js实现贪吃蛇游戏的代码,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

13行常规(700bytes)

shortest snake game.html

压缩后的500bytes(当然两处document还是可以用eval压缩的)

index.500bytes.html

之前很火的20行代码地址(有BUG)(900bytes)

hj7jay/article/details/51011269

一维数组700char

(0,0)位置的蛇身用0表示,(0,1)用1,(1,0)用10表示,以此类推

因为就13行js,

第4行 是声明

第5行 比较难理解,可以把?:运算符,拆分为4行if语句;可以参考下面的 二维数组 的版本

第9行 0|x 和 ~~x 和 x>>0 都能去除x(number)的尾数

应该算易读了

<!DOCTYPE html>
<canvas id="1" width="400" height="400"></canvas> 
<script> 
let dir=1,food=3,snk=[1,0],ctx=document.getElementById("1").getContext("2d")
document.onkeydown=e=>{dir = snk[0]-snk[1]==-(tmp = [-1,-10,1,10][e.keyCode-37]||dir)?dir:tmp }
setInterval(()=>{
 snk.unshift(Head = snk[0] + dir)
 if(Head!=food) snk.pop()
 else while(snk.includes(food=0|Math.random()*10*10)) ;
 if(snk.indexOf(Head,1)!=-1||(dir==1&&Head%10==0)||(dir==-1&&Head%10==9)||Head<0||Head>=100)
 return document.write(0&snk.shift()) //死亡记录蛇长
 for(let i=0; i<100; i++){
 ctx.fillStyle = '#0'+(food==i)*9910+snk.includes(i)*1990
 ctx.fillRect(i%10*40,(i-i%10)*4, 40,40)
 }
},100) 
</script>

颜色效果

<!DOCTYPE html>
<canvas id="1" width="400" height="400"></canvas>
<script>
let dir=1,food=3,snk=[1,0],n_=0, ctx=document.getElementById("1").getContext("2d")
document.onkeydown=e=>{ dir =snk[0]-snk[1]==-(tmp = [-1,-10,1,10][e.keyCode-37]||dir)?dir:tmp }
setInterval(()=>{
 snk.unshift(Head = snk[0] + dir)
 if(Head!=food) snk.pop()
 else while(snk.includes(food=0|Math.random()*10*10)) ;
 if(snk.indexOf(Head,1)!=-1||(dir==1&&Head%10==0)||(dir==-1&&Head%10==9)||Head<0||Head>=100)
 return alert("died"+ ++n_+"times") //死亡记录死亡次数
 for(let i=0 ; i<100; i++){
 ctx.fillStyle = '#0'+~~((food===i)*13000*Math.random())+~~(snk.includes(i)*3000*Math.random())
 ctx.fillRect(i%10*40,(i-i%10)*4, 40,40)
 }
},120)
</script>

说明

如果自己要写的话:要注意两点

  1. 蛇尾应该比蛇头先消失,蛇头应该比食物先生成,

  2. 蛇不能走当前相反的方向

    可以用长度为4的蛇进行测试

代码风格

  1. 省去没必要的标签

    https://google.github.io/styleguide/htmlcssguide.html#Optional_Tags

  2. if() return只用一行

    https://google.github.io/styleguide/cppguide.html

  3. 除了键盘响应那里用3目运算符能省3行之外,其他地方都没必要用

二维数组

以上的都是用一维数组实现的,下面的用二维数组写;要简化也能简化到17行以内900char以内(比20行的那个短就是了),不过没有必要

带注释的1100char

<!DOCTYPE html>
<canvas id="1" width="400" height="400" style="border: 1px solid "></canvas>
<script>
 ctx = document.getElementById("1").getContext("2d") //CanvasRenderingContext2D inferface
 let Len = 10, dir = 2, dirNow ; //dirNow 后面解释
 food = [3, 0]; Snake = [[0, 0], [1, 0]] //食物的坐标,蛇身的坐标用Snake数组记录
 Map = {'0,0':'#52a', '1,0':'#52a'} //用来记录绘图颜色的 地图
 dirMat = [[-1, 0], [0, -1], [1, 0], [0, 1]] //方向矩阵
 pairEq = ((p1, p2) => p1[0] == p2[0] && p1[1] == p2[1]) //检测 两数对 是否相等的函数
 document.onkeydown = e =>{
 if (37 <= e.keyCode == e.keyCode < 41 && dirNow != ( (e.keyCode - 35) % 4) ) //确定是 方向键 并且 保证方向与当前运动方向相反
 dir = e.keyCode -37
 }
 !function () {
 Head = Snake[Snake.length-1].map((x, i) => x + dirMat[dirNow=dir][i]); //得到头部接下来的移动位置
 if (!pairEq(Head, food))
 Map[Snake.shift()]='#fff' //必须先删尾巴,才能加入头部,吃没吃到食物是唯一判断标准
 if (Snake.some(x=>pairEq(x,Head)) || !Head.every(x => 0<=x == x < Len)) //判断蛇头是否撞到蛇身或墙壁
 return document.write("Game Over") //这样调用document.write会把页面全部清空
 Snake.push(Head); //可以加入头部
 while (Snake.some(x => pairEq(x, food))) //加入新头后, 生成食物更方便
 food = [~~(Math.random() * Len), ~~(Math.random() * Len)]; //因为js没有整形的概念, ~~ 现在相当于向原点舍去
 Map[Head] = '#52a' ; Map[food] = '#ad5'
 for( k in Map){
 ctx.fillStyle= Map[k]
 ctx.fillRect(parseInt(k[0])*40,parseInt(k[2])*40,40,40) //e.g. k="1,3",也因此地图大小为10
 }
 setTimeout(arguments.callee, 100); //100ms后调用此函数一次
 }()
</script>

七彩的(主要是比较好看)1100char

<!DOCTYPE html>
<canvas id="1" width="400" height="400" style="border: 1px solid " ></canvas>
<script>
 ctx = document.getElementById("1").getContext("2d")
 let Len = 10, dir = 2, dirNow ;
food = [3, 0]; Snake = [[0, 0], [1, 0]]
 Map = {'0,0':'fff', '1,0':'fff'}
 dirMat = [[-1, 0], [0, -1], [1, 0], [0, 1]]
 pairEq = ((p1, p2) => p1[0] == p2[0] && p1[1] == p2[1])
 document.onkeydown = e =>{
 if (37 <= e.keyCode == e.keyCode < 41 && dirNow != ( (e.keyCode - 35) % 4) )
dir = e.keyCode -37
 }
 !function () {
 Head = Snake[Snake.length-1].map((x, i) => x + dirMat[dirNow=dir][i]);
 if (!pairEq(Head, food)) Map[Snake.shift()]='0'
 if (Snake.some(x=>pairEq(x,Head)) || !Head.every(x => 0<=x == x < Len))
 return document.write("Game Over")
 Snake.push(Head);
 while (Snake.some(x => pairEq(x, food)))
food = [~~(Math.random() * Len), ~~(Math.random() * Len)];
 Map[Head] = Map[food] = 'fff'
 for( k in Map){
 ctx.fillStyle='#'+(0xfff-~~(parseInt(Map[k],16)*Math.random())).toString(16)
 ctx.fillRect(parseInt(k[0])*40,parseInt(k[2])*40,46,43)
 }
 setTimeout(arguments.callee, 100);
 }()
</script>

文档

使用js实现贪吃蛇游戏的代码

使用js实现贪吃蛇游戏的代码:这篇文章主要介绍了关于使用js实现贪吃蛇游戏的代码,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下13行常规(700bytes)shortest snake game.html压缩后的500bytes(当然两处document还是可以用eval压缩的)index.500bytes
推荐度:
标签: 利用 使用 游戏
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top