首页 > 编程语言 >JavaScript原生实现《贪吃蛇》

JavaScript原生实现《贪吃蛇》

时间:2023-06-01 10:02:30浏览次数:47  
标签:原生 JavaScript 碰撞 贪吃蛇 offsetLeft offsetTop var document jsSnack


概述


JavaScript原生实现《贪吃蛇》,每吃掉一个食物,蛇的身体会变长,食物会重新换位置。


详细


贪吃蛇大家都不陌生吧~

简单做一个。

一、思路


1.让我们的小蛇动起来

2.随机生成食物

3.每吃掉一个食物,蛇的身体会变长,食物会重新换位置


html界面

<div class="face">
    <!-- 小蛇移动的操场 -->
    <div id="playground">
        <!-- 食物 界面中的蓝色小方块-->
        <div id="food"></div>
        <!-- 小蛇 界面中的红色小方块-->
        <div id="snack"></div>
    </div>
    <!-- 计算得分 -->
    <div class="menu">
        <div>得分<span id="score"></span></div>
    </div>
</div>

css样式

注:

1.蓝色的小方块代表食物;

2.红色的小方块代表小蛇;

3.绿色的小方块代表吃掉怪物后增长的身体;

<style type="text/css">
        .face{
            height: 400px;
            width: 600px;
            margin-left: auto;
            margin-right: auto;
            position: relative;
            background-color: pink;
        }
        #playground{
            height: 400px;
            width: 450px;
            float: left;
            position: relative;
        }
        .menu{
            height: 400px;
            width: 150px;
            float: left;
            background-color: skyblue;
        }
        #snack{
            height: 20px;
            width: 20px;
            background-color: red;
            position: absolute;
            left: 0px;
            top:0px;
        }
        #food{
            height: 20px;
            width: 20px;
            background: blue;
            position: absolute;
        }
        .body{
            height: 20px;
            width: 20px;
            background: green;
            position: absolute;
            left: 0px;
            top:0px;
        }
        #score{
            font-size: 30px;
            font-weight: bold;
            color: red;
        }
        .menu div{
            font-size: 20px;
            font-weight: bold;
        }
    </style>

准备工作

获取元素节点、设置全局变量;


//获取元素节点
    var jsDiv = document.getElementById("playground");
    var jsSnack = document.getElementById("snack");    
    var jsFood = document.getElementById("food");
    var jsBody = document.getElementById("playground");
    var jsScore = document.getElementById("score");
    //设置全局变量
    var timer;//创建定时器为全局变量
    var timer1 = setInterval(eat,10);//检测位置碰撞,并且吃掉食物;
    var srr = [];//记录蛇行动的位置
    var num = 0 ;//记录数组的长度
    var jsSnackBody ;//么米吃掉一个食物,蛇的身体

让我们的小蛇动起来


通过按键盘的上下左右键,控制小蛇的移动方向,并记录小蛇走过的位置。

我们通过什么来获取我们按下的是哪个键??

我们当然通过ASCII码值;

信息在计算机上是用二进制表示的,这种表示法让人理解就很困难。因此计算机上都配有输入和输出设备,这些设备的主要目的就是,以一种人类可阅读的形式将信息在这些设备上显示出来供人阅读理解。为保证人类和设备,设备和计算机之间能进行正确的信息交换,人们编制的统一的信息交换代码,这就是ASCII码表,它的全称是“美国信息交换标准代码”

左-------》对应的ASCII码值是 37;

上-------》对应的ASCII码值是 38;

右-------》对应的ASCII码值是 39;

下-------》对应的ASCII码值是 40;



