当前位置: 首页 > news >正文

用jquery写贪吃蛇

需要具备知识:
1.html、css基础
2.jquery基础


具体实现方法:

  • 创建游戏界面
.bts
        {
            display: flex;
        }
        .bt
        {
            width: 60px;
            height: 24px;
            line-height: 24px;
            font-size: 18px;
            text-align: center;
            background: #ede;
            margin-left: 20px;
        }
        .bg
        {
            width: 400px;
            height: 400px;
            background: #ddd;
            margin-top: 30px;
            position: relative;
        }


    <div class="bts">
        <div class="start bt" onclick="start()">开始</div>
        <!-- <div class="pause bt" onclick="pause()">暂停</div> -->
    </div>
    <div class="bg">
        
    </div>

其中bts是按钮组,因为开始打算写个暂停,后面放弃了,bt是按钮,bg是游戏界面(大小最好为10,15,20的倍数,比较容易计算游戏内方块的),其中bg(游戏界面背景)是才用relative定位,蛇与食物采用用absolute定位。

  • 定义游戏主要函数

    首先,假设游戏内方块的个数为2020,每个方块的大小为20px20px(当然为了适配手机,可以转换为rem去适配网页大小),蛇与食物的大小为一个方块的大小(food为食物,snakes为蛇)
    其中因为border会在div的外面去渲染,所以,大小为20的方块,实际宽高为18px,加上上下各1px的边框,一个食物与蛇的大小为20px*20px

.snakes,.food
        {
            position: absolute;
            width: 18px;
            height: 18px;
            border: solid 1px #444;
        }
        .snakes
        {
            background: red;
        }
        .food
        {
            background: yellow;
        }

  • 定义游戏中的变量,
    var snakes = [];    //存储蛇的位置
    var stepX = 20;    //默认向X行走的像素
    var stepY = 0;    //默认向Y行走的像素
    var live = false;    //是否存活
    var isPause = false;    //是否暂停 ,未用
    var food = {};    //食物的位置
    var keydown = 'right';    //默认方向为右
start()函数,点击开始游戏时候,执行的操作
start = function(){    //开始
        if(!live)
        {
            stepX = 20;
            stepY = 0;
            keydown = 'right';
            live = true;
            $(".snakes").remove();
            snakes = [];
            drawSnake(3);    //初始化蛇
            snakeMove();    //移动蛇,游戏主要进程
            createFood();    //创建食物
        }
        isPause = false;
        
    }
首先点击游戏开始的时候,需要去初始化一下蛇,让他生成在游戏区域内的左上角,由于采用的是absolute定位,所以,默认的第一个点的位置为top:0;left:0; (看成坐标轴的话,右上角的原点为0,0),定义一个蛇的方块,通过for循环,将蛇画在屏幕的左上角,其中num为默认蛇的长度。然后将创建的元素存成json格式的,push在snakes数组里面。由于push()是往最后面去添加元素,所以蛇的头是snakes里面最后的一个元素
drawSnake = function(num){        //初始化蛇身体
        var item = '<div class="snakes"></div>'
        for(var i=0;i<num;i++)
        {
            $(".bg").append(item)
            $(".snakes").eq(i).css({
                top:0,
                left:20*i
            })
            item1 = {
                top:0,
                left:20*i
            }
            snakes.push(item1)
            //console.log(snakes);
        }
    }
使用setTimeout(),去驱动蛇,由于蛇头是存在数组的最后一位,所以蛇头其实是snakes[snakes.length-1]这个元素,然后,通过for循环,去让蛇的第i个元素的值等于第i+1个值(蛇头是最后一个,所以如果蛇长度为三个的话,先把第一个的位置移动到第第二个的位置,第二个的位置移动到第一个的位置,然后再将蛇头往其他地方移动,就说明蛇移动了),然后setTimeout里面继续递归调用该函数,蛇就会开始移动
snakeMove = function(){        //移动蛇
        if(live){    //判断蛇是否存活,如果存活,则移动蛇,否则弹出游戏结束
            for(var i=0;i<snakes.length-1;i++)
            {
                $(".snakes").eq(i).css({
                    top:snakes[i+1].top,
                    left:snakes[i+1].left
                })
                snakes[i].top = snakes[i+1].top
                snakes[i].left = snakes[i+1].left
            }
            var first = snakes.length-1
            $(".snakes").eq(first).css({
                    top:snakes[first].top+stepY,
                    left:snakes[first].left+stepX
                })
            snakes[first].top = snakes[first].top+stepY;
            snakes[first].left = snakes[first].left+stepX;
            if(!isLive(snakes[first].top,snakes[first].left))
            {
                live = false;
                alert("游戏结束");
            }
            else
            {
                eatFood(snakes[first].top,snakes[first].left);
                setTimeout("snakeMove()",100);        
            }    
        }
    }

