javascript--贪食蛇(完整版-逻辑思路)

逻辑思路:

  1. 创建表格,目的画线分割
  2. 创建地图div,让蛇在上面移动
  3. 创建所有的块,蛇头、身体、食物
  • 创建的蛇头、身体、食物div,添加到地图中
  • 蛇头、身体、食物随机产生坐标
  • 设置蛇头的初始方向
  • 设置按键改变蛇头方向
  • 开启定时器,自动移动蛇头

      4.食物

  • 判断是否吃到食物(蛇头的left和top等于食物的left和top)
  • 碰撞则随机产生食物(随机坐标)

     5.身体

  • 存所有的身体(数组)
  • 创建新身体newbody
  • 和蛇头方向相比,判断最后一个身体的方向
  • 新的身体的方向等于最后一个身体方向
  • 把新的身体移动到蛇头的后边,通过函数改变style.left和top的值
  • 新的身体添加到所有的身体数组中:allNode.push(bodyNode),目的遍历所有身体
  • 遍历所有的身体,链接在一起并一起移动

     6.设置如果所有身体.length>0时,按键不能在对面进行移动(onkeydown)
     7.判断蛇头有没有出边界(判断头部的top和style坐标)
     8.判断食物和身体不能重叠(身体和食物的坐标进行判断)
     9.设置速度
    10.分数
    11.判断头部不能碰撞身体(判断头部和所有的身体数组的坐标是否一致)

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>贪吃蛇</title>
    <style type="text/css">
        body, table, td, tr {
            padding: 0;
            margin: 0;
        }

        td {
            width: 48px;
            height: 48px;
            border: 1px solid #6eb3d8;
        }

        #map {
            background: #6eb3d8;
            width: 500px;
            height: 500px;
            opacity: 0.3;
            position: absolute;
            top: 0;
        }

        div {
            width: 50px;
            height: 50px;
            position: absolute;
        }

        #game {
            position: absolute;
            top: 510px;
            left: 20px;
        }

        #a {
            position: absolute;
            top: 515px;
        }

        #b {
            position: absolute;
            top: 515px;
            left: 50px;
        }

        #c {
            position: absolute;
            top: 515px;
            left: 100px;
        }
    </style>