//开始游戏
    document.onkeydown = function(e){
        var evt = e || window.event;    
            switch(evt.keyCode) {
            //向左移动
            case 37:
                clearInterval(timer);
                timer=window.setInterval(runLeft,10)
                function runLeft(){
                    if (jsSnack.offsetLeft > 0) {
                        jsSnack.style.left = jsSnack.offsetLeft - 1+ "px";
                        jsSnack.style.top = jsSnack.offsetTop + "px";    
                        //记录小蛇的位置
                        srr.push([jsSnack.offsetLeft, jsSnack.offsetTop]);
                        num++;//记录数组的长度
                    }                        
                }
            break;
            //向上移动
            case 38:
                clearInterval(timer);
                timer=window.setInterval(runTop,10);    
                function runTop(){
                    if (jsSnack.offsetTop > 0) {
                        jsSnack.style.top = jsSnack.offsetTop - 1 + "px";
                        jsSnack.style.left = jsSnack.offsetLeft + "px";
                        //记录小蛇的位置
                        srr.push([jsSnack.offsetLeft, jsSnack.offsetTop]);
                        num++;//记录数组的长度
                    }                        
                }

            break;
            //向右移动
            case 39:
                clearInterval(timer);
                timer=window.setInterval(runRight,10);
                function runRight(){
                    if (jsSnack.offsetLeft + jsSnack.offsetWidth <= 450) {
                        jsSnack.style.left = jsSnack.offsetLeft + 1 + "px";
                        jsSnack.style.top = jsSnack.offsetTop + "px";
                        //记录小蛇的位置
                        srr.push([jsSnack.offsetLeft, jsSnack.offsetTop]);
                        num++;//记录数组的长度
                    }                        
                }                    
            break;
            //向下移动    
            case 40:
                clearInterval(timer);
                timer=window.setInterval(runBottom,10);            
                function runBottom(){
                    if (jsSnack.offsetTop + jsSnack.offsetHeight <= 400) {
                        jsSnack.style.top = jsSnack.offsetTop + 1 + "px";
                        jsSnack.style.left = jsSnack.offsetLeft + "px";
                        //记录小蛇的位置
                        srr.push([jsSnack.offsetLeft, jsSnack.offsetTop]);
                        num++;//记录数组的长度
                    }                        
                }                    
            break;
        }
    }



JavaScript原生实现《贪吃蛇》_全局变量



二、检验碰撞详解

这里笔者觉得语言的描述太空洞,还是弄几张图吧,图是笔者手绘的,不要嫌丑,画的是没有碰撞的情况,那取反,就说明碰撞到了。

JavaScript原生实现《贪吃蛇》_全局变量_02

JavaScript原生实现《贪吃蛇》_贪吃蛇_03

JavaScript原生实现《贪吃蛇》_JavaScript原生实现贪吃蛇_04

JavaScript原生实现《贪吃蛇》_JavaScript原生实现贪吃蛇_05


食物随机出现

把食物的随机出现封装在一个函数里,那么我们后续需要的时候可以直接调用。

利用随机数来让食物的位置随机出现。


//食物随机出现
    function Pos(){
        jsFood.style.left=parseInt(Math.random() * (430 - 20 + 1) + 20) + "px";
        jsFood.style.top=parseInt(Math.random() * (380 - 20 + 1) + 20) + "px";
    }
    Pos();


JavaScript原生实现《贪吃蛇》_全局变量_06


创建定时器、检验碰撞

碰撞检测原理:

蛇在实物的左边、右边、上边、下边的时候,说明没有发生碰撞,那么我们取反,就说明发生碰撞


function eat(){
        rectangleCrashExamine(jsSnack,jsFood);
        function rectangleCrashExamine(obj1, obj2) {
            var obj1Left = obj1.offsetLeft;
            var obj1Width = obj1.offsetLeft + obj1.offsetWidth;
            var obj1Top = obj1.offsetTop;
            var obj1Height = obj1.offsetTop + obj1.offsetHeight;
            var obj2Left = obj2.offsetLeft;
            var obj2Width = obj2.offsetLeft + obj2.offsetWidth;
            var obj2Top = obj2.offsetTop;
            var obj2Height = obj2.offsetTop + obj2.offsetHeight;
            //检测碰撞
            //碰撞检测原理:
                //蛇在实物的左边、右边、上边、下边的时候,说明没有发生碰撞,那么我们取反,就说明发生碰撞
            if ( !(obj1Left > obj2Width || obj1Width < obj2Left || obj1Top > obj2Height || obj1Height < obj2Top) ) {
                //碰撞后身体
                jsSnackBody = document.createElement("div");
                jsSnackBody.setAttribute("class","body");
                jsBody.appendChild(jsSnackBody);
                Pos();//怪物的位置随机变换
                setInterval(follow,10);//身体跟随的定时器
            }
        }
    }

身体跟随

每吃掉一个食物,小蛇的长度发生变化



function follow(){
        //检查一共添加了多少身体
        var bodyNum = document.getElementsByClassName("body");
        //记录得分
        jsScore.innerHTML = bodyNum.length;
        //蛇每次移动1个像素,那么新的身体应该跟随在当前数组的倒数第20个数组的位置;依次加等;
        var place = 0 ;
        for( var i = 0 ; i<bodyNum.length ; i++){
            place += 20;
            bodyNum[i].style.left=srr[num-place][0] + 'px';
            bodyNum[i].style.top=srr[num-place][1] + 'px';    
        }
    }



好了,现在我们的游戏可以玩了