将蛇驱动后,开始控制蛇的移动与游戏结束。
isLive = function(top,left){
        if(top>380||top<0||left>380||left<0)    //如果蛇移动到画布外面,则游戏结束,开始坐标是0,0,所以边界值是380,380
        {
            return false;
        }
        else
        {    
            for(var i=0;i<snakes.length-1;i++)    //循环蛇每个元素,判断蛇头是否与他们重合,重合的话,则说明蛇撞到自己,游戏结束
            {
                
                if(top==snakes[i].top&&left==snakes[i].left)    
                {
                    return false;
                    break;
                }
            }
            return true;
        }
    }
    document.onkeydown = function(event) {    //判断点击的按钮,让蛇往不同的方向去走(注意右上角是坐标原点,往下是Y,往右是X)
        //console.log(event);
        if(event.keyCode==38)    //上
        {    
            if(keydown!='down')    //如果往下走,就不能只能摁上,如果直接倒着走,会撞到自己,结束游戏
            {
                keydown='up';
                stepX=0;
                stepY=-20;
            }
        }
        else if(event.keyCode==40)    //下
        {
            if(keydown!='up')
            {
                keydown='down';
                stepX=0;
                stepY=20;
            }
        }
        else if(event.keyCode==37)    //左
        {
            if(keydown!='right')
            {
                keydown='left';
                stepX=-20;
                stepY=0;
            }
        }
        else if(event.keyCode==39)    //右
        {
            if(keydown!='left')
            {
                keydown='right'
                stepX=20;
                stepY=0;
            }
        }
    }
将结束游戏与蛇移动处理完后,开始处理创建食物与判断是否吃掉食物
createFood = function(){    //创建食物
        $(".food").remove();    //首先清理掉开始默认的食物(后面吃掉食物的时候,也会用该函数进行创建)
        isCreate = true    //设置一个状态去判断食物是否创建成功
        do
        {
            food={    //生成食物的位置,用随机数生成(边界值为380,380 上面说过)
                top:Math.round(Math.random()*19)*20,    
                left:Math.round(Math.random()*19)*20
            }
            for(var i=0;i<snakes.length;i++)    //循环蛇身体,让生成的食物不能生成在蛇身上,如果生成成功了,就跳出do while (没有做通关的判断,因为感觉没人能玩到通关)
            {
                if(food.top==snakes[i].top&&food.left==snakes[i].left)
                {    
                    isCreate = false;
                    break;
                }
                else
                {
                    isCreate = true;
                }
            }
        }
        while(!isCreate)
        var foodItem ='<div class="food"></div>'
        $(".bg").append(foodItem);
        $(".food").css({
            top:food.top,
            left:food.left
        })
    }
    eatFood = function(top,left){    //是否吃到食物
        if(top==food.top&&left==food.left)    //如果蛇吃到食物,那么蛇头的坐标与食物坐标重合,然后将食物那个点作为蛇头,append一个蛇元素到游戏里面,再把坐标push到蛇里面,然后创建一个新的食物
        {
            var item = '<div class="snakes"></div>'
            snakes.push({top:top,left:left})
            $(".bg").append(item)
            $(".snakes").last().css({
                top:top,
                left:left
            })
            createFood();
        }
    }
项目源码:
<!DOCTYPE html>
<html>
<head>
    <title>贪吃蛇</title>
    <meta charset="utf-8">
    <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    <style type="text/css" media="screen">
        .bts
        {
            display: flex;
        }
        .bt
        {
            width: 60px;
            height: 24px;
            line-height: 24px;
            font-size: 18px;
            text-align: center;
            background: #ede;
            margin-left: 20px;
        }
        .bg
        {
            width: 400px;
            height: 400px;
            background: #ddd;
            margin-top: 30px;
            position: relative;
        }
        .snakes,.food
        {
            position: absolute;
            width: 18px;
            height: 18px;
            border: solid 1px #444;
        }
        .snakes
        {
            background: red;
        }
        .food
        {
            background: yellow;
        }
    </style>
</head>
<body>
    <div class="bts">
        <div class="start bt" onclick="start()">开始</div>
        <!-- <div class="pause bt" onclick="pause()">暂停</div> -->
    </div>
    <div class="bg">
        
    </div>
