原生JS实现贪吃蛇游戏

2023-11-17

原生JS实现贪吃蛇游戏

贪吃蛇游戏(原生JavaScript)

贪吃蛇游戏思路分析

游戏思想:

面向对象的思想
  • 三个js文件分别代表三个对象
  • 三个对象相互独立,在HTML中控制全局
使用面向对象思想的好处

贪吃蛇游戏采用面向对象的思想去实现,我们的食物还有蛇以及地图是相互独立的,不会对彼此产生影响,可以单独调用

贪吃蛇游戏对象分析

游戏的场景(一个大的div)

  • 场景的大小

  • 场景的边框

  • 场景在浏览器中的位置

游戏的主角(每一节是一个小的div)

蛇的属性
  • 蛇的初始长度(四节)

  • 蛇的每一节的形状

  • 蛇的每一节的尺寸

  • 蛇的颜色(蛇头的颜色,蛇身的颜色)

  • 蛇的初始位置在哪

蛇的行为
  • 可以自己移动,每一次移动一节的蛇身长

  • 可以通过键盘控制方向

  • 可以吃食物,并且吃完以后会长一节

食物

食物的属性
  • 食物的大小

  • 食物的颜色(随机)

  • 食物的位置(随机)

  • 食物的形状(圆形)

食物的方法
  • 食物被蛇吃掉以后可以改变位置(随机)

附加项

游戏场景附加项

  • 游戏的障碍
  • 游戏的计分功能
  • 游戏中蛇的最长记录

游戏的主角附加项

  • 蛇可以加速
  • 游戏的关卡设置

游戏的附加项大家有兴趣的话可以自己去尝试着添加,有什么问题,可以在下方评论进行讨论!

废话少说,直接上源码!

index.HTML

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>贪吃蛇</title>
    <!-- 将三个js文件,通过外联的方式进行引入 -->
    <script src="地图.js"></script>
    <script src="蛇.js"></script>
    <script src="食物.js"></script>
</head>

<body>
    <script>
        //主界面HTML实现对游戏的全局控制
        //一,创建地图,并将地图添加到body中
        //实例化map对象
        var map = new Game_Map();
        //将map对象添加到body中
        document.body.appendChild(map);
        //三,创建食物
        //计算食物随机出现的范围是多少
        var countX = (map.offsetWidth - 40) / 20;
        var countY = (map.offsetHeight - 40) / 20;
        //实例化蛇对象,并且传参.
        var food = new Food(countX, countY, map);
        //二,创建蛇
        var snake = new Snake(3, 0, map, food)
    </script>
</body>

</html>

地图.js

//游戏场景
//我们使用构造函数来写游戏场景
function Game_Map() {
    // 用对象的属性来设置游戏场景的大小
    this.width = 1000;
    this.height = 800;
    //创建一个div来表示游戏场景
    var map = document.createElement("div");
    // 设置创建的div的长和宽
    map.style.width = this.width + "px";
    map.style.height = this.height + "px";
    //设置盒子的背景颜色
    map.style.backgroundColor = "rgba(211, 211, 211, 0.315)";
    // 设置盒子的边框
    map.style.border = "20px solid skyblue";
    //设置盒子的位置
    map.style.margin = "50px auto";
    //给地图一个相对定位(子绝父相)
    map.style.position = "relative";
    //返回值返回创建的div就是map
    return map
}

蛇.js