三、运行效果与文件截图

1、运行效果:

JavaScript原生实现《贪吃蛇》_JavaScript原生实现贪吃蛇_07

2、文件截图:

JavaScript原生实现《贪吃蛇》_JavaScript原生实现贪吃蛇_08

双击文件即可运行

四、其他补充

这是一个简单的贪吃蛇,并没有做死亡碰撞,喜欢的小伙伴可以继续放下做。



注:本文著作权归作者,由demo大师宣传,拒绝转载,转载需要作者授权



标签:原生,JavaScript,碰撞,贪吃蛇,offsetLeft,offsetTop,var,document,jsSnack
From: https://blog.51cto.com/u_7583030/6392475

相关文章

  • Javascript --常用技巧
    1)使用!!将变量转换成布尔类型有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将它们的值视为true。对于做这样的检查,你可以使用||(双重否定运算符),它能自动将任何类型的数据转换为布尔值,只有这些变量才会返回false:0,null,"",undefined或NaN,其他的都返回true。我们来看看......
  • JavaScript中几种 获取元素的方式
    1.根据id获取元素document.getElementById("id属性的值");2.根据标签名字获取元素document.getElementsByTagName("标签的名字");3.根据name属性的值获取元素document.getElementsByName("name属性的值");4.根据类样式的名字获取元素document.getElementsByClassName("类样式的名......
  • javascript 的 事件类型(事件)
    事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行。事件是文档或者浏览器窗口中发生的,特定的交互瞬间。事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字。事件是javaScript和DOM之间交互的桥梁。你若触发,我便执行——事件发生,调用......
  • 揭开 JavaScript 事件循环的神秘面纱
    Javascript是一种单线程语言,这意味着它一次只能执行一个任务。但是,它仍然设法同时执行多项任务。它通过使用一些复杂的数据结构给人一种多线程的错觉。为实现这一点,Javascript引擎有一个称为事件循环的重要组件。我们将了解什么是事件循环以及它如何在不阻塞主线程的情况下处理异......
  • 是 CI 也是阿拉伯飞毯——腾讯云 CODING CI 3.0 云原生构建
    在没有神灯和飞毯前,阿拉丁只是一名普通的程序员。一天,老板双手环臂,站在阿拉丁的工位旁说:“阿丁,咱们最近公司业务变化快,发版节奏远远跟不上,你思考一下,解决的话请你吃意大利烧饼。”听到意大利烧饼,阿拉丁的口水都流了下来,袖管一擦,鼓足干劲,说干就干,从此踏上寻找解决方案的漫漫征途。......
  • 关于第一次学习JavaScript程序调试心得
    源程序如上,源代码来源(刘永富博士-ExcelVBA编程开发下册)。运行之后,网页无反应,alert不弹窗。经查询https://www.runoob.com/jsref/event-body-onload.htmlhttps://blog.csdn.net/sinat_29398599/article/details/65450485需添加onload事件。Bodyonload事件,onload事件在页......
  • 贪吃蛇游戏代码
    #include<stdio.h>#include<conio.h>#include<stdlib.h>#include<time.h>constintmaxn=100;constintn=20;structnode{ intx,y;};intmap[maxn][maxn];//0表示空格,1表示蛇身,2表示食物,3表示撞死的位置,4表示蛇头.nodefood;nodesquence[m......
  • 极氪汽车 APP 系统云原生架构转型实践
    作者:极氪汽车前言新能源汽车已经成为我国汽车市场再次崛起的关键支柱,随着新能源汽车市场的快速发展,不同类型的品牌造车厂商呈现出百花齐放的态势。极氪汽车是吉利控股集团旗下高端纯电汽车新品牌,2021年4月极氪发布首款高端智能电动车型--极氪001,大获市场好评,截至2022年12......
  • JavaScript中的Hook技术:特性、优点、缺点和使用场景
    引言:随着JavaScript的不断发展,开发者们正在寻找更灵活和可扩展的方式来修改或扩展现有的代码。其中一种广泛应用的技术是"Hook",它允许开发者拦截和修改现有的函数或方法的行为。本文将详细介绍JavaScript中的Hook技术,包括其特性、优点、缺点和使用场景,并提供示例代码进行说明。什么......
  • Javascript上传文件到阿里OSS存储,并支持进度查看
    现在使用js上传文件的插件有很多,例如:plupload等等今天我记录一下使用原生js的上传文件,并且支持进度查看,下面直接上代码:html代码:<inputtype="file"onchange="uploadMedia(this)"><aid="showProgress"style="display:none;"href="#"></a>预览效......