</body>
<script type="text/javascript">
    var snakes = [];
    var stepX = 20;
    var stepY = 0;
    var live = false;
    var isPause = false;
    var food = {};
    var keydown = 'right';    //默认方向为右
    start = function(){    //开始
        if(!live)
        {
            stepX = 20;
            stepY = 0;
            keydown = 'right';
            live = true;
            $(".snakes").remove();
            snakes = [];
            drawSnake(5);
            snakeMove();
            createFood();
        }
        isPause = false;
        
    }
    pause = function(){    //暂停
        isPause = true;
    }
    drawSnake = function(num){        //初始化蛇身体
        var item = '<div class="snakes"></div>'
        for(var i=0;i<num;i++)
        {
            $(".bg").append(item)
            $(".snakes").eq(i).css({
                top:0,
                left:20*i
            })
            item1 = {
                top:0,
                left:20*i
            }
            snakes.push(item1)
            //console.log(snakes);
        }
    }
    snakeMove = function(){        //移动蛇
        if(live){
            for(var i=0;i<snakes.length-1;i++)
            {
                $(".snakes").eq(i).css({
                    top:snakes[i+1].top,
                    left:snakes[i+1].left
                })
                snakes[i].top = snakes[i+1].top
                snakes[i].left = snakes[i+1].left
            }
            var first = snakes.length-1
            $(".snakes").eq(first).css({
                    top:snakes[first].top+stepY,
                    left:snakes[first].left+stepX
                })
            snakes[first].top = snakes[first].top+stepY;
            snakes[first].left = snakes[first].left+stepX;
            if(!isLive(snakes[first].top,snakes[first].left))
            {
                live = false;
                alert("游戏结束");
            }
            else
            {
                eatFood(snakes[first].top,snakes[first].left);
                setTimeout("snakeMove()",100);        
            }    
        }
    }
    isLive = function(top,left){
        if(top>380||top<0||left>380||left<0)
        {
            return false;
        }
        else
        {    
            for(var i=0;i<snakes.length-1;i++)
            {
                
                if(top==snakes[i].top&&left==snakes[i].left)
                {
                    return false;
                    break;
                }
            }
            return true;
        }
    }
    createFood = function(){    //创建食物
        $(".food").remove();
        isCreate = true
        do
        {
            food={
                top:Math.round(Math.random()*19)*20,
                left:Math.round(Math.random()*19)*20
            }
            for(var i=0;i<snakes.length;i++)
            {
                if(food.top==snakes[i].top&&food.left==snakes[i].left)
                {    
                    isCreate = false;
                    break;
                }
                else
                {
                    isCreate = true;
                }
            }
        }
        while(!isCreate)
        var foodItem ='<div class="food"></div>'
        $(".bg").append(foodItem);
        $(".food").css({
            top:food.top,
            left:food.left
        })
    }
    eatFood = function(top,left){    //是否吃到食物
        if(top==food.top&&left==food.left)
        {
            var item = '<div class="snakes"></div>'
            snakes.push({top:top,left:left})
            $(".bg").append(item)
            $(".snakes").last().css({
                top:top,
                left:left
            })
            createFood();
        }
    }
    document.onkeydown = function(event) {
        //console.log(event);
        if(event.keyCode==38)    //上
        {    
            if(keydown!='down')
            {
                keydown='up';
                stepX=0;
                stepY=-20;
            }
        }
        else if(event.keyCode==40)    //下
        {
            if(keydown!='up')
            {
                keydown='down';
                stepX=0;
                stepY=20;
            }
        }
        else if(event.keyCode==37)    //左
        {
            if(keydown!='right')
            {
                keydown='left';
                stepX=-20;
                stepY=0;
            }
        }
        else if(event.keyCode==39)    //右
        {
            if(keydown!='left')
            {
                keydown='right'
                stepX=20;
                stepY=0;
            }
        }
    }

</script>
</html>

相关文章:

  • 解析Vue-router相关基础知识及工作原理
  • 订单的业务流程
  • 序列化与反序列化
  • java~@Async异步功能
  • 给Prometheus造假数据的方法
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • java Concurrent包学习笔记(六):Exchanger
  • 理解 Web 中的Session
  • bzoj3295: [Cqoi2011]动态逆序对
  • 北大、微软提出NGra:高效大规模图神经网络计算
  • SQL Server事务日志管理的进阶,第5级:在完全恢复模式下管理日志
  • zabbix3.4 端口和进程监控配置
  • Java 面试之技术框架
  • db cursor
  • Kubeflow 公布 1.0 路线图:2019 年实现 API 稳定
  • [笔记] php常见简单功能及函数
  • 2018一半小结一波
  • Apache Zeppelin在Apache Trafodion上的可视化
  • dva中组件的懒加载
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • git 常用命令
  • go语言学习初探(一)
  • HTTP那些事
  • java取消线程实例
  • JS+CSS实现数字滚动
  • LintCode 31. partitionArray 数组划分
  • React+TypeScript入门
  • Theano - 导数
  • vue 个人积累(使用工具,组件)
  • 编写高质量JavaScript代码之并发
  • 当SetTimeout遇到了字符串
  • 高度不固定时垂直居中
  • 机器学习 vs. 深度学习
  • 记录一下第一次使用npm
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 网页视频流m3u8/ts视频下载
  • 微服务框架lagom
  • 由插件封装引出的一丢丢思考
  • 在Mac OS X上安装 Ruby运行环境
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # Java NIO(一)FileChannel
  • #include到底该写在哪
  • %@ page import=%的用法
  • (10)ATF MMU转换表
  • (C语言)二分查找 超详细
  • (C语言)共用体union的用法举例
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (转)平衡树
  • (轉)JSON.stringify 语法实例讲解
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .netcore 获取appsettings
  • .net反编译工具
  • .NET微信公众号开发-2.0创建自定义菜单