手把手教你写贪吃蛇(原生JS)

190 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

手把手教你写贪吃蛇(1)👩‍🔧

超详细的教程,一步一步和我来,你一定会学会的~

绘制界面

设置分数和速度

    <h1>score:</h1>
    <button></button>
    <button></button>
    <button></button>

分数字体大,采用h1

速度需要用户点击按钮进行选择,所以采用button

画运动界面

  • 用表格显示格子,作为刻度(十行十列),每个格子的宽为40px,高为40px;

table>tr*10>th*10; 快捷方式生成十行十列的表格

​ 样式:

​ ①在html的table标签中加入样式:

​ border="1" (表格的边框长度为1px) cellpadding="0"(表格的内边距为0px)                cellspacing="0"这个别忘了设定,因为我这里默认是2px,就导致对不齐

​ ②在css中给每一个td都设置长和宽为38px(因为border四边还有1px占用

​ ③position:absolute 使表格浮动起来,不占用空间,以便div重叠上去

用一个大div设置实际运动场所

用一个大的div来供JS插入新的div(主战场)

样式:

①宽高:均为400px

②背景颜色也是在div上设置,不是在表格上设置

封装产生div的方法

通过在大的div后面附加子div的方式,来显示蛇头,蛇身子和食物。

封装一个函数还创建小div

 var map=document.getElementById("map");
        function creatDiv(color){
            var div = document.createElement("div");
            map.appendChild(div);
        }

给小div设置大小,这里我设置的是38px,你可以根据你的大小进行调整

  function creatDiv(color){
            var div = document.createElement("div");
            div.style.width="38px";
            div.style.height="38px";
            map.appendChild(div);
        }

给小div根据传入参数的不同而设置颜色的不同,创建一个生成div的函数,这样就可以方便我们之后根据自己的颜色需要来创建小div了。(这里就是JavaScript与HTML相连接的地方了) 因为区分的需要,这里我将蛇头设置为了红色,将食物也设置为了红色

  var map=document.getElementById("map");
        function creatDiv(color){
            var div = document.createElement("div");
            div.style.width="40px";
            div.style.height="40px";
            div.style.backgroundColor=color;
            map.appendChild(div);
        }
        creatDiv("red"); //创建一个蛇头
        creatDiv("red"); //创建一个食物

当创建好蛇头和食物后,要让他们的位置也变成absolute。目的是要让他们浮动起来,并且如果生成在同一行的时候,一个不会把另一个挤下去

div.style.position="absolute";

利用随机数产生蛇头和食物div

Math.random();随机产生一个[0,1)的随机数

我们的要求:div的left和top应该位于[0,360]之间,并且必须是40的倍数

方法:

Math.random()*10 =>产生一个[0,10)的随机数,即[0,9]的随机数。

parseInt(Math.random()*10) =>将其转化为[0,9]的整数

parseInt(Math.random()*10) *40 =>产生一个[0,360],且为40的倍数的整数

       div.style.left = parseInt(Math.random() * 10) * 40 + "px";
            div.style.top = parseInt(Math.random() * 10) * 40 + "px";

利用返回值得到通过函数创建的div

因为之后要获取蛇头和食物的位置,但因是在函数中创建的,所以函数已结束就临时变量销毁了,无法获取,所以通过设置函数的返回值为div,并var一个div承接,来得到蛇头和食物

 function creatDiv(color) {
            XXXXX
            return div;
        }
        var headNode = creatDiv("red");
        var foodNode = creatDiv("blue");

利用定时器让蛇头移动起来

给headNode一个value属性,规定他的移动方向(默认初始为向上移动)

headNode.value="up";

利用定时器函数,让蛇头移动(move是个移动的函数)

var t = setInterval(move, 1000);

定义move函数(注意这里的变换坐标形式)

 function move() {
            switch (headNode.value) {
                case "up":
                    headNode.style.top = parseInt(headNode.style.top) - 40 + "px";
                    break;
                case "down":
                    headNode.style.top = parseInt(headNode.style.top) + 40 + "px";
                    break;
                case "right":
                    headNode.style.left = parseInt(headNode.style.left) + 40 + "px";
                    break;
                case "left":
                    headNode.style.left = parseInt(headNode.style.left) - 40 + "px";
                    break;
            }
        }

通过键盘的按键来改变蛇头的移动方向

  • 利用键盘按下事件: document.onkeydown()。利用上下左右键来更改蛇头的移动方向

  • 通过获取键盘的键值,对应不同的方向,那应该怎么获取呢?

    在本例的事件编程中,由document.onkeydown可得:事件源是我的键盘,事件就是键盘按下。function(){ }是事件处理函数。在事件处理函数当中其实存在一个默认的参数event(可写可不写,用的时候需要写),表示事件对象,所以获取键盘的键值,就可以通过event.keyCode来获取

    document.onkeydown=function(event){
     event=event||window.event;
    }
    
  • 监听键值,并根据键盘上敲击的键更改蛇头的移动方向

    并且,在蛇有身体之后,不能让蛇头在向一个方向移动的时候向相对方向移动(要防止自噬的情况出现)。

    document.onkeydown = function (event) {
                event = event || window.event;
                switch (event.keyCode) {
                    case 37:
                        if(headNode.value!="right"||arr.length==0)
                        headNode.value = "left";
                        break;
                    case 38:
                        if(headNode.value!="down" || arr.length == 0)
                        headNode.value = "up";
                        break;
                    case 39:
                        if(headNode.value!="left" || arr.length == 0)
                        headNode.value = "right";
                        break;
                    case 40:
                        if(headNode.value!="up" || arr.length == 0)
                        headNode.value = "down";
                        break;
    
                }
            }
    

明天继续肝~