- <!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>
|