基于 js 制作一个贪吃蛇小游戏

news2024/11/29 3:59:30

目录

  • 前言:
  • 项目效果展示:
  • 代码实现思路:
  • 使用方法:
  • 实现代码:
  • 总结:

前言:

在工作学习之余玩一会游戏既能带来快乐,还能缓解生活压力,跟随此文一起制作一个小游戏吧。

描述:
贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。

功能按键:
W:向上
S:向下
A:向左
D:向右
其他:全部为暂停


项目效果展示:

在这里插入图片描述


代码实现思路:

  1. 设置需要使用的参数
  2. 双重 for 循环设置网格对象,使用随机数设置食物。
  3. 设置贪吃蛇对象,首先清空所有,然后根据保存的位置添加贪吃蛇
  4. 设置键盘按下事件
  5. 判断需要的几个按键,w,s,a,d(上,下,左,右)
  6. 判断是否撞墙,撞到墙则停止游戏。
  7. 判断是否吃到食物,食物消失,贪吃蛇长大
  8. 点击重新开始游戏

使用方法:

新建一个后缀为 HTML 的文件,然后把下面的代码复制进去,然后双击打开。
当然也可以直接通过下面链接进行下载,下载完成后双击打开即可。
点击进行下载:https://download.csdn.net/download/weixin_62897746/87377763


实现代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>贪吃蛇</title>
    <style>
        body{
            text-align: center;
        }
        .box{
            margin: 0 auto;
            border: 1px solid #ddd;
            display: flex;
            flex-wrap: wrap;
        }
        .item{
            box-sizing: border-box;
            border: 1px solid #ddd;
        }
        .player{
            background-color: #444;
        }
        .eat{
            background-color: rosybrown;
        }
        #btn{
            margin-top: 20px;
            font-size: 23px;
            color: #fff;
            border: 1px solid #000;
            border-radius: 5px;
            padding: 10px 25px;
            background-image: linear-gradient(to right,#ff00ad,#f09876);
        }
    </style>
</head>
<body>
    <h1>贪吃蛇大作战</h1>
    <p id="text"></p>
    <div class="box"></div>
    <button id="btn">开始</button>
</body>
<script>
    sessionStorage.setItem('id',0)
    function kaishi(){
        // 行
        const x = 20
        // 列
        const y = 20
        // 盒子大小
        const size = 20
        // 地图
        const box = document.querySelectorAll('.box')[0]
        // 网格对象
        const result = []
        // 贪吃蛇对象
        const player = [
            [1,1]
        ]
        // 贪吃蛇对象
        const updatePlayer =()=>{
            // 清除所有对象
            document.querySelectorAll('.player').forEach(v=>v.classList.remove('player'))
            player.forEach(v=>{
                // 根据网格所在位置设置贪吃蛇对象,移动
                document.querySelector(`[data-v="${v.join('-')}"]`).classList.add('player')
            })
        }
        let key = ''
        // 循环设置网格
        for(let i=0; i<x; i++){
            for(let j=0; j<y; j++){
                // 随机数,食物
                const isEat = Math.random() > 0.9
                // 添加网格对象
                result.push(`<div data-v="${i}-${j}" class="item ${isEat ? 'eat' : ''}" style="width:${size}px;height:${size}px"></div>`)
            }
        }
        // 把内容转换为字符串
        box.innerHTML = result.join('')
        // 设置宽
        box.style.width = `${x*size}px`

        // 触发事件
        document.addEventListener('keydown',e=>{
            // 保存触发事件
            key = e.key
        })

        // 定时器
        const intervalId = setInterval(()=>{
            // 显示分数,和历史最高分
            document.getElementById('text').innerHTML = `当前分为${player.length}分,历史最高分为${sessionStorage.getItem('id')}`
            if(key){
                // 保存贪吃蛇所在位置
                const needPos = JSON.parse(JSON.stringify(player.slice(0,player.length-1)))
                // 判断触发事件
                switch(key){
                    case 'w':
                        player[0][0] -= 1
                        break;
                    case 'a':
                        player[0][1] -= 1
                        break;
                    case 's':
                        player[0][0] += 1
                        break;
                    case 'd':
                        player[0][1] += 1
                        break;
                }
                // 是否撞墙
                const el = document.querySelector(`[data-v="${player[0].join('-')}"]`)
                // 判断是否撞墙
                if(!el){
                    // 停止定时器
                    clearInterval(intervalId)
                    // 判断当前分是否超过历史最高分
                    if(sessionStorage.getItem('id') < player.length){
                        // 更改分数
                        sessionStorage.setItem('id',player.length)
                    }
                    alert('撞墙了')
                    isKey = true
                }else{
                    // 改变保存贪吃蛇的位置
                    for(let i=1; i<player.length; i++){
                        player[i] = needPos[i-1]
                    }
                    // 判断是否迟到食物
                    if(el.className.indexOf('eat') >= 0){
                        // 删除食物
                        el.classList.remove('eat')
                        // 贪吃蛇增长
                        player.push([...player[0]])
                    }
                    // 调用贪吃蛇使他发生改变
                    updatePlayer()
                }
            }
        },100)
        updatePlayer()
    }
    kaishi()
    let isKey = true
    // 点击开始
    document.getElementById('btn').onclick=()=>{
        if(isKey){
            kaishi()
            isKey = false
        }
    }
