JavaScript做一个贪吃蛇小游戏,无需网络直接玩。

news/2024/7/10 23:06:59 标签: javascript, 网络, 前端, 开发语言, ecmascript, jquery

用JavaScript做一个贪吃蛇小游戏,无需网络 => 打开即可玩。


html代码:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>

        #game{
            width: 344px;
            background-color: #000;
            padding: 20px 8px;
            margin: 100px auto;
        }

        #score{
            color: #B7D4A8;
            text-align: center;
            font-size: 20px;
            font-weight: bold;
            margin-bottom: 10px;
        }

        #bg{
            width: 304px;
            height: 304px;
            background-color: #B7D4A8;
            padding: 20px;
            border-radius: 5%;
        }
        
        #main{
            width: 300px;
            height: 300px;
        /*    设置边框*/
            border: 2px solid black;
            position: relative;
        }
        
        #food, .part{
            width: 8px;
            height: 8px;
            background-color: #000;
            border: 1px solid #B7D4A8;
            position: absolute;
            top: 0;
            left: 0;
        }

        #food{
            top: 50px;
            left: 100px;
        }
        
    </style>
    <script>

        /*
            1.页面的布局
                - 注意事项:
                    背景颜色 #B7D4A8
                    窗口大小(10的倍数)
                        蛇的大小 10px(可见框)
                        食物的大小 10px(可见框)

             2.随机设置食物的位置
                修改食物的top和left值(范围0-290)
                并且必须是10的倍数

             3.设置蛇的移动
                蛇的速度 10px
                检查蛇是否吃到食物(蛇头的坐标和食物一致)
                记分

             4.吃到食物蛇的身体要增加
                - 设置身体的位置?

             5.设置游戏的结束机制
                - 撞墙
                - 撞自己
         */

        window.onload = function () {
            //获取食物的对象
            var food = document.getElementById('food')
            //获取主窗口
            var main = document.getElementById('main')
            //获取蛇头
            var head = document.getElementById('head')
            //获取蛇
            var snake = document.getElementById('snake')
            //获取蛇的所有的部分
            var parts = document.getElementsByClassName('part')

            //创建一个变量,存储最大的left和top
            var MAXLEFT = main.clientWidth - 10 // 290
            var MAXTOP = main.clientHeight - 10 // 290

            //创建一个变量,表示蛇头的运动方向
            var dir = null
            //创建一个变量,表示蛇的速度
            var speed = 10
            //创建一个变量,存储用户的分数
            var score = 0
            //获取分数的span
            var scoreText = document.getElementById('score_text')


            //创建一个定时器用来控制蛇的运动
            var timer = setInterval(function () {
                //获取蛇头当前的位置
                var left = head.offsetLeft
                var top = head.offsetTop


                switch (dir) {
                    case 'ArrowDown':
                    case 'Down':
                        //向下
                        top += 10
                        if(parts[1] && top === parts[1].offsetTop){
                            top -= 20
                        }
                        break
                    case 'ArrowUp':
                    case 'Up':
                        //向上
                        top -= 10
                        if(parts[1] && top === parts[1].offsetTop){
                            top += 20
                        }
                        break
                    case 'ArrowLeft':
                    case 'Left':
                        //向左
                        left -= 10
                        //如果蛇头的left值,和第二节身子的left一样了,则说明蛇掉头了
                        if(parts[1] && left === parts[1].offsetLeft){
                            left += 20
                        }
                        break
                    case 'ArrowRight':
                    case 'Right':
                        //向右
                        left += 10
                        if(parts[1] && left === parts[1].offsetLeft){
                            left -= 20
                        }
                        break
                }

                //检查蛇是否撞墙
                if(left < 0 || left > MAXLEFT || top < 0 || top > MAXTOP){
                    clearInterval(timer)
                    alert('撞墙了,游戏结束!')
                    return
                }


                //检查蛇是否吃到食物
                if(left === food.offsetLeft && top === food.offsetTop){
                    //进入判断,证明蛇吃到了食物(蛇头与食物重合)
                    //加分
                    score++
                    // 000000001    00000000100
                    scoreText.innerHTML = ('00000000' + score).slice(-8)


                    //蛇变长..
                    //创建一个表示蛇的div
                    var body = document.createElement('div')

                    //设置class,part
                    body.className = 'part'

                    //设置蛇身体的位置, 获取最后一个元素的位置
                    //parts是一个数组,里边保存了蛇所有,包括蛇头和身体
                    body.style.left = parts[parts.length - 1].offsetLeft + 'px'
                    body.style.top = parts[parts.length - 1].offsetTop + 'px'


                    //将身体添加到蛇里边
                    snake.appendChild(body)

                    //改变食物的位置
                    changeFood(food)
                }


                //设置身体的位置,将当前身体设置为它前一个身体的位置
                for(var i=parts.length-1 ; i>0 ; i--){

                    var pLeft = parts[i-1].offsetLeft
                    var pTop = parts[i-1].offsetTop

                    //检查蛇头的坐标是否和身体重合
                    if(left === pLeft && top === pTop){
                        //撞到自己了
                        clearInterval(timer)
                        alert('撞自己了,游戏结束!')
                        return

                    }


                    parts[i].style.left = pLeft + 'px'
                    parts[i].style.top = pTop + 'px'
                }


                //修改蛇的位置
                head.style.left = left + 'px'
                head.style.top = top + 'px'


            },200)

            //创建一个数组,存储所有的方向键的值
            var keys = ['ArrowDown','ArrowUp','ArrowLeft','ArrowRight','Right','Up','Left','Down']

            //绑定一个键盘事件
            document.onkeydown = function (event) {
                //检查用户按的是否是方向键
                if(keys.indexOf(event.key) !== -1){
                    //修改dir的值
                    dir = event.key
                }

            }


            //定义一个函数,来随机生成food的位置
            function changeFood(food) {
                //随机生成left和top
                // left 和 top 应该是10的倍数
                var left = Math.round(Math.random() * (MAXLEFT/10)) * 10
                var top = Math.round(Math.random() * (MAXTOP/10)) * 10

                //修改food的位置
                food.style.left = left+'px'
                food.style.top = top + 'px'
            }

            // setInterval(function () {
            //     changeFood(food)
            // },500)


        }

    </script>