//蛇对象
//面向对象使用构造函数
function Snake(xindex, yindex, parent, food = null) {
    //使用构造函数的属性来设置蛇的长还有每一节的大小
    this.length = 4;
    this.size = 20;
    //获取传递的food
    this.food = food;
    //定义一个数组来存放蛇身
    this.list = new Array();
    // 一,创建蛇
    //蛇的的长度是4,所以我们使用for循环来创建
    for (var i = 0; i < this.length; i++) {
        //创建蛇的div
        var item = document.createElement("div");
        //设置蛇的每一节的宽和高
        item.style.width = item.style.height = this.size + "px";
        //蛇的每一节是圆形,所以我们使用圆角边框
        item.style.borderRadius = "100%";
        // 使用if判断让蛇头的的颜色和身体的颜色不一样
        if (i == 0) {
            item.style.backgroundColor = "red";
        }
        else {
            item.style.backgroundColor = "green";
        }
        //蛇是在地图里面所以蛇使用的是绝对定位
        item.style.position = "absolute";
        //定义蛇的初始位置,我们一开始给蛇的传递两个参数,来设置蛇的初始位置
        //给的csx使用for循环是0  1  2  3 所以我们给的值是从右到左一个一个放置蛇身,csx是蛇身的初始横坐标
        item.style.left = (xindex - i) * this.size + "px";
        //给的csy是她的初始纵坐标
        item.style.top = yindex * this.size + "px";
        //给蛇设置一个自定义标签,为蛇当时的方向
        item.setAttribute("dir", "right");
        //把蛇身一节一节的放入到数组中
        this.list[i] = item;
        //然后再一节一节的添加到我们的map中
        parent.appendChild(item);
    }
    // move函数
    function move(list, size, food = null) {
        //for循环遍历让蛇进行移动
        for (var i = 0; i < list.length; i++) {
            //判断蛇的移动方向
            if (list[i].getAttribute("dir") === "down") {
                //移动之前先判断一下是否碰到墙了
                if (list[0].style.top == 800 + "px") {
                    // 碰到的话,游戏结束
                    alert("游戏结束!")
                } else {
                    //没有碰到继续
                    list[i].style.top = list[i].offsetTop + size + "px";
                }

            } else if (list[i].getAttribute("dir") === "up") {
                if (list[0].style.top == -20 + "px") {
                    alert("游戏结束!")
                } else {
                    list[i].style.top = list[i].offsetTop - size + "px";
                }

            } else if (list[i].getAttribute("dir") === "left") {
                if (list[0].style.left == -20 + "px") {
                    alert("游戏结束!")
                } else {
                    list[i].style.left = list[i].offsetLeft - size + "px";
                }

            } else if (list[i].getAttribute("dir") === "right") {
                if (list[0].style.left == 1000 + "px") {
                    alert("游戏结束!")
                } else {
                    list[i].style.left = list[i].offsetLeft + size + "px";
                }

            }
        }
        //让dir属性进行传递,使得蛇身和蛇头一起向同一方向移动
        for (var i = list.length - 1; i > 0; i--) {
            list[i].setAttribute("dir", list[i - 1].getAttribute("dir"));
        }
        //判断食物是否出现
        if (food == null) {
            console.log(null);
            return;
            // 食物出现的话,判断如果蛇头和食物的位置重叠的话,那么就让食物重新定义一个新的随机位置,并且调用蛇长身体的方法
        } else if (list[0].style.left == food.food.style.left && list[0].style.top == food.food.style.top) {
            food.setPosition();
            group();
        }
    };
    //二,实现蛇的移动
    this.movetime = setInterval(move, 100, this.list, this.size, this.food,);

    // 三,控制转弯
    document.addEventListener("keydown", changeDir,);
    var list = this.list;
    function changeDir(e) {
        switch (e.keyCode) {
            // 向上
            case 38:
                list[0].setAttribute("dir", "up");
                break;
            // 向下
            case 40:
                list[0].setAttribute("dir", "down");
                break;
            // 向左
            case 37:
                list[0].setAttribute("dir", "left");
                break;
            // 向右
            case 39:
                list[0].setAttribute("dir", "right");
                break;
        }
    }
    // 【4】蛇长身体
    var group = function () {
        // 蛇头和食物重叠以后,蛇身要长长一节,所以创建一个div,设置属性,加到蛇身的最后一节上
        var item = document.createElement("div");
        item.style.width = item.style.height = "20px";
        item.style.borderRadius = "100%";
        item.style.backgroundColor = "green";
        item.style.position = "absolute";
        item.style.left = list[list.length - 1].style.left;
        item.style.top = list[list.length - 1].style.top;
        list[list.length] = item;
        parent.appendChild(item);
    }
}

食物.js

//食物对象
//构造一个食物对象函数
function Food(countX, countY, body) {
    //设置食物的大小
    this.size = 20;
    // 创建食物,设置食物的属性
    this.food = document.createElement("div");
    this.food.style.width = this.food.style.height = this.size + "px";
    this.food.style.borderRadius = "50%";
    this.food.style.position = "absolute";
    //定义食物的随机位置以及随机的颜色
    this.setPosition = function () {
        this.food.style.left = Math.floor(Math.random() * countX) * this.size + "px";
        this.food.style.top = Math.floor(Math.random() * countY) * this.size + "px";
        this.food.style.backgroundColor = `rgb(${Math.floor(Math.random() * 256)},${Math.floor(Math.random() * 256)},${Math.floor(Math.random() * 256)})`;
    }
    this.setPosition();
    body.appendChild(this.food);
}

注:本人小白一个,代码有什么问题的话,希望大家可以提出来,本人会及时改正!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原生JS实现贪吃蛇游戏 的相关文章

