不用循环数组,js+html实现贪吃蛇

功能描述:每走10步随机改变一个方方向,当键盘按下方向键 w,s,a,d时,使用键盘方向控制蛇的移动,蛇头每撞到一次自身时改变屏幕颜色,蛇头碰到边界时从另一边回来。

实现思路:用个30大小的数组存放每个结点,蛇头结点根据当前方向移动,数组中其他结点的值依次换成上一个结点的值。

效果展示:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script>
    const NORTH = 0;
    const SOUTH = 1;
    const WEST = 2;
    const EAST = 3;
    const NODE_LENGTH = 50;
    const MAX_LENGTH = 30;
    const CURRENT_LENGTH = 30;
    const SPEED = 50;
    const SCREEN_WIDTH = window.innerWidth;
    const SCREEN_HEIGHT = window.innerHeight;
    var x=0;
    var y=0;
    var head = 0;
    var tail = MAX_LENGTH - 1;
    var body = [];
    var direction = 1;
    var count = 0;
    var touchSelfCnt = 0;
    var colorArray = ['red','orange','yellow','green','#025CBD','#05BC67','#6C6783','#766783','#836783','#836776','white'];
    var KEY_CONTROL_FLAG = 0;
    for (var i = 0; i <MAX_LENGTH ; i++) {
        console.log();
        var element = document.createElement("span");
        element.id = i;
        element.style.position = 'absolute';
        element.style.left = i*NODE_LENGTH+'px';
        element.style.top = 0;
        element.style.background ='black';
        element.style.border='2px solid red';
        element.style.width=NODE_LENGTH+'px';
        element.style.height=NODE_LENGTH+'px';
        var docBody = document.body;
        docBody.appendChild(element);
        body[i] = {x:i*NODE_LENGTH,y:0,element:element};
        console.log(element);
    }

    console.log(SCREEN_WIDTH,SCREEN_HEIGHT);

    document.addEventListener("keydown",function (event) {
        KEY_CONTROL_FLAG = 1;
        switch (event.keyCode) {
            case 87:
                direction = NORTH;
                break;
            case 83:
                direction = SOUTH;
                break;
            case 65:
                direction = WEST;
                break;
            case 68:
                direction = EAST;
                break;
            default:break;
        }
    });

    function move(){
        if(count%10===0 && KEY_CONTROL_FLAG===0){
            direction = Math.floor(Math.random()*4)
        }
        console.log('direction',direction);
        switch (direction) {
            case NORTH:
                y-=SPEED;
                break;
            case SOUTH:
                y+=SPEED;
                break;
            case WEST:
                x-=SPEED;
                break;
            case EAST:
                x+=SPEED;
                break;
            default:break;
        }

        if (x > (SCREEN_WIDTH-NODE_LENGTH)) {
            x = 0;
        }else if (y > SCREEN_HEIGHT-NODE_LENGTH) {
            y = 0;
        }else if (x < 0) {
            x = SCREEN_WIDTH-NODE_LENGTH;
        }else if (y < 0) {
            y = SCREEN_HEIGHT-NODE_LENGTH;
        }

        body[0] = {x:x,y:y};
        // console.log('x,y,direction',x,y,direction)

        //判断有没有撞到自己
        for (var i = 1; i <body.length ; i++) {
            if(body[i].x ===x && body[i].y===y){
                document.body.style.background = colorArray[touchSelfCnt%11];
                touchSelfCnt++;
                document.body.appendChild(div);
            }
        }
    }

    function drawSnake(){
        for (var i = body.length-1; i >0 ; i--) {
            body[i] = body[i-1];
        }
        for (var i = 0; i <body.length ; i++) {
            var element = document.getElementById(i);
            element.style.left = body[i].x+"px";
            element.style.top = body[i].y+"px";
        }
    }

    setInterval(function () {
        move();
        drawSnake();
        count++;
    },100)
</script>
</body>
</html>
相关推荐
肖。35487870941 分钟前
[html-13]js检测文本中是否只有一个等号,换个思路。
html
小村儿19 分钟前
一起吃透 Claude Code,告别 AI 编程迷茫
前端·后端·ai编程
牛十二19 分钟前
openclaw安装mcporter搜索小红书
开发语言·javascript·ecmascript
小金鱼Y28 分钟前
🔥 前端人必看:浏览器安全核心知识点全解析(XSS/CSRF/DDoS)
前端·javascript·安全
ZhengEnCi29 分钟前
M1-如何转换为HTML
python·html
时寒的笔记32 分钟前
js逆向05_ob混淆花指令,平坦流,某麦网(突破ob混淆寻找拦截器)
开发语言·前端·javascript
ZengLiangYi37 分钟前
从文章到脚本:把 Git Tag + Semver + CI/CD 收敛成一个 `release.mjs`
前端·github
im_AMBER43 分钟前
Lexical依赖版本冲突与标题渲染
前端·react.js·前端框架
起风了___1 小时前
解决大数据渲染卡顿:Vue3 虚拟列表组件的完整实现方案
前端·程序员
前端fun1 小时前
React如何远程加载组件
前端·react.js