13行js写贪吃蛇游戏

先上源码,版本是ES6


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)的尾数

应该算易读了

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

点击运行

颜色效果

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

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

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

  1. <!DOCTYPE html>
  2. <canvas id="1" width="400" height="400" style="border: 1px solid " ></canvas>
  3. <script>
  4. ctx = document.getElementById("1").getContext("2d")
  5. let Len = 10, dir = 2, dirNow ;
  6. food = [3, 0]; Snake = [[0, 0], [1, 0]]
  7. Map = {‘0,0‘:‘fff‘, ‘1,0‘:‘fff‘}
  8. dirMat = [[-1, 0], [0, -1], [1, 0], [0, 1]]
  9. pairEq = ((p1, p2) => p1[0] == p2[0] && p1[1] == p2[1])
  10. document.onkeydown = e =>{
  11. if (37 <= e.keyCode == e.keyCode < 41 && dirNow != ( (e.keyCode - 35) % 4) )
  12. dir = e.keyCode -37
  13. }
  14. !function () {
  15. Head = Snake[Snake.length-1].map((x, i) => x + dirMat[dirNow=dir][i]);
  16. if (!pairEq(Head, food)) Map[Snake.shift()]=‘0‘
  17. if (Snake.some(x=>pairEq(x,Head)) || !Head.every(x => 0<=x == x < Len))
  18. return document.write("Game Over")
  19. Snake.push(Head);
  20. while (Snake.some(x => pairEq(x, food)))
  21. food = [~~(Math.random() * Len), ~~(Math.random() * Len)];
  22. Map[Head] = Map[food] = ‘fff‘
  23. for( k in Map){
  24. ctx.fillStyle=‘#‘+(0xfff-~~(parseInt(Map[k],16)*Math.random())).toString(16)
  25. ctx.fillRect(parseInt(k[0])*40,parseInt(k[2])*40,46,43)
  26. }
  27. setTimeout(arguments.callee, 100);
  28. }()
  29. </script>

原文地址:https://www.cnblogs.com/migeater/p/9306843.html

时间: 2024-10-16 04:40:31

13行js写贪吃蛇游戏的相关文章

Python入门学习:一步步教你怎么用Python写贪吃蛇游戏

前几天,有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Python(蛇)玩Snake(贪吃蛇),再合适不过了. 这里通过一个Python入门学习的例子跟大家详细讲解一下! 先通过下面这个效果图来感受下吧! 1 环境 操作系统:Windows Python版本:3.7.3 2 需求分析 我们先来回顾下贪吃蛇中的游戏元素及游戏规则. 首先呢,需要有贪吃蛇.有食物:需要能控制贪吃蛇来上下移动获取食物:贪吃蛇在吃取食物后,自身长度增加,同时食物消

javascript:用原生js模拟贪吃蛇游戏练习

本次练习所有的代码:可以直接复制全部然后运行看效果~ 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>title</title> 6 <style> 7 .map { 8 width: 800px; 9 height: 600px; 10 background-color:

JS贪吃蛇游戏

<!DOCTYPE html><html> <head>    <meta charset="utf-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <title>JS贪吃蛇游戏</title>    <style>    * {        margin: 0;    

手起刀落-一起来写经典的贪吃蛇游戏

回味 小时候玩的经典贪吃蛇游戏我们印象仍然深刻,谋划了几天,小时候喜欢玩的游戏,长大了终于有能力把他做出来(从来都没有通关过,不知道自己写的程序,是不是能通关了...),好了,闲话不多谈,先来看一下效果吧!! 功能和小时候玩的贪吃蛇一样, 1.选择速度 slow normal fast 2.选择是否有墙作为障碍物 on off 看完效果就先附上地址喽:大山深处修炼的小龙虾,欢迎fork. 结构分解 如果构建一个简单的经典贪吃蛇游戏呢?我们根据面板可以分解出如下结构: 因为其他面板比较简单,我们重

WebGL实现HTML5的3D贪吃蛇游戏

js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型,多次想尝试提交个小游戏但总无法写出让自己满意还能控制在这么小的字节范围. 自己写不出来,站在巨人肩膀总是有机会吧,想起<基于HTML5的电信网管3D机房监控应用>这篇提到的threejs,babylonjs和Hightopo的几种基于WebGL的3D引擎,突然想挑战下自己实现个100行JS的3D小

小项目特供 贪吃蛇游戏(基于C语言)

C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第二天写了第二版和第三版. 相信C语言写个小游戏或小项目是大多数计算机相关专业的学生都做的事情,但是作为一个数学专业的学生,我们教研室的老师对C语言的要求也就比较低了,大一没有让我们做个小项目实践一次.至今为止用C/C++做过的三个小项目(大作业),一个是外校同学让我帮忙写的学生信息管理系统(天呐,这

使用javascript实现贪吃蛇游戏

当自己用代码实贪吃蛇游戏时,是很有成就感的一件事情.同时在写的过程中也是自己对javascript基本语法的复习与体会. 以下就是代码以及一些代码注释:(bug是有的,浏览器的兼容性,本人的能力无法解决) <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content=&quo

贪吃蛇游戏

学习C语言也差不多学完了想做一个游戏,而贪吃蛇和俄罗斯方块都是非常经典的游戏,在网上也找到了许多相关的参考资料,便动手做了,这个游戏室控制台版的 游戏流程图 函数模块 函数名 函数功能 CursorPosition 光标定位函数 CreateSnake 蛇初始化函数 ShowWall 显示墙体 UpdateSnake 更新界面上的蛇体.分数.等级.食物 CollisionDetection 判断蛇是否咬到自己 RandFood 随机产生食物 Move 控制方向 程序代码 #include <st

javascript -- (贪吃蛇游戏)

界面设置 /***body**/ <body> <h1>贪吃蛇游戏</h1> /***score记录成绩**/ <p id="score">0</p> /***地图**/ <div id="snake_map"> /***地图的绘制通过js实现**/ </div> /***三个按钮**/ <div class = "box"> <button t