</head>
<body>

<div id="game">
    <div id="score">
        score:<span id="score_text">00000000</span>
    </div>
    <div id="bg">
        <!--游戏的主窗口-->
        <div id="main">
<!--            创建表示蛇的元素-->
            <div id="snake">
                <div id="head" class="part"></div>
            </div>

<!--            定义食物-->
            <div id="food"></div>

        </div>
    </div>
</div>


</body>
</html>

在浏览器打开该文件:

直接按上下左右键就可以玩起来了

撞墙了=>刷新网页即可重新开始哦:

欢迎关注我的原创文章:小伙伴们!我是一名热衷于前端开发的作者,致力于分享我的知识和经验,帮助其他学习前端的小伙伴们。在我的文章中,你将会找到大量关于前端开发的精彩内容。

学习前端技术是现代互联网时代中非常重要的一项技能。无论你是想成为一名专业的前端工程师,还是仅仅对前端开发感兴趣,我的文章将能为你提供宝贵的指导和知识。

在我的文章中,你将会学到如何使用HTML、CSS和JavaScript创建精美的网页。我将深入讲解每个语言的基础知识,并提供一些实用技巧和最佳实践。无论你是初学者还是有一定经验的开发者,我的文章都能够满足你的学习需求。

此外,我还会分享一些关于前端开发的最新动态和行业趋势。互联网技术在不断发展,新的框架和工具层出不穷。通过我的文章,你将会了解到最新的前端技术趋势,并了解如何应对这些变化。

我深知学习前端不易,因此我将尽力以简洁明了的方式解释复杂的概念,并提供一些易于理解的实例和案例。我希望我的文章能够帮助你更快地理解前端开发,并提升你的技能。

如果你想了解更多关于前端开发的内容,不妨关注我的原创文章。我会不定期更新,为你带来最新的前端技术和知识。感谢你的关注和支持,我们一起探讨交流技术共同进步,期待与你一同探索前端开发的奇妙世界!


http://www.niftyadmin.cn/n/5435768.html

相关文章

Aloudata 倾力打造,《Data Fabric 白皮书 2.0》正式发布

数字经济时代&#xff0c;越来越多企业开始寻求全新的数据管理范式&#xff0c;以更有效地管理、利用不断增长的数据资产。在此背景下&#xff0c;Data Fabric 的概念应运而生&#xff0c;被视为面向未来的数据管理解决方案。 距离第一版白皮书问世已经过去一年多时间&#xff…

Mongo 常用操作命令

一、查询都有哪些数据库 show dbs二、切换到指定数据库 use database 三、删除数据库 注意&#xff1a;需要先切换到指定数据库&#xff0c;再执行删除指令 db.dropDatabase()四、显示数据库都有哪些数据表 show tables 五、查看整个数据库的统计情况 db.stats() 六、查…

WEB前端作业一

作业1:生成表格 模版 <!DOCTYPE html> <html><title>作业表格一</title><body><h1><b>工商银行电子汇款单</b></h1><p><table border"1" cellspacing"0"><tr><td colspan&qu…

Seata中四种模式的适用场景

Seata 是一个开源的分布式事务解决方案&#xff0c;用于确保在微服务架构下进行分布式事务时的一致性。 它提供了四种模式来处理分布式事务&#xff0c;分别是&#xff1a;AT模式、TCC模式、SAGA模式和XA模式。 每种模式都有其特定的适用场景&#xff1a; 1. AT模式&#xff…

鸿鹄云商B2B2C:JAVA实现的商家间直播带货商城系统概览

【saas云平台】打造全行业全渠道全场景的saas产品&#xff0c;为经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营场景…

Pycharm专业版远程连接服务器并运行深度学习项目

Pycharm远程连接服务器并运行代码&#xff08;详细&#xff01;&#xff09;_pycharm连接服务器-CSDN博客

UML图——用例图

一、Systems 系统 二、Actors 参与者 参与者放在系统外 主要参与者放在系统的左边 次要参与者放在系统的右边 三、Use Cases 用例 用例放在系统内&#xff0c;一般用用例描述每个动作 四、Relationships 关系 &#xff08;一&#xff09;Association 关联 &#xff08…

Docker 哲学 - docker-compose.yml 管理多个容器

compose 启动容器的 volume 和 network名字的生成规则 如果在 docker-compose.yml 文件中没有明确定义 networks&#xff0c;Docker Compose 会默认为所有服务创建一个默认的网络。 如果你想自定义网络&#xff0c;你可以在 docker-compose.yml 文件的顶级定义 networks 2、com…