</script>
</html>

总结:

以上就是 基于 js 制作一个贪吃蛇小游戏,不懂得也可以在评论区里问我或私聊我询问,以后会持续发布一些新的功能,敬请关注。
我的其他文章:https://blog.csdn.net/weixin_62897746?type=blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESXI8.0一键安装黑群晖DSM7

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

如何做好项目管理

项目管理概述 什么是项目 项目 是为创造独特的产品、服务或者成果而进行的临时性工作 项目三要素&#xff1a;临时性、独特性、渐进明确性 什么是项目管理 项目管理通过合理运营和整合项目相关活动&#xff0c;以满足项目目标达成的过程 项目与日常工作的区别 项目&…

设计测试用例

⭐️前言⭐️ 这篇文章主要介绍测试用例相关的知识&#xff0c;一个优秀的测试人员&#xff0c;需要具备设计优秀测试用例的能力。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获&…

基于启发式蝙蝠算法、粒子群算法、花轮询算法和布谷鸟搜索算法的换热器PI控制器优化(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 本文采用蝙蝠算法、粒子群优化、花轮询算法和布谷鸟搜索算法&#xff0c;对管壳式换热器的控制系统进行了建模和计算机仿真。为…

trie树入门

trie树分为普通的trie树和01trie树两者可以实现成树&#xff0c;很大一部分原因是&#xff1a;只有26个字母和01两种状态&#xff0c;一个结点度数不会太大&#xff0c;而且字符串长度和位数不会很大&#xff0c;更容易存储普通trie树维护了一堆字符串集合的前缀&#xff0c;in…

Elastic-Job分布式任务调度(4):Elastic-Job高级

1 事件追踪 Elastic-Job-Lite在配置中提供了JobEventConfiguration&#xff0c;支持数据库方式配置&#xff0c;会在数据库中自动创建JOB_EXECUTION_LOG和JOB_STATUS_TRACE_LOG两张表以及若干索引&#xff0c;来记录作业的相关信息。 1.1 修改Elastic-Job配置类 在ElasticJo…

电商人必读:2022中国电商市场发展洞察报告(人群、品类、品牌、玩法).pdf(附下载链接)...

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年12月份热门报告盘点罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿《底层逻辑》高清配图华为2021数字化转型&#xff1a;从战略到执行.pdf华为项目管理金种…

如何理解操作系统

路灯很多&#xff0c;希望你找到自己的月亮。 作者&#xff1a;阿润菜菜 目录 操作系统是什么 为什么设计操作系统 理解操作系统的作用 如何理解操作系统对软硬件管理&#xff1f; 操作系统为什么要对软硬件资源进行管理呢&#xff1f; 什么是系统调用和库函数 总结 操…

【docker13】Redis面试题

面试题 问题&#xff1a; 1~2亿条数据需要缓存&#xff0c;请问如何设计这个存储案例&#xff1f; 回答&#xff1a; 单机单台不可能的&#xff0c;肯定是分布式存储&#xff08;那如何用redis实现呢&#xff1f;) 解决1&#xff1a; 哈希取余分区 优点&#xff1a; 简单粗暴…

项目管理系统的类型

“系统”一词有两个不同的定义&#xff1a;一、定义某事如何完成的原则和程序&#xff0c;二、复杂整体的部分。因此&#xff0c;根据所使用的定义&#xff0c;项目管理系统也可以有两种不同的含义。 第一个是指定义如何执行项目的完整过程和原则系统。此定义包括所有项目管理以…

windows10上安装Python3.11.1

1&#xff09;下载Python3.11.1 Python官网下载地址&#xff1a;https://www.python.org/ package意思是下载压缩安装包&#xff0c;installer是.exe的安装程序。 根据自己电脑需求选择&#xff0c;这里我选择的是64位 2&#xff09;安装 双击安装包&#xff0c;进行安装。…

VScode编译调试C++环境

首先去官网下载vscodehttps://code.visualstudio.com/ 为了编译C/C&#xff0c;要使用gcc&#xff0c;Windows本身不支持gcc&#xff0c;所以有了MinGW&#xff0c;我用的是dev带的MinGW&#xff0c;也可以自己安装MinGW&#xff0c;或者用VS的编译器&#xff08;MinGW gcc下载…

喜报!COSCon'22中国开源年会获评 2022 中国最受开发者欢迎的技术活动

2023 年 1 月 5 日&#xff0c;中国技术先锋年度评选2022 中国最受开发者欢迎的技术活动榜单正式发布。作为中国领先的新一代开发者社区&#xff0c;SegmentFault 思否依托社区活动板块&#xff08;https://segmentfault.com/events&#xff09;及全站数百万开发者用户行为数据…

浏览器怎么录制网页视频?3种网页视频录制方法

我们每天都会在浏览器上观看大量的视频&#xff0c;尤其是在爱奇艺、腾讯、哔哩哔哩等网页上。有时候就会观看到一些精彩的视频画面&#xff0c;就想要将这些画面给下载。那怎么把网页视频录制下来&#xff1f;今天本文就给大家分享3种有效的网页视频录制方法&#xff0c;有需要…

Linux 环境使用定时任务执行shell脚本

前言&#xff1a;Linux添加定时任务需要依赖crond服务&#xff0c;如果没有该服务&#xff0c;需要先安装&#xff1a;yum -y install crontabs 1、crond服务相关命令介绍 启动crond服务&#xff1a;service crond start 停止crond服务&#xff1a;service crond stop 重启cro…

【NI Multisim 14.0原理图设计基础——放置元器件】

目录 序言 &#x1f349; 一、放置元器件 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和仿真。 首先启动NI Multisim 14.0&#xff0c;打开如图所示的启动界面&#xff0c;完成初始化后&…

第一行代码Androiod第三版 笔记 第九章丰富你的程序,运用手机多媒体

文章目录前言一、通知渠道是什么&#xff1f;二、快速入门1. 书写通知2.通知有了 &#xff0c;点击也没动静啊- PendingIntent3 点击完之后&#xff0c;通知不消失怎么办4 通过setStyle() 来是实现长文字通知5 还想放张图6 不同通知之间也有等级差异三、 使用相机7 调用相机8 从…

Linux工具学习之【gcc/g++】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f38a;每篇一句&#xff1a; 图片来源 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 Whatever is worth doing is worth doing well. 任何值得去做的事情&#xff0…

SpringBoot中使用Swagger详解

在Spring Boot中规范的使用Swagger进行接口测试 文章目录Swagger是什么&#xff1f;为什么要用Swagger&#xff1f;准备工作创建项目编写接口验证高级配置文档注释接口过滤自定义响应SwaggerUI的使用遇到的问题&#xff1a;Swagger是什么&#xff1f; Swagger是一套基于OpenAP…

【Kubernetes 企业项目实战】02、基于 Prometheus 和 K8s 构建智能化监控告警系统(上)

目录 一、Prometheus 基本介绍 二、Prometheus 特点 样本 三、Prometheus 组件介绍 四、Prometheus 工作流程 五、Prometheus 和 zabbix 对比分析 六、Prometheus 的几种部署模式 6.1 基本高可用模式 6.2 基本高可用 远程存储 6.3 基本 HA 远程存储 联邦集群方案…