随机推荐

  • YOLOV2个人理解总结

    YOLOv2框架图 YOLOv2改进之处 1 Batch Normalization BN Batch Normalization 层简单讲就是对网络的每一层的输入都做了归一化 这样网络就不需要每层都去学数据的分布 收敛会快点 原来的YOL
  • 面试题:如何测试登录功能

    最近在做一个创新项目 这个项目有二个平台 每个平台都有前后端 故有四个系统 每个系统都有登录功能 而且不同系统代码设计方式都有所差异 所以就这个登录功能而言就要测试四次 看似一个简单的登录功能其中设计的测试点也是相当复杂 今天就讲讲如何测试
  • php scp跨服器拷贝文件到sftp

    一般要装php的ssh2扩展 比较麻烦 所以转念一想 为什么不用我们经常用的scp 但是scp跨服务器拷贝需要输入密码 这里就用到了一个工具试试sshpass 可以指定密码 1 工具安装 ubuntu安装 sudo apt get inst
  • 【问题解决】org.springframework.dao.QueryTimeoutException: Redis command timed out; nested exception is io

    1 出现问题异常 核心错误输出 org springframework dao QueryTimeoutException Redis command timed out nested exception is io lettuce cor
  • B站马士兵python入门基础版详细笔记(3)

    一 input函数的使用 他的返回值类型一定是str类型 m1 input please input the first word m2 input please input the second word print int m1 int
  • c++库 Android调用

    如果您想在Android应用程序中使用C 库 您可以通过以下几个步骤封装C 库以供Android调用 创建一个新的Android项目并设置C 支持 在Android Studio中创建一个新的Android项目 并选择包含C 支持的选项 将
  • [学C日记]---递归

    递归 自己调用自己 大事化小 必要条件 1 有限制条件 当满足限制条件时 递归便不继续 2 每次递归调用之后越来越接近这个限制条件 3 递归层次不能太深 太深容易栈溢出 每次递归调用都要给函数分栈区 次数过多容易空间不足 1 一串数字挨个输
  • 深聊自动化测试之:小鱼整理21条避坑指南,让你完美运行自动化

    自动化测试避坑总结 1 引言 2 避坑内容总结 2 1无法定位到元素 2 2 Indentation Error 2 3 PO设计模式类 2 4 页面封装类中没有已定义函数的问题 2 4 1 提示没有该方法 2 4 2 没有定义好的函数 2
  • Android Netd

    一 概述 所谓 Netd 就是Network Daemon 的缩写 表示Network守护进程 类似的命名还有很多 例如 Vold Volumn Deamon Rild Radio Interface Layer Deamon Netd负责
  • 根据面试的过程修正2022年学习规划

    上周由于全员降薪 所以对于在招聘网站上这30天内主动给我打招呼的hr和猎头 我都投了简历 结果是投简历16家公司 给与面试机会的七家 斩获了两家offer 一家七百多人的军事仿真类的公司 一家小到不能再小的ue4公司 好的方面是还能找到工作
  • python爬虫-33个Python爬虫项目实战(推荐)

    今天为大家整理了32个Python爬虫项目 整理的原因是 爬虫入门简单快速 也非常适合新入门的小伙伴培养信心 所有链接指向GitHub 祝大家玩的愉快 O O WechatSogou 1 微信公众号爬虫 基于搜狗微信搜索的微信公众号爬虫接口
  • Redis6.2/5.0 集群两种快速搭建方式

    一 集群常识 1 redis在3 0之前是集群 仅支持单实例的 3 0以后开始支持集群 2 3 0的集群命令也不是那么亲和 需要用ruby编写的脚本 而且需要登录redis客户端操作 启动 增删节点 移动槽位等 redis 5 0以后 可以
  • 楚留香获取服务器信息卡住了,楚留香手游角色卡住不动怎么办 卡死解决办法...

    楚留香手游角色卡住不动怎么办 来看看卡死解决办法 由于手机 网络和服务器等等原因 玩家会出现角色卡住动不了 操作界面消失 无法切换场景等等情况 非常影响游戏体验 来看看怎么解决吧 楚留香手游角色卡住不动怎么办 如果您在游戏中遇到角色卡住 无
  • 建立docker私有hub

    docker是一个非常好用的虚拟化工具 下面给出建立私有docker hub的方法 docker将私有hub的环境打包在registry image中 执行指令 docker run p 5000 5000 registry 这条指令启动一
  • F - LIS on Tree

    F LIS on Tree atcoder jp 问题描述 树上LIS 普通LIS O n n void solve int n cin gt gt n vector
  • 【Allegro 17.4软件操作保姆级教程二】布局前准备

    由于Allegro 17 2软件出了故障 干脆新安装了17 4版本 后续的教程截图都用17 4的 操作逻辑是差不多的 1 生成和导入网表 1 原理图绘制完成 导出网表 在Capture中 选中原理图dsn文件 tools create ne
  • 企业服务端接口认证案例

    接口认证方式 调用方要向管理员获取 appkey 和 secret appkey 调用方唯一标识 方便 HTTP API 统计与维护 secret 密钥 用于生成 HTTP API 校验所需的 token 值 调用方每次请求都需要带上当前时
  • PPP协议、PPPoE协议、L2TP协议的关系

    1 简述 首先对这3中协议做一个简单的描述 协议 协议类型 描述 PPP 点对点链路层协议 应用最广泛的点对点协议 可应用在多种网络 改善了SLIP协议的不足 PPPoE 点对点链路层协议 对PPP协议进行扩展 将PPP用于以太网上 L2T
  • CNN,Transformer,MLP三分天下

    title 论文列表 1 MLP Mixer MLP Mixer An all MLP Architecture for Vision 2 MetaFormer MetaFormer is Actually What You Need fo
  • 原生JS实现贪吃蛇游戏

    原生JS实现贪吃蛇游戏 贪吃蛇游戏 原生JavaScript 贪吃蛇游戏思路分析 游戏思想 面向对象的思想 三个js文件分别代表三个对象 三个对象相互独立 在HTML中控制全局 使用面向对象思想的好处 贪吃蛇游戏采用面向对象的思想去实现 我