</head>
<body>
<div id="map"></div>
<h3 id="game"><p id="score">本轮成绩为:</p></h3>
<input type="button" value="慢" onclick="speed('1000')" id="a">
<input type="button" value="中" onclick="speed('500')" id="b">
<input type="button" value="块" onclick="speed('100')" id="c">
<script>
    //分数的id
    var score = document.getElementById("score");
    //初始化分数为0
    var scoreNum = 0;

    //第一步:创建表格
    document.write("<table cellspacing='0'>");
    for (var n = 0; n < 10; n++) {
        document.write("<tr>")
        for (var m = 0; m < 10; m++) {
            document.write("<td></td>");
        }
        document.write("</tr>")
    }
    document.write("</table>");
    //第二步:创建地图
    var map = document.getElementById("map");
    //第三步:创建所有块,蛇头 身体 食物
    function createNode(type) {
        //获取蛇头的随机坐标
        var x = parseInt(Math.random() * 10) * 50;
        var y = parseInt(Math.random() * 10) * 50;
        //alert(x);
        //添加三块的div
        var div = document.createElement("div");
        div.style.left = x + "px";
        div.style.top = y + "px";
        map.appendChild(div);
        if (type == 0) {//蛇头
            div.style.background = "red";
        }
        if (type == 1) {//身体
            div.style.background = "yellow";
        }
        if (type == 2) {//食物
            div.style.background = "blue";
        }
        return div;
    }
    var allNode = new Array();//存所有的身体
    var allHeadBody = new Array();//存头和身体
    //第三步:创建头部的div
    var headNode = null;
    var foodNode = null;
    headNode = createNode(0);
    foodNode = createNode(2);
    allHeadBody.push(headNode);//把蛇头添加到存储头和身体的数组中


    headNode.value = 37;
    //第三步:移动头部
    function moveNode() {
        //判断游戏有没有出界
        if (parseInt(headNode.style.top) >= 500 || parseInt(headNode.style.left) >= 500 || parseInt(headNode.style.top) < 0 || parseInt(headNode.style.left) < 0) {
            alert("游戏结束");
            //停止游戏,停止定时器,则把定时器给一个变量
            clearInterval(stopGame);
        }

        //第四步:检测是否碰撞
        if (headNode.style.left == foodNode.style.left && headNode.style.top == foodNode.style.top) {
            //碰撞一次加0分
            scoreNum += 10;
            //写入到score中
            score.innerHTML = "本轮成绩为:" + scoreNum;

            //第五步:创建身体,记录当前的身体
            var bodyNode = createNode(1);
            var lastNode = null;//身体的最后一块
            //判断身体最后一块的方向(键盘位置)
            if (allNode.length == 0) {
                lastNode = headNode;
            } else {
                lastNode = allNode[allNode.length - 1];
            }
            bodyNode.value = lastNode.value;

            switch (parseInt(lastNode.value)) {//根据蛇头判断 身体的位置
                case 37:
                    bodyNode.style.left = parseInt(lastNode.style.left) + 50 + "px";
                    bodyNode.style.top = lastNode.style.top;
                    break;
                case 38:
                    bodyNode.style.top = parseInt(lastNode.style.top) + 50 + "px";
                    bodyNode.style.left = lastNode.style.left;
                    break;
                case 39:
                    bodyNode.style.left = parseInt(lastNode.style.left) - 50 + "px";
                    bodyNode.style.top = lastNode.style.top;
                    break;
                case 40:
                    bodyNode.style.top = parseInt(lastNode.style.top) - 50 + "px";
                    bodyNode.style.left = lastNode.style.left;
                    break;
            }
            allNode.push(bodyNode);//存所有的身体
            allHeadBody.push(bodyNode);//存的头和身体


            //判断食物和身体不能重叠
            var foodbool = true;
            var px = 0;
            var py = 0;
            var num = 0;
            while (foodbool) {
                px = parseInt(Math.random() * 10) * 50 + "px";
                py = parseInt(Math.random() * 10) * 50 + "px";
                for (var n = 0; n < allHeadBody.length; n++) {
                    if (allHeadBody[n].style.left == px && allHeadBody[n].style.top == py) {
                        num++;
                    }
                }
                if (num == 0) {
                    foodbool = false;
                } else {
                    num = 0;
                }

            }
            foodNode.style.left = px;
            foodNode.style.top = py;


//

        }
        //让身体跟着蛇头走
        if (allNode.length > 0) {
            for (var n = allNode.length - 1; n >= 0; n--) {
                //判断蛇头和身体不能碰撞
                if (headNode.style.left == allNode[n].style.left && headNode.style.top == allNode[n].style.top) {
                    alert("游戏结束,碰撞身体了!");
                    clearInterval(stopGame);

                }

                switch (parseInt(allNode[n].value)) {
                    case 37:
                        allNode[n].style.left = parseInt(allNode[n].style.left) - 50 + "px";
                        break;
                    case 38:
                        allNode[n].style.top = parseInt(allNode[n].style.top) - 50 + "px";
                        break;
                    case 39:
                        allNode[n].style.left = parseInt(allNode[n].style.left) + 50 + "px";
                        break;
                    case 40:
                        allNode[n].style.top = parseInt(allNode[n].style.top) + 50 + "px";
                        break;
                }
                if (n > 0) {
                    allNode[n].value = allNode[n - 1].value;
                } else {
                    allNode[n].value = headNode.value;
                }

            }
        }

        //根据headNode.value的初始值移动蛇头方向
        switch (parseInt(headNode.value)) {
            case 37://左
                headNode.style.left = (parseInt(headNode.style.left) - 50) + "px";
                break;
            case 38://上
                headNode.style.top = (parseInt(headNode.style.top) - 50 ) + "px";
                break;
            case 39://右
                headNode.style.left = (parseInt(headNode.style.left) + 50) + "px";
                break;
            case 40://上
                headNode.style.top = (parseInt(headNode.style.top) + 50) + "px";
                break;
        }


    }//移动蛇头结束

    //控制速度

    //初始默认的速度
    var newspeed = 500;
    function speed(num) {
        newspeed = num;
//        clearInterval(stopGame);
        stopGame = setInterval(moveNode, newspeed);
        speed=null;//函数执行一次,第二次调用则函数为空
    }
    //stopGame = setInterval(moveNode, newspeed);
    document.onkeydown = function () {
        // alert(event.keyCode);
        switch (event.keyCode) {
            case 37://左
                if (headNode.value != 39 || allNode.length <= 0) {
                    headNode.value = 37;
                }
                break;
            case 38://上
                if (headNode.value != 40 || allNode.length <= 0) {
                    headNode.value = 38;
                }
                break;
            case 39://右
                if (headNode.value != 37 || allNode.length <= 0) {
                    headNode.value = 39;
                }
                break;
            case 40://上
                if (headNode.value != 38 || allNode.length <= 0) {
                    headNode.value = 40;
                }
                break;
        }
    }
</script>
</body>
</html>
贪食蛇游戏是一款经典的游戏,玩家通过控制一条蛇在一个有边界的区域内移动,吃掉食物来增长身体长度,同时要避免撞到自己的身体或者撞到边界。下面是贪食蛇游戏软件的详细设计: 1. 游戏界面设计: - 游戏区域:一个矩形区域,用于显示游戏的进行,包括蛇和食物的位置。 - 分数显示:显示玩家当前的得分。 - 游戏状态显示:显示游戏的状态,如开始、暂停、结束等。 2. 蛇的设计: - 蛇的身体:由一系列相连的方块组成,每个方块代表蛇的一个身体部分。 - 蛇的移动:根据玩家的输入控制蛇的移动方向,蛇每次移动一个方块的距离。 - 蛇的生长:当蛇吃到食物时,蛇的身体长度增加一个方块。 3. 食物的设计: - 食物的位置:随机生成在游戏区域内的一个空白位置。 - 食物的消失与生成:当蛇吃到食物后,食物消失并重新生成在另一个位置。 4. 碰撞检测: - 蛇与自身的碰撞:当蛇的头部与身体的其他部分重叠时,游戏结束。 - 蛇与边界的碰撞:当蛇的头部碰到游戏区域的边界时,游戏结束。 - 蛇与食物的碰撞:当蛇的头部与食物重叠时,蛇的身体增长,并生成新的食物。 5. 游戏控制: - 开始游戏:玩家点击开始按钮或者按下空格键开始游戏。 - 暂停游戏:玩家点击暂停按钮或者按下空格键暂停游戏。 - 结束游戏:当蛇与自身或边界碰撞时,游